AMPL调用IPOPT求解无界问题返回错误最优解且显示“solved”
为什么IPOPT会在你的无界优化问题中返回结果?
我来帮你拆解这个问题:你写的AMPL代码确实定义了一个无界的优化问题——目标函数-(x1²) + x1是开口向下的二次函数,当x1趋向正无穷时,目标值会无限减小(毕竟你是在做最小化),理论上不存在最优解。但IPOPT却返回了结果,这其实是数值优化算法的特性导致的。
先把你的代码和IPOPT的输出片段列出来,方便理解:
你的AMPL代码
var x1 >= 0 ; minimize obj: -(x1^2)+x1;
IPOPT的初始输出片段
This program contains Ipopt, a library for large-scale nonlinear optimization.
Ipopt is released as open source code under the Eclipse Public License (EPL).
For more information visit http://projects.coin-or.org/Ipopt
******************...
背后的原因
IPOPT是基于梯度的数值迭代算法,它不会先从数学上判定问题是否无界,而是一步步迭代寻找更优的解。面对无界问题时,它会不断增大x1的取值,直到触发某个数值终止条件:
- IPOPT会给未显式设置上限的变量默认一个极大的边界(比如1e10),当
x1接近这个值时,算法会停止 - 迭代过程中,目标函数的下降幅度可能低于预设的收敛阈值,算法认为无法再有效改进,从而终止
- 也可能是达到了IPOPT默认的最大迭代次数限制
这种情况下,IPOPT返回的"解"只是它在数值上能推进到的最远点,并不是真正的最优解——因为理论上这个问题根本没有最优解。
解决建议
- 显式设置变量边界:如果你希望得到有意义的结果,给
x1加一个合理的上限,比如:
这时IPOPT会找到这个边界内的最优解(var x1 >= 0 <= 10 ; minimize obj: -(x1^2)+x1;x1=10,目标值-90) - 调整IPOPT参数:你可以修改IPOPT的配置,比如增大最大迭代次数、收紧收敛阈值,或者开启无界检测相关参数(不过对于简单问题,提前做理论分析更高效)
- 先做数学分析:在数值求解前,先判断问题的有界性——像这个二次函数,一眼就能看出最小化无界,这样就不会对IPOPT的返回结果感到困惑了
内容的提问来源于stack exchange,提问作者Mahraz
相关产品推荐
相关产品推荐

