Pyomo-IPOPT:求解器属于局部极小值,如何避免这种情况?

时间:2019-03-04 00:26:55

标签: optimization pyomo ipopt

我正在尝试解决一个优化问题,该问题包括找到高维(10+)单调函数的全局最大值(如在各个方向上都是单调的)。这样的约束使得它们用平面切开了搜索空间。

我已经在pyomo中编写了整个代码,并且正在使用ipopt求解器。在大多数情况下,我相信它可以成功收敛到全局最优值。但是,如果我对约束进行了一些研究,我发现它有时会收敛到局部最小值。

这看起来像是在勘探与开发之间的权衡。 我已经研究了可以传递给ipopt的选项,并且列表太长了,以至于我无法理解要使用哪些参数来帮助收敛到全局最小值。

编辑:

解决方案的两个提示:

  • 我的变量曾经被定义为非常无穷的界限,例如bounds=(0,None)在无限的半线上移动。我对它们施加了两个有限范围。

  • 我现在使用以下多个开头:

    opt = SolverFactory('multistart')
    results = opt.solve(self.model, solver='ipopt', strategy='midpoint_guess_and_bound')
    

到目前为止,这使我对融合感到满意。

1 个答案:

答案 0 :(得分:2)

对不起,IPOPT是本地求解器。如果您确实想找到全局解决方案,则可以使用诸如Baron,Couenne或Antigone之类的全局求解器。需要进行权衡:全局求解器速度较慢,可能无法解决大问题。

或者,您可以为本地求解器提供一个很好的起点。请注意,在这方面,主动集方法通常比内部点方法更好。有时,多启动算法用于防止不良的局部最优:使用一堆不同的起点。 Pyomo有一些设施可以做到这一点(请参阅文档)。