是否有适用于 Python 的高质量非线性规划求解器?

计算科学 Python 优化 非线性规划
2021-12-05 19:22:18

我有几个具有挑战性的非凸全局优化问题要解决。目前我使用MATLAB 的优化工具箱(特别是fmincon()使用 algorithm= 'sqp'),非常有效但是,我的大部分代码都是用 Python 编写的,我也很想在 Python 中进行优化。有没有可以与之竞争的具有 Python 绑定的 NLP 求解器fmincon()它必须

  • 能够处理非线性等式和不等式约束
  • 不要求用户提供雅可比。

如果它不能保证全局最优(fmincon()不)也没关系。我正在寻找即使对于具有挑战性的问题也能稳健地收敛到局部最优值的东西,即使它比fmincon().

我尝试了几个可通过 OpenOpt 获得的求解器,发现它们不如 MATLAB 的fmincon/sqp.

只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标只是改变语言,以便拥有更精简的工作流程。

Geoff 指出问题的某些特征可能是相关的。他们是:

  • 10-400 个决策变量
  • 4-100 多项式等式约束(多项式度数范围从 1 到大约 8)
  • 有理不等式约束的数量大约等于决策变量数量的两倍
  • 目标函数是决策变量之一

等式约束的雅可比是密集的,不等式约束的雅可比也是密集的。

4个回答

我在一个对混合整数和非凸问题进行全局优化的实验室工作。我对开源优化求解器的经验是,更好的求解器通常是用编译语言编写的,与商业优化包相比,它们的表现不佳。

如果您可以将您的问题表述为一个显式方程组并且需要一个免费的求解器,那么您最好的选择可能是 IPOPT,正如 Aron 所说。其他免费求解器可以在COIN-OR网站上找到。据我所知,非线性求解器没有开发人员提供的 Python 绑定;您找到的任何绑定都是第三方的。为了获得好的解决方案,您还必须将您在适当的随机全局优化启发式或确定性全局优化算法(如分支定界)中找到的任何非线性凸求解器包装起来。或者,您可以使用 Bonmin 或 Couenne,它们都是确定性非凸优化求解器,与最先进的求解器BARON相比,它们的性能更好。

如果您可以购买商业优化求解器,您可以考虑查看GAMS建模语言,其中包括几个非线性优化求解器。特别值得一提的是求解器 CONOPT、SNOPT 和 BARON 的接口。(CONOPT 和 SNOPT 是凸求解器。)我过去使用的一个笨拙的解决方案是使用 Fortran(或 Matlab)语言绑定到 GAMS 来编写 GAMS 文件并从 Fortran(或 Matlab)调用 GAMS 来计算优化问题的解决方案。GAMS 具有 Python 语言绑定,如果有任何问题,他们的支持人员反应迅速,愿意提供帮助。(免责声明:我与 GAMS 没有从属关系,但我的实验室确实拥有 GAMS 许可证。)商业求解器应该不比fmincon; 事实上,如果他们没有好很多,我会感到惊讶。如果您的问题规模足够小,那么您甚至可能不需要购买 GAMS 许可证和求解器的许可证,因为可以从他们的网站下载 GAMS 的评估副本。否则,您可能需要决定与 GAMS 许可证一起购买哪些求解器。值得注意的是,BARON 需要一个混合整数线性规划求解器,并且两个最好的混合整数线性规划求解器 CPLEX 和 GUROBI 的许可证对学者来说是免费的,所以你可能只需要购买 GAMS 接口而不是比接口和求解器许可证,可以为您节省不少钱。

这一点值得重复:对于我上面提到的任何确定性非凸优化求解器,您需要能够将模型表述为一组明确的方程。否则,非凸优化算法将无法工作,因为它们都依赖于符号分析来为类分支定界算法构建凸松弛。

更新:一开始我没有想到的一个想法是,您还可以使用tao4pypetsc4py调用高级优化工具包 ( TAO ) 和PETSc,这将具有更容易并行化的潜在附加好处,并利用对 PETSc 的熟悉和ACTS工具。

更新 #2:根据您提到的其他信息,顺序二次规划 (SQP) 方法将是您最好的选择。SQP 方法通常被认为比内点方法更稳健,但具有需要密集线性求解的缺点。由于您更关心稳健性而不是速度,因此 SQP 将是您的最佳选择。我找不到一个用 Python 编写的好的 SQP 求解器(显然,Argonne 的 Sven Leyffer 在本技术报告中也找不到)。我猜想在 SciPy 和 OpenOpt 等包中实现的算法具有实现的一些 SQP 算法的基本框架,但没有更高级代码用来克服收敛问题的专门启发式算法。你可以试试NLopt,由麻省理工学院的史蒂文约翰逊撰写。我对它没有寄予厚望,因为据我所知,它没有任何声誉,但 Steven Johnson 是一个编写优秀软件的聪明人(毕竟,他确实与人合写了 FFTW)。它确实实现了一个 SQP 版本;如果是好软件,请告诉我。

我希望 TAO 能够提供约束优化求解器的方式,但事实并非如此。您当然可以使用他们所拥有的东西来建立一个;他们那里有很多组件。但是,正如您所指出的那样,您需要做更多的工作,如果您遇到这种麻烦,您还不如成为一名 TAO 开发人员。

有了这些附加信息,您更有可能从 Python 调用 GAMS 获得更好的结果(如果这是一个选项),或者尝试修补 IPOPT Python 接口。由于 IPOPT 使用内点法,它不会那么健壮,但也许 Andreas 的内点法实现比 Matlab 的 SQP 实现要好得多,在这种情况下,您可能根本不会牺牲健壮性。您必须进行一些案例研究才能确定。

您已经知道将有理不等式约束重新表述为多项式不等式约束的技巧(在您的书中);这将有助于 BARON 和其他一些非凸求解器的原因是它可以使用项分析来生成额外的有效不等式,它可以用作削减来改进和加速求解器收敛。

排除 GAMS Python 绑定和 IPOPT 的 Python 接口,答案是否定的,目前还没有任何高质量的 Python 非线性规划求解器。也许@Dominique 会用 NLPy 改变这一点。

更新#3:寻找基于 Python 的求解器的更多尝试产生了PyGMO,它是一组与 PaGMO 的 Python 绑定,PaGMO 是一个基于 C++ 的全局多目标优化求解器。尽管它是为多目标优化而创建的,但它也可用于单目标非线性规划,并具有与 IPOPT 和 SNOPT 以及其他求解器的 Python 接口。它是在欧洲航天局内部开发的,所以希望它背后有一个社区。它也是最近发布的(2011 年 11 月 24 日)。

fmincon()正如您所提到的,它采用了几种在非线性优化中众所周知的策略,这些策略试图找到局部最小值,而不考虑是否找到了全局最优值。如果你对此没意见,那么我认为你已经正确地表达了这个问题(非线性优化)。

我所知道的一般非线性优化的最佳包是IPOPT [1]。显然Matthew Xu 维护了一组与 IPOPT 的 Python 绑定,所以这可能是一个开始的地方。

[1]:Andreas Wachter 是私人朋友,所以我可能有点偏颇。

APM 蟒蛇

更新:查看我们刚刚发布的新GEKKO 包

APM Python是一个免费的优化工具箱,具有与 APOPT、BPOPT、IPOPT 和其他求解器的接口。它为求解器提供第一(Jacobian)和第二(Hessian)信息,并提供一个可选的网络界面来查看结果。APM Python 客户端使用 pip 安装:

 pip install APMonitor

它也可以安装在 Python 脚本中:

try:
    from APMonitor.apm import *
except:
    # Automatically install APMonitor
    import pip
    pip.main(['install','APMonitor'])
    from APMonitor.apm import *

我们做了几个基准测试,发现 APPT(活动集方法)和 IPOPT(内点法)的组合可以解决很大比例的基准问题。下载 zip 文件中包含许多示例问题。您可能想要开始的问题是 Hock Schittkowski #71 问题。它是最简单的示例,演示了如何解决约束优化问题。

有一个浏览器界面和一个 Python / MATLAB API。Python 的 API 是一个脚本 (apm.py),可从 apmonitor.com 主页下载。一旦脚本被加载到 Python 代码中,它就可以解决以下问题:

  • 非线性方程
  • 混合整数非线性规划
  • 微分和代数方程
  • 最小二乘模型拟合
  • 移动水平估计
  • 非线性模型预测控制
  • 等等。

对于新用户,APM Python 软件有一个 Google Groups 论坛,用户可以在其中发布问题。有一些网络研讨会展示了运筹学和工程中的优化问题。

下面是一个优化问题的示例 (hs71.apm)。

Model
  Variables
    x[1] = 1, >=1, <=5
    x[2] = 5, >=1, <=5
    x[3] = 5, >=1, <=5
    x[4] = 1, >=1, <=5
  End Variables

  Equations
    x[1] * x[2] * x[3] * x[4] > 25
    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40

    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]
  End Equations
End Model

使用以下 Python 脚本解决了优化问题:

from APMonitor.apm import *
server = 'http://byu.apmonitor.com'

# Application name
app = 'eqn'

# Clear previous application
apm(server,app,'clear all')

# Load model file
apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)
apm_option(server,app,'nlc.solver',3)

# Solve on APM server
solver_output = apm(server,app,'solve')

# Display solver output
print(solver_output)

# Retrieve results
results = apm_sol(server,app)

# Display results
print('--- Results of the Optimization Problem ---')
print(results)

# Display Results in Web Viewer 
url = apm_var(server,app)
print("Opened Web Viewer: " + url)

APM Python 是用于优化的免费网络服务。优化问题在远程服务器上解决,结果返回到本地 Python 脚本。APMonitor 本地服务器也可供下载,因此不需要 Internet 连接(下载服务器)。我们最近为 MATLAB 和 Python 添加了并行处理支持。Python 模块与 Python 2.7 或 Python 3+ 兼容。

尽管这并不能完全回答您的问题,但我为非线性编程编写了一个 Python 包,名为 NLPy。可以从https://github.com/dpo/nlpy获取最新版本

我必须强调 NLPy 是研究级的,其中包含的求解器绝不像 IPOPT 等更老练的代码那样强大。此外,他们目前要求提供雅可比矩阵。话虽如此,NLPy 的重点是为研究人员提供所需的工具,以便他们在需要时组装自定义求解器。无论如何,如果您试一试,我很乐意离线听到您的评论。您可能还会发现相关软件包https://github.com/dpo/pykrylovhttps://github.com/dpo/pyorder很有用。目前,肯定缺乏 NLPy 的文档。其他两个应该是合理的。