我正在尝试解决一个优化问题,该问题包括找到高维(10+)单调函数的全局最大值(如在各个方向上都是单调的)。这样的约束使得它们用平面切开了搜索空间。
我已经在pyomo
中编写了整个代码,并且正在使用ipopt
求解器。在大多数情况下,我相信它可以成功收敛到全局最优值。但是,如果我对约束进行了一些研究,我发现它有时会收敛到局部最小值。
这看起来像是在勘探与开发之间的权衡。
我已经研究了可以传递给ipopt
的选项,并且列表太长了,以至于我无法理解要使用哪些参数来帮助收敛到全局最小值。
编辑:
解决方案的两个提示:
我的变量曾经被定义为非常无穷的界限,例如bounds=(0,None)
在无限的半线上移动。我对它们施加了两个有限范围。
我现在使用以下多个开头:
opt = SolverFactory('multistart')
results = opt.solve(self.model, solver='ipopt', strategy='midpoint_guess_and_bound')
到目前为止,这使我对融合感到满意。
答案 0 :(得分:2)
对不起,IPOPT是本地求解器。如果您确实想找到全局解决方案,则可以使用诸如Baron,Couenne或Antigone之类的全局求解器。需要进行权衡:全局求解器速度较慢,可能无法解决大问题。
或者,您可以为本地求解器提供一个很好的起点。请注意,在这方面,主动集方法通常比内部点方法更好。有时,多启动算法用于防止不良的局部最优:使用一堆不同的起点。 Pyomo有一些设施可以做到这一点(请参阅文档)。