使用GEKKO优化矩阵/向量方程遇稳态IMODE标量值错误求助
解决GEKKO生产组合优化的约束定义问题
核心问题分析
你错误使用了m.axb:它的作用是给已定义的变量添加线性约束,而非创建变量。直接将m.axb的结果赋值给x,会导致后续操作中x被识别为约束对象而非决策变量,触发"This steady-state IMODE only allows scalar values"错误。此外,y是整数变量,不能用Intermediate定义,必须显式声明为整数型GEKKO变量。
修正后的代码实现
import numpy as np from gekko import GEKKO # 假设以下是预定义的numpy数组(根据实际场景替换为你的数据) const_machXparts = np.random.rand(5, 10) # A矩阵:约束行数×变量数 const_Mach_Max_Cap = np.random.rand(5) # b向量:约束上限 const_FP_Wt_Matrix = np.random.rand(10) # C向量:变量权重 # 初始化GEKKO模型 m = GEKKO(remote=False) # 1. 定义决策变量x:一维数组,非负约束 x = m.Array(m.Var, const_machXparts.shape[1], lb=0) # 2. 添加Ax < b约束:传入已定义的变量x,m.axb自动生成约束 m.axb(const_machXparts, const_Mach_Max_Cap, x, etype='<') # 3. 定义整数变量y,显式添加Cx = y的等式约束 y = m.Var(lb=0, integer=True) m.Equation(y == const_FP_Wt_Matrix @ x) # 4. 设置目标函数并求解 m.Maximize(y) m.solve(disp=True) # 输出结果 print("最优x值:", [xi.value[0] for xi in x]) print("最优y值:", y.value[0])
关键修正点说明
- 变量定义优先级:必须先通过
m.Array(m.Var, ...)创建决策变量数组x,确保每个元素是GEKKO的Var对象,而非约束对象。 - m.axb的正确用法:调用时需传入已定义的变量
x,函数内部自动添加Ax < b约束,无需接收返回值。 - 整数变量声明:
y是整数变量,需在定义时指定integer=True,并通过m.Equation建立Cx = y的等式约束——Intermediate仅用于中间计算,不支持整数属性。 - IMODE设置:稳态优化默认
IMODE=3即可,无需修改为其他值。
解决"int have no length"错误
之前尝试先定义x再传入m.axb时出现的该错误,大概率是因为len(part_matrix_.columns)的取值不符合预期(比如未正确获取列数)。建议直接通过const_machXparts.shape[1]获取变量维度,确保与A矩阵的列数匹配。
内容的提问来源于stack exchange,提问作者Hesham M Omar
相关产品推荐
相关产品推荐

