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')
到目前为止,这让我对融合感到满意。
解决方案
抱歉,IPOPT 是本地求解器。如果您真的想找到全局解,可以使用全局求解器,例如 Baron、Couenne 或 Antigone。有一个权衡:全局求解器速度较慢,可能不适用于大问题。
或者,您可以通过良好的初始点帮助本地求解器。请注意,在这方面,活动集方法通常比内点方法更好。有时使用多启动算法来防止糟糕的局部最优:使用一堆不同的起点。Pyomo 有一些工具可以做到这一点(参见文档)。
推荐阅读
- javascript - 未捕获的 TypeError:CanvasSpliner 不是构造函数
- python - 使用 for 循环与列表推导来优化代码
- c# - 如何将嵌套列表中的值复制到新列表中
- tfs - 如何使用 TfvcChangesetRef 获取变更集中的文件
- javascript - Javascript 中的 3D Thinplate 插值“rbf 无法使用给定的中心编译。/nCenters 必须是唯一的:/”
- phpspreadsheet - 如何在phpspreadsheet中设置页面方向(横向或纵向)
- vb.net - 使用 vb.net 将 txt 文件从一个文件夹复制到另一个文件夹时出现错误
- f# - 为什么在静态解析类型参数 (SRTP) 表达式 F# 中使用“或”?
- php - 无法将 php 7.2 连接到 mysql 8.0 服务器请求客户端未知的身份验证方法 [caching_sha2_password]
- python - 将 python 与 openssl 的自定义构建一起使用