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


77

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

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

如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()

我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp

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

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

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

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


2
David,不幸的是,这现在是一个完全不同的问题:)局部最小值与全局值之间的差异是潜在的无限数量的博士的主题,根据无免费午餐定理,任何求解器都可以解决一个一般的全局优化问题。可证明对另一个人不利。我可能建议您先考虑公式选项(是否存在混合整数形式?是否存在凸近似?)
Aron Ahmadia 2011年

大卫,阿伦说得很对。就获得非凸NLP的数值解而言,公式化绝对是关键,更不用说快速获得良好的解了。可能值得考虑选择其他公式,然后使用这些公式的结构来指导您选择求解器。使用可以在问题中引发的任何结构的求解器(例如稀疏性,多阶段随机编程,使用约束来生成割据)是获得良好解决方案的关键。
Geoff Oxberry

@DavidKetcheson:既然您有要使用的配方,您至少可以对配方的特性发表评论吗?拉格朗日的雅可比是密集的还是稀疏的?它大约有多少个变量?推荐使用实现不适合您的问题的解决方法的软件对您不利,这是人们首先谈论配方的唯一原因。
Geoff Oxberry

coopr使用asl:ipopt提供与ipopt的绑定
denfromufa 2014年

Answers:


32

fmincon()正如您所提到的,它采用了非线性优化中众所周知的几种策略,这些策略试图查找局部最小值,而不必过多考虑是否已找到全局最优值。如果您对此表示满意,那么我认为您已正确说明了该问题(非线性优化)。

对于一般的非线性优化,我知道的最好的软件包是IPOPT [1]。显然,Matthew Xu维护了一组与IPOPT的Python绑定,因此这可能是一个起点。

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


Andreas做得很好,但是他的求解器也需要Jacobian矩阵信息(或者至少是Jacobian矩阵的稀疏性信息)。当您说您想要一个不需要雅可比矩阵的求解器时,您的意思是您想要一个不需要解析地提供雅可比矩阵的求解器(这样一来,有限差分计算就足够了)还是您想要?一个根本不需要雅可比矩阵信息的求解器(这将使您局限于无导数的优化方法)?
Geoff Oxberry

接得好。我的意思是前者;我已经更新了问题。
David Ketcheson 2011年

我终于可以使用sage.openopt.org将IPOPT应用于我的问题。这很棒!
David Ketcheson 2012年

4
今天(2017年),您还可以在Python槽Pyomo中使用IPOPT。您将获得针对jacobian和hessian的代数建模语言和自动比较功能。
安东内洛

@Antonello正确的链接是pyomo.org
Moonwalker

37

我在一个实验室进行混合整数和非凸问题的全局优化。我在开放源代码优化解决方案上的经验是,更好的解决方案通常是用编译语言编写的,与商业优化软件包相比,效果不佳。

如果您可以将问题表达为一个明确的方程组,并且需要一个免费的求解器,那么您最好的选择就是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(基于C ++的全局多目标优化求解器)的一组Python绑定。尽管它是为多目标优化而创建的,但是它也可以用于单目标非线性编程,并且具有到IPOPT和SNOPT的Python接口,以及其他求解器。它是在欧洲航天局内部开发的,因此希望背后有一个社区。它也相对较新地发布(2011年11月24日)。


请注意PaGMO是GPL许可
denfromufa

14

APM Python

更新:请参阅我们刚刚发布的新GEKKO软件包

APM Python是一个免费的优化工具箱,具有与APOPT,BPOPT,IPOPT和其他求解器的接口。它向求解器提供第一(Jacobian)和第二(Hessian)信息,并提供可选的Web界面来查看结果。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 *

我们已经进行了几次基准测试,发现APOPT(主动集方法)和IPOPT(内点方法)的组合可以解决很大一部分基准问题。下载zip文件包含许多示例问题。您可能最想开始的是Hock Schittkowski#71问题。这是最简单的示例,并演示了如何解决约束优化问题。

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

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

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

下面是一个优化问题的示例(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是用于优化的免费Web服务。优化问题在远程服务器上解决,结果返回到本地Python脚本。还可以下载APMonitor本地服务器,因此不需要Internet连接(下载服务器)。我们最近添加了对MATLAB和Python的并行处理支持。Python模块与Python 2.7或Python 3+兼容。


2
约翰,我看到APM Python是免费提供的,但我无法从该软件包中找出它是否包含在本地使用的求解器,或者是否需要连接到AP Monitor网站才能进行计算。我很好奇。
阿隆·艾玛迪亚

3
Aron,MATLAB或Python脚本要求与APM服务器建立Internet连接以解决优化问题。这具有许多优点和缺点。从积极的方面看,用于优化的Web服务允许跨平台兼容性,对某些商业求解器的免费访问以及对用户透明的软件升级。不利的一面是,APM不像某些开源替代方案那样灵活,而是为工业用户设计的,他们喜欢优化应用程序的交钥匙解决方案。
约翰·海登格伦

@JohnHedengren我在MATLAB中有一些预计算,使用另一个库来构造优化问题本身,尤其是约束条件涉及这些外部调用。您认为APM是否仍然适合此目的?
gpavanb

我认为通用术语是黑盒优化。
gpavanb

@gpavanb APMonitor软件包要求方程式以建模语言编写。加载外部代码的一个选项是创建一个提供残差和至少分析一阶导数的对象。我们通常使用F90对这些对象进行编码,以提高速度,例如此处列出的对象:apmonitor.com/wiki/index.php/Main/Objects 我不认为APMonitor对于具有黑盒优化功能的应用程序不是最佳选择。
约翰·海登格伦

7

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

我必须强调,NLPy是研究级的,所包含的求解器绝对不像IPOPT这样经验丰富的代码强大。此外,他们目前要求提供雅各宾派。话虽这么说,NLPy的目的是为研究人员提供必要的工具,以便他们组装自定义求解器。无论如何,只要您尝试一下,我都会很想离线听到您的评论。您可能还会发现相关的软件包https://github.com/dpo/pykrylovhttps://github.com/dpo/pyorder有用。当前,绝对缺少NLPy的文档。另外两个应该是合理的。


7

pyomo是一个完整的GAMS / AMPL建模环境,用于python优化。它功能强大,具有与AMPL支持的所有求解器的接口,并自动生成Jacobians等。但是,由于它在“虚拟python环境”中运行,因此将其链接到现有代码可能并不容易。


5

银杏巨蟒

我们最近发布了(2018)GEKKO Python软件包用于使用求解器(例如IPOPT,APOPT,BPOPT,MINOS和SNOPT)的非线性程序,并采用有效集和内点方法。使用这些求解器的问题之一是,您通常需要至少提供一阶导数和可选的二阶导数。如其他答案所述,有几种不错的建模语言可以为您做到这一点。GEKKO将方程式编译为字节码,因此就速度而言,就像您使用Fortran或C ++编写模型一样。自动微分将稀疏形式的一阶和二阶导数提供给基于梯度的求解器。我们针对最佳控制问题设计了GEKKO,但它也可以解决类似于fmincon的问题。以下是具有等式和不等式约束的非线性规划问题的快速示例。首先你'

pip install gekko

福Schittkowski问题#71以下示出作为目标函数,不等式约束,等式约束,并与上界和下界四个变量的一个例子。

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
x3 = m.Var(value=5,lb=1,ub=5)
x4 = m.Var(value=1,lb=1,ub=5)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3) # Objective
m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))    

GEKKO可在所有平台(Windows,MacOS,Linux,ARM处理器)以及Python 2.7和3+上运行。通过设置选项“ remote = False”,可以在没有Internet连接的情况下使用完全本地选项。本地选项当前仅适用于Windows,我们正在开发其他版本,例如Linux,MacOS,ARM处理器,以在没有Internet连接的情况下在本地运行。本地版本仅包含不需要许可证的免费求解器。默认情况下,问题被发送到公共服务器,在该服务器上计算解决方案并将其返回给Python。

尽管这个问题专门针对解决Python中的非线性编程问题,但我还将重点介绍GEKKO可以解决的其他几种类型的问题以及一些用于学习优化的资源。GEKKO还求解混合整数和微分代数方程,并具有用于高级控制(类似于DMC,RMPCT等)的几个预编程对象。操作模式包括数据协调,实时优化,动态仿真和非线性预测控制。

我教了两门关于优化的课程(设计优化动态优化),并在线发布了课程材料。每年1月开始提供动态优化课程,我们使用GEKKO Python软件包(和MATLAB)进行该课程。GEKKO是APMonitor Optimization Suite的扩展,但已将建模和解决方案可视化直接集成在Python中。APMonitor和GEKKO参考提供了使用此软件包可以解决的应用程序类型的示例。GEKKO是根据国家科学基金会研究补助金#1547110开发的


您能否编辑答案以解释您的软件如何满足帖子中提到的特定要求?否则,这看起来更像是一条笼罩的广告,而不是问题的答案(可能会被关闭)。
Christian Clason

克里斯蒂安(Christian),我对答案进行了修改,使其更加针对该问题。我将有关GEKKO和在线课程的其他信息移到了最后,但是可以根据需要将其删除。
John Hedengren '18

4

1
谢谢,但是那是我尝试过的(通过OpenOpt,它提供了一个额外的接口)。它从来没有比fmincon / sqp更好,并且在后者成功的许多情况下都失败了。
David Ketcheson

1
更新:我直接从SciPy尝试了这个。即使在fmincon能够在几秒钟内始终找到全局最优值的问题上,它也失败了。
David Ketcheson 2011年

4

PyGMO包含多个求解器,为它们提供相同的接口。如果您编译代码并独立下载/安装第三方代码,则包括IPOPT和scipy slsqp。

另外,通过archipelago类,可以很容易地并行使用求解器(多次启动)!


3

cvxmod,它是Stephen Boyd的凸优化软件的Python包装器。它是Sage软件包的一部分。


但是OP正在询问非凸优化问题。
亚历杭德罗(Alejandro)

1
OP正在询问一个非凸优化问题,但是到目前为止,所有提到的求解器都只能保证找到凸优化问题的eps最优解,而无需其他元启发式方法(多开始或其他需要确定性的随机全局优化算法,非线性,凸优化求解器)或类似分支定界算法(例如,分支定界,分支定格和分支简并),需要放宽目标函数和约束。这个答案并不比截至12月11日提到的其他答案差。
Geoff Oxberry

杰夫,如何将cvxmod应用于非凸问题?
David Ketcheson

我没有使用过该软件,但从理论上讲,像其他任何凸求解器一样,您将使用它来查找局部最优解,就像您现在正在使用fmincon(这也是一个凸求解器)一样。一种使用方法是多启动。生成要用作凸型求解器的初始猜测的点的列表。对于用作猜测的每个点,记录求解器返回的解决方案。在所有返回的解中,与最小目标函数值相对应的点是对全局最优值的最佳近似。
Geoff Oxberry

1
@Geoff:是的,我正在使用multistart。对于CVXMOD,它仅接受可以用规范化凸编程来表达的问题。一般的非线性规划问题不能。如您所说,我可以寻找近似于我的问题的连续凸松弛,但这里的总体目标是减少工作量。
大卫·凯奇森2011年


3






从2014b版开始,Matlab现在直接支持此功能;参见mathworks.de/help/matlab/matlab-engine-for-python.html
Christian Clason,2014年

@克里斯蒂安·克拉森(Christian Clason),那似乎根本不做numpy-to-Matlab吗?就像python-matlab-bridge一样。(不过我还没有使用过。)
denis 2014年

不是直接的(它似乎有一个自定义的matlab数组类),但是肯定有一种在numpy和numpy之间进行转换的方法。当然,由于数据复制,会有一些开销,但是对于OP提到的问题大小,这可能不是一个大问题。(我自己没有使用过;只是以为我会指出该选项。)
Christian Clason 2014年


2

CMA-ES呢?它具有Python绑定,非常适合非凸,非线性优化问题,我已经使用了很多:https//www.lri.fr/~hansen/cmaesintro.html

通过pip安装:

pip install cma

以下是他们网站上的一些示例代码:

import cma
help(cma)  # "this" help message, use cma? in ipython
help(cma.fmin)
help(cma.CMAEvolutionStrategy)
help(cma.CMAOptions)
cma.CMAOptions('tol')  # display 'tolerance' termination options
cma.CMAOptions('verb') # display verbosity options
res = cma.fmin(cma.Fcts.tablet, 15 * [1], 1)
res[0]  # best evaluated solution
res[5]  # mean solution, presumably better with noise

该优化器与OP的要求相差甚远。例如,没有明确的方法说明如何使用CMA-ES处理平等或不平等约束。
战神

1

由于MATLAB具有JIT编译器,而CPython还没有(至少,直到pypy获得完整的numpy支持)。似乎您想要一个性能超过商业生产的免费求解器fmincon。是不是太多了?

在商业NLP求解器中的IIRC中,到目前为止,只有snopt提供了Python API(尽管它相当难看)。

您尝试过哪些OpenOpt求解器?您的非凸任务中有多少个变量和约束?

您可以通过OpenOpt / Funcdesigner API尝试IPOPT,而无需在OpenOpt Sage服务器上安装(请注意“从Sage切换到python”图片)。

10300(x0.1)2+10300(y0.2)2(x,y)=(1,1)


2
如果您仔细阅读,我只是在问一些与fmincon具有相似鲁棒性的东西。它不需要更好,甚至可以更慢。
David Ketcheson 2011年


1

值得一提的是,Google Ceres解算器实际上是一个非常强大的非线性优化器,已在许多项目中使用。

这里还有一个python包装器:https : //github.com/rll/cyres


是Levenbeg-Marquardt吗?尽管不错,但远不符合OP的要求
denis 2014年

尽管ceres是一个非常好的求解器,但它根本不支持等式约束,并且仅支持不等式约束作为参数的上下边界(从当前版本1.12开始)。
orzechow

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.