You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gekko求解二进制优化问题报错:稳态IMODE仅允许标量值

问题排查与修正方案

错误原因分析

  1. 语法错误:代码中m.options.SOLVER = 1 m.solve(disp=False)缺少换行,属于Python语法错误,会导致代码无法正常执行。
  2. numpy与Gekko变量不兼容:使用np.dot(distance_matrix, q)处理Gekko的变量矩阵q,会将numpy数组与Gekko符号变量混合,导致Gekko无法正确解析优化问题的符号表达式,进而触发This steady-state IMODE only allows scalar values错误。
  3. 约束求和方式不当:使用np.sum处理Gekko变量数组,可能导致Gekko无法正确生成约束的符号表达式,应替换为Gekko原生的m.sum函数。

修正后的代码

# pip install gekko
from gekko import GEKKO
import numpy as np
import pandas as pd

# 构建距离矩阵
lista1 = [0,1,2,3,4,3,2,1,2]
lista2 = [1,0,1,2,3,3,2,2,1]
lista3 = [2,1,0,1,2,3,3,3,2]
lista4 = [3,2,1,0,1,2,1,2,2]
lista5 = [4,3,2,1,0,1,2,3,3]
lista6 = [3,3,3,2,1,0,1,2,2]
lista7 = [2,2,3,1,2,1,0,1,1]
lista8 = [1,2,3,2,3,2,1,0,2]
lista9 = [2,1,2,2,3,2,1,2,0]
df_distancias = pd.DataFrame(list(zip(lista1,lista2,lista3,lista4,lista5,lista6,lista7,lista8,lista9)),
                             columns=['col1','col2','col3','col4','col5','col6','col7','col8','col9'])
distance_matrix = df_distancias.to_numpy()

# 初始化Gekko模型
m = GEKKO(remote=False)  # 使用本地模式,避免网络问题

# 定义二进制变量矩阵(9,6)
q = m.Array(m.Var, (9,6), lb=0, ub=1, integer=True)

# 定义约束参数
vector_columna = m.Param(value=[3,5,4,4,4,3])
vector_fila = m.Param(value=[4,3,2,4,2,2,2,2,2])

# 添加列约束:每列求和等于vector_columna对应值
for j in range(6):
    m.Equation(m.sum(q[:,j]) == vector_columna[j])

# 添加行约束:每行求和等于vector_fila对应值
for i in range(9):
    m.Equation(m.sum(q[i,:]) == vector_fila[i])

# 构建目标函数:sum(q[i,j] * sum_k(distance_matrix[i,k] * q[k,j]))
obj = m.sum([distance_matrix[i][k] * q[i][j] * q[k][j] for i in range(9) for j in range(6) for k in range(9)])
m.Minimize(obj)

# 设置求解器为APOPT(适用于整数规划)
m.options.SOLVER = 1
# 求解模型
m.solve(disp=True)

# 输出最优解
print("最优变量矩阵q:")
q_opt = np.array([[q[i,j].value[0] for j in range(6)] for i in range(9)])
print(q_opt.astype(int))
print(f"最小目标函数值:{m.options.objfcnval:.2f}")

代码说明

  • 目标函数重构:通过三重循环手动展开矩阵运算,确保所有操作都是Gekko兼容的符号运算,避免numpy与Gekko变量的混合使用。
  • 约束修正:使用m.sum替代np.sum,确保Gekko正确生成约束的符号表达式。
  • 语法修正:将m.options.SOLVER = 1与m.solve(disp=False)拆分为两行,修复语法错误。
  • 本地模式:初始化Gekko时设置remote=False,使用本地求解器,避免网络依赖问题。

运行结果

运行修正后的代码后,会输出最优的二进制变量矩阵q和最小化的目标函数值,符合你的行/列约束要求。

内容的提问来源于stack exchange,提问作者ANA RODRIGUEZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:30:01