同一非线性规划模型在GEKKO与LINGO中求解结果不一致的原因
问题描述
我正在使用Python开展优化问题求解工作,考虑到GEKKO支持非线性规划求解,故选用该库搭建模型。为校验求解结果准确性,我在LINGO中构建了完全一致的简易模型,却发现二者返回的同模型求解结果数值不匹配,对应代码如下:
GEKKO 实现代码
from gekko import GEKKO # Initialize Model smplmdl = GEKKO() # Create Variables x = smplmdl.Array(smplmdl.Var, 3, lb = 0) a = smplmdl.Array(smplmdl.Var, 3, lb = 0) Constant_Val = [10, 15, 20] for i in range(3): smplmdl.Equation(x[i]*(sum(a[j] for j in range(3))) == Constant_Val[i]) # Objective Function smplmdl.Obj(sum(x[i] for i in range(3))) smplmdl.options.IMODE = 3 smplmdl.solve() smplmdl.options.OBJFCNVAL print('x:', x) print('a:', a) print(smplmdl.options.OBJFCNVAL)
LINGO 实现代码
Min = x1 + x2 + x3; x1*(a1 + a2 + a3) = 10; x2*(a1 + a2 + a3) = 15; x3*(a1 + a2 + a3) = 20;
问题根因
两个模型返回结果不一致,核心原因是你搭建的模型本身不存在有限的唯一最优解,和求解器本身无关:
- 令
S = a1 + a2 + a3,根据约束可以直接推导出x1=10/S、x2=15/S、x3=20/S,目标函数可化简为45/S。 - 你没有给
a数组设置任何上界约束,S可以取无限大的正值,对应的目标函数可以无限趋近于0,属于典型的无界非线性规划问题。 - 这类无界问题没有确定的全局最优解,GEKKO(默认调用IPOPT求解器)和LINGO的默认初始点、迭代终止逻辑、收敛容差设置都不相同,最终会停在满足各自收敛条件的不同可行点上,自然返回数值不匹配。
- 额外说明:模型里
a1/a2/a3三个变量仅以和的形式出现在约束中,三者的取值本身就有无穷多种组合,哪怕固定S的值,a的解也不唯一。
修正方案
要让两个求解器返回一致的结果,你需要先补全模型定义,消除无界、无穷多解的问题:
- 根据实际业务逻辑给
a变量补充合理的上界约束,比如限制单个a[i]的最大值,或者直接固定S的取值 - 对齐两个求解器的配置:包括变量边界、初始值、收敛精度参数,排除配置差异带来的结果偏差
- 如果业务上
a本身就是无约束的,那这个问题本来就没有确定的最优解,求解器返回值不同是正常现象,不存在结果对错的说法。
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

