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

GEKKO优化器APOPT求解器收敛至非最优点问题咨询

问题

在Python中使用GEKKO优化包,因问题有时包含整数变量,设置以下参数求解稳态混合整数问题(APOPT):

m.options.IMODE = 3
m.options.SOLVER = 1

但优化器得到的解并非最优,最小复现示例如下:

from gekko import GEKKO

m = GEKKO(remote=False)
# 定义目标函数
def obj(x1, x2):
    return x1*0.04824647331436083 + x2*0.1359023029124411 + x1*x2*(0.5659570743890336)

# 定义变量
x1 = m.Var(lb=-0.7280376309420935, ub=0.2719623690579065)
x2 = m.Var(lb=-0.8912733608888134, ub=0.10872663911118663)

u = m.Intermediate(obj(x1,x2))
m.Maximize(u)

# 求解问题
m.options.SOLVER = 'APOPT'
m.solve(disp=False)

# 打印结果
print(f'x1: {x1.value[0]}')
print(f'x2: {x2.value[0]}')
print(f'u: {u.value[0]}')

代码输出:

x1: 0.27196236906
x2: 0.10872663911
u: 0.044632524297

但取以下解时:

x1 = -0.7280376309420935
x2 = -0.8912733608888134
obj(x1, x2)

得到的目标值为0.2109871851434535,明显更优。疑问:为何APOPT求解器会收敛至非最优点?

分析与解决

核心原因

你的目标函数是二次非线性函数,在给定变量上下界范围内存在两个局部最优解:一个在变量上界(x1=0.272, x2=0.109),另一个在变量下界(x1=-0.728, x2=-0.891)。

APOPT属于梯度类优化器,默认从变量初始值(GEKKO中m.Var()默认初始值为0)开始搜索,会优先收敛到离初始点更近的局部最优解,而非全局最优。

解决方法

  1. 手动指定初始点
    直接将变量初始值设为下界,引导优化器从全局最优所在区域开始搜索:
x1 = m.Var(lb=-0.7280376309420935, ub=0.2719623690579065, value=-0.7280376309420935)
x2 = m.Var(lb=-0.8912733608888134, ub=0.10872663911118663, value=-0.8912733608888134)

修改后APOPT会直接收敛到全局最优解。

  1. 使用全局优化求解器
    切换到GEKKO的差分进化(DE)全局求解器,它能遍历搜索空间找到全局最优:
m.options.SOLVER = 7  # 启用差分进化全局优化器
m.solve(disp=False)
  1. 启用APOPT全局搜索模式
    开启APOPT的全局搜索选项(效果略逊于专门的全局求解器):
m.options.SOLVER = 1
m.options.APOPT = 1
m.options.GLOBAL = 1  # 开启全局搜索
m.solve(disp=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:05:20