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

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]]}")

关键修正点

  1. 移除所有m.Const的错误使用,直接用普通变量累加决策变量,GEKKO会自动识别这些为模型的有效表达式。
  2. 使用m.sum()简化累加逻辑,避免手动循环的冗余和潜在错误。
  3. 直接构建目标函数表达式,确保决策变量与目标逻辑正确绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:37