Gekko求解二进制优化问题报错:稳态IMODE仅允许标量值
问题排查与修正方案
错误原因分析
- 语法错误:代码中
m.options.SOLVER = 1 m.solve(disp=False)缺少换行,属于Python语法错误,会导致代码无法正常执行。 - numpy与Gekko变量不兼容:使用
np.dot(distance_matrix, q)处理Gekko的变量矩阵q,会将numpy数组与Gekko符号变量混合,导致Gekko无法正确解析优化问题的符号表达式,进而触发This steady-state IMODE only allows scalar values错误。 - 约束求和方式不当:使用
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
相关产品推荐
相关产品推荐

