Pyomo-IPOPT:求解器陷入局部最小值,如何避免?
Pyomo-IPOPT: solver falls into local minima, how to avoid that?
我正在尝试解决一个优化问题,该问题包括寻找高维 (10+) 单调函数(如在每个方向上的单调函数)的全局最大值。这些约束使得它们用平面减少搜索 space。
我已经在 pyomo
中编写了整个代码,并且我正在使用 ipopt
求解器。在大多数情况下,我相信它会成功收敛到全局最优。但是,如果我稍微调整一下约束条件,我会发现它有时会收敛到局部最小值。
这看起来像是一种探索与开发的权衡。
我研究了可以传递给 ipopt
的选项,但列表太长了,我无法理解要使用哪些参数来帮助收敛到全局最小值。
编辑:
解决方案的两个提示:
我的变量曾经被定义为非常无限的边界,例如bounds=(0,None)
在无限半线上移动。我对它们强制执行了两个有限界限。
我现在使用多个开头:
opt = SolverFactory('multistart')
results = opt.solve(self.model, solver='ipopt', strategy='midpoint_guess_and_bound')
到目前为止,这让我对收敛感到满意。
抱歉,IPOPT 是本地求解器。如果您真的想找到全局解决方案,可以使用全局求解器,例如 Baron、Couenne 或 Antigone。有一个权衡:全局求解器速度较慢,可能不适用于大问题。
或者,您可以帮助本地求解器找到一个好的初始点。请注意,在这方面,活动集方法通常比内点方法更好。有时使用多起点算法来防止局部最优:使用一堆不同的起点。 Pyomo 有一些工具可以做到这一点(请参阅文档)。
我正在尝试解决一个优化问题,该问题包括寻找高维 (10+) 单调函数(如在每个方向上的单调函数)的全局最大值。这些约束使得它们用平面减少搜索 space。
我已经在 pyomo
中编写了整个代码,并且我正在使用 ipopt
求解器。在大多数情况下,我相信它会成功收敛到全局最优。但是,如果我稍微调整一下约束条件,我会发现它有时会收敛到局部最小值。
这看起来像是一种探索与开发的权衡。
我研究了可以传递给 ipopt
的选项,但列表太长了,我无法理解要使用哪些参数来帮助收敛到全局最小值。
编辑:
解决方案的两个提示:
我的变量曾经被定义为非常无限的边界,例如
bounds=(0,None)
在无限半线上移动。我对它们强制执行了两个有限界限。我现在使用多个开头:
opt = SolverFactory('multistart') results = opt.solve(self.model, solver='ipopt', strategy='midpoint_guess_and_bound')
到目前为止,这让我对收敛感到满意。
抱歉,IPOPT 是本地求解器。如果您真的想找到全局解决方案,可以使用全局求解器,例如 Baron、Couenne 或 Antigone。有一个权衡:全局求解器速度较慢,可能不适用于大问题。
或者,您可以帮助本地求解器找到一个好的初始点。请注意,在这方面,活动集方法通常比内点方法更好。有时使用多起点算法来防止局部最优:使用一堆不同的起点。 Pyomo 有一些工具可以做到这一点(请参阅文档)。