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)开始搜索,会优先收敛到离初始点更近的局部最优解,而非全局最优。
解决方法
- 手动指定初始点
直接将变量初始值设为下界,引导优化器从全局最优所在区域开始搜索:
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会直接收敛到全局最优解。
- 使用全局优化求解器
切换到GEKKO的差分进化(DE)全局求解器,它能遍历搜索空间找到全局最优:
m.options.SOLVER = 7 # 启用差分进化全局优化器 m.solve(disp=False)
- 启用APOPT全局搜索模式
开启APOPT的全局搜索选项(效果略逊于专门的全局求解器):
m.options.SOLVER = 1 m.options.APOPT = 1 m.options.GLOBAL = 1 # 开启全局搜索 m.solve(disp=False)
内容的提问来源于stack exchange,提问作者kakben
相关产品推荐
相关产品推荐

