GEKKO(Python)优化求解结果异常问题咨询
问题原因与解决方案
问题1:results.json内容与求解输出不匹配的原因
你在构建约束和目标函数时错误使用了m.Const来累加决策变量。m.Const是固定值常量,无法与可变的m.Var类型变量(如lv、av)进行动态运算。这种错误会导致GEKKO内部生成的模型逻辑与你预期的完全不符,求解器实际处理的是一个定义混乱的模型,最终results.json里的变量自然无法匹配目标计算逻辑。
问题2:得到错误负目标值的原因
同样因为错误使用m.Const定义obj_b和obj_u,你的目标函数实际上没有正确关联任何决策变量。GEKKO无法识别你想要的log(1+x)累加逻辑,反而因模型定义错误,求解器默认处理了一个无效的目标表达式,最终得到不符合预期的负结果。
修正后的代码
import numpy as np from gekko import GEKKO import matplotlib.pyplot as plt # 初始化模型 m = GEKKO() m.options.solver = 1 # 使用APOPT求解器(适配整数规划) # 随机种子 np.random.seed(0) max_r = 5 min_r = 2 b = 2 b_r = {} for i in range(b): b_r[i] = np.random.randint(low=min_r, high=max_r) u = 2 br = np.random.random((b, u)) # 定义决策变量 lv = m.Array(m.Var, (b, u), lb=0, ub=1, integer=True) av = {} for i in range(b): av[i] = m.Array(m.Var, (b_r[i], u), lb=0, ub=1, integer=True) # 约束条件 # 每个u对应的lv总和≤1 for i in range(u): lv_sum = m.sum([lv[j][i] for j in range(b)]) m.Equation(lv_sum <= 1) # 每个(i,j)对应的av总和≤1 for i in range(b): for j in range(b_r[i]): av_sum = m.sum([av[i][j][k] for k in range(u)]) m.Equation(av_sum <= 1) # 目标函数 obj_u = 0 for i in range(u): obj_b = 0 for j in range(b): for k in range(b_r[j]): obj_b += lv[j][i] * av[j][k][i] * br[j][i] obj_u += m.log(1 + obj_b) # 最大化目标 m.Maximize(obj_u) # 设置求解模式 m.options.IMODE = 3 # 稳态优化 # 求解并打印结果 m.solve(disp=True) print("目标值:", obj_u.value[0]) print("\nlv变量取值:") for j in range(b): print(f"lv[{j}]: {[v.value[0] for v in lv[j]]}") print("\nav变量取值:") for i in range(b): for j in range(b_r[i]): print(f"av[{i}][{j}]: {[v.value[0] for v in av[i][j]]}")
关键修正点
- 移除所有
m.Const的错误使用,直接用普通变量累加决策变量,GEKKO会自动识别这些为模型的有效表达式。 - 使用
m.sum()简化累加逻辑,避免手动循环的冗余和潜在错误。 - 直接构建目标函数表达式,确保决策变量与目标逻辑正确绑定。
内容的提问来源于stack exchange,提问作者DuttaA
相关产品推荐
相关产品推荐

