如何在 pyomo 中使用/选择/安装混合整数非线性求解器
Posted
技术标签:
【中文标题】如何在 pyomo 中使用/选择/安装混合整数非线性求解器【英文标题】:How to use/choose/install a Mixed-Integer Nonlinear solver in pyomo 【发布时间】:2019-09-25 00:20:14 【问题描述】:在线我可以读到用 pyomo 解决混合整数非线性问题是可能的。但我不明白怎么做。 我用“glpk”和“ipopt”求解器解决了问题,但两者都不适用于我当前的问题(ipopt 不尊重布尔变量)。 (我还重建了问题以避免布尔变量,但如果全局最优值为 0(在一维中),ipopt 只会显示远离 0 的局部最优值。
我找到了这篇论文http://egon.cheme.cmu.edu/Papers/Bernal_Chen_MindtPy_PSE2018Paper.pdf 展示 MindtPy,但我不知道如何安装它。 我阅读了许多可能的求解器,例如 BARON、ANTIGONE、SCIP、LINDOGLOBAL 和 COUENNE。但是我如何在 pyomo 中使用它们,如果可能的话,没有许可证,或者是否有其他可以推荐的解算器,它附带 pyomo 或 anaconda(或易于安装)。 提前非常感谢
【问题讨论】:
【参考方案1】:MindtPy 在最新版本 (v. 5.6.2) 中与 Pyomo 一起分发。查看示例here,了解如何使用 MindtPy 制定和解决问题。您提到的其他求解器必须手动安装并添加到您的搜索路径中,其中一些确实需要许可证。 COUENNE 是一个免费的开源选项,您可以找到安装说明here。搜索其他求解器的主页,了解他们的许可以及如何访问它们。
【讨论】:
【参考方案2】:我正在为 Pyomo(或 AMPL)开发一个免费的 MINLP 求解器,称为 APOPT。可以下载当前解决NLP problems in Pyomo (MINLP not yet supported)的版本。它将 .nl 问题发送到服务器,然后将 .sol 解决方案返回给 Pyomo。
我有使用 Python Gekko 解决 MINLP 问题的界面。这也是 Pyomo 求解器性能的预览。您可以使用以下方式安装 Gekko:
pip install gekko
或者,如果您在 Jupyter 笔记本中,则可以通过在单元格中运行此命令来安装 Gekko(只需要一次):
!pip install gekko
这是一个 MINLP 问题的示例:
from gekko import GEKKO
m = GEKKO() # Initialize gekko
m.options.SOLVER=1 # APOPT is an MINLP solver
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
# Integer constraints for x3 and x4
x3 = m.Var(value=5,lb=1,ub=5,integer=True)
x4 = m.Var(value=1,lb=1,ub=5,integer=True)
# 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.solve(disp=False) # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('Objective: ' + str(m.options.objfcnval))
它产生以下输出:
Results
x1: [1.3589086474]
x2: [4.5992789966]
x3: [4.0]
x4: [1.0]
Objective: 17.532267301
【讨论】:
以上是关于如何在 pyomo 中使用/选择/安装混合整数非线性求解器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Winpython 中安装 glpk-solver 和 pyomo
如何在 Windows 机器上本地安装 CBC for Pyomo?