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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:29:58