【问题标题】:Pyomo-IPOPT: solver falls into local minima, how to avoid that?Pyomo-IPOPT:求解器陷入局部最小值,如何避免?
【发布时间】:2019-07-25 06:57:47
【问题描述】:

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

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

这看起来像是一种探索与开发的权衡。 我查看了可以传递给 ipopt 的选项,但列表太长了,以至于我无法理解要使用哪些参数来帮助收敛到全局最小值。

编辑:

解决方案的两个提示:

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

  • 我现在使用多个开头:

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

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

【问题讨论】:

  • 只是一个问题。您如何在 Pyomo(或其他数字)中检查解决方案是否收敛到局部或全局最优?
  • 在我的具体情况下,我知道使用 Gurobi 解决它的全局最小值,这与 IP-OPT 相比非常慢。

标签: optimization pyomo ipopt


【解决方案1】:

抱歉,IPOPT 是本地求解器。如果您真的想找到全局解,可以使用全局求解器,例如 Baron、Couenne 或 Antigone。需要权衡:全局求解器速度较慢,可能无法解决大问题。

或者,您可以帮助本地求解器获得良好的初始点。请注意,在这方面,活动集方法通常比内点方法更好。有时使用多启动算法来防止糟糕的局部最优:使用一堆不同的起点。 Pyomo 有一些工具可以做到这一点(请参阅文档)。

【讨论】:

  • 感谢您的意见。本地求解器意味着它不做任何探索?!它只会从起点下山?
  • 感谢建议的替代求解器。我尝试了 Couenne,但对于这种情况来说太慢了,Baron 和 Antigone 似乎需要付费许可证。看来我又开始使用 IPOPT 了。您是否有一个通过不同起点的工作示例?!
  • 在此处查看有关使用 Pyomo 中提供的多启动求解器功能的文档:pyomo.readthedocs.io/en/latest/contributed_packages/…
  • @BethanyNicholson 非常感谢您的建议。我一直在玩这个多启动。计算时间是有成本的,但最终收敛是可靠的!
猜你喜欢
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2020-08-02
  • 2023-03-14
  • 2023-01-18
  • 2019-02-25
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多