繁体   English   中英

Python 混合整数线性规划

[英]Python Mixed Integer Linear Programming

是否有适用于 Python 的混合整数线性规划(MILP)求解器?

GLPK python可以解决MILP问题吗? 我读到它可以解决混合整数问题。
我对线性规划问题很陌生。 所以我很困惑,如果混合整数规划与混合整数线性规划(MILP)不同,我无法真正区分。

Pulp是一个 Python 建模接口,可连接到CBC (开源)、 CPLEX (商业)、 Gurobi (商业)、XPRESS-MP (商业)和YALMIP (开源)等求解器。

您还可以使用Pyomo对优化问题进行建模,然后调用外部求解器,即 CPLEX、Gurobi GLPK 和 AMPL 求解器库。

您还可以从GLPK/PythonPyGLPKPyMathProg调用 GLPK。

另一种建模语言是CMPL ,它有一个用于 MIP 求解器的 Python 接口(仅适用于线性程序)。

以上所有求解器都可以求解混合整数线性规划,而其中一些(肯定是 CPLEX、GUROBI 和 XRESS-MP)可以求解混合整数二次规划二次约束二次规划(以及圆锥规划,但这可能超出了本文的范围)问题)。

MIP 指的是混合整数程序,但它通常仅指线性程序。 为了使术语更准确,应始终参考 MILP 或 MINLP(混合整数非线性规划)。

请注意,CPLEX 和 GUROBI 也有自己的 python API,但它们(以及)XPRESS-MP 是商业产品,但可免费用于学术研究。 CyLP类似于上面的 Pulp,但与 COIN-OR 求解器 CBC 和 CGL 和 CLP 接口。

请注意,商业求解器和免费求解器的性能存在很大差异:后者大大落后于前者。 SCIP可能是最好的非商业求解器(见下文更新)。 它的 python 接口 PySCIPOpt在这里

另外,看看这个 SO question

最后,如果您对简单的约束求解器(而不是优化)感兴趣,请查看python-constraint

我希望这有帮助!

更新

更多我关注的求解器和 python 接口:

更新:MIPCL 链接似乎已损坏。 MIPCL似乎是最快的非商业 MIP 求解器,它有一个python 接口文档非常好 但是请注意,Python API 不包括与本机MIPCLShell一起提供的高级功能。 我特别喜欢MIPCL-PY 手册,它展示了运营管理中使用的一系列模型,以及一些小规模的实现。 它本身就是一本非常有趣的介绍性手册,无论人们想要使用哪个求解器/API。

Google 优化工具,其中包括多种功能,例如

  • 约束规划求解器和线性规划(不是 MIP )求解器
  • MIP 求解器的接口(支持 CBC、CLP、GLOP、GLPK、Gurobi、CPLEX 和 SCIP)
  • 图的专用算法、旅行商问题、车辆路线问题和装箱和背包问题

它包含有关几个传统 OR 问题和简单实现的大量文档。 尽管这里有一些示例,但我找不到完整的 Python API 文档。 我有点不清楚其他求解器如何连接到接口以及这些求解器的方法是否可用。

CVXOPT ,一个用于凸优化的开源包,它与 GLPK(开源)和MOSEK (商业)接口。 它是通用的,因为它可以解决许多问题类别(特别是线性、二阶、半定、凸非线性)。 唯一的缺点是它对复杂问题的建模可能很麻烦,因为用户需要以“Matlab-y”方式传递数据(即指定矩阵、rhs 向量等)。 但是,它可以从建模接口PICOS和...

CVXPY ,一种用于凸优化问题的嵌入 python 的优化语言,它包含CVXOPT作为默认求解器,但它可以连接到通常的 MIP 求解器

感谢RedPanda指出CVXOPT/CVXPY支持 MIP 求解器。

有关包和面向对象语言(不限于 Python)的优化建模能力的非常全面的文章,请查看这篇文章

我使用 Gekko Python 包来解决 MILP 问题。 您可以在本地或在他们的远程服务器上解决您的模型。 以下是使用pip install gekko后的示例:

from gekko import GEKKO
m = GEKKO()
x,y = m.Array(m.Var,2,integer=True,lb=0) 
m.Maximize(y)
m.Equations([-x+y<=1,
             3*x+2*y<=12,
             2*x+3*y<=12])
m.options.SOLVER = 1
m.solve()
print('Objective: ', -m.options.OBJFCNVAL)
print('x: ', x.value[0])
print('y: ', y.value[0])

GEKKO是一个 Python 包,用于机器学习和优化混合整数和微分代数方程。 它与用于线性、二次、非线性和混合整数规划(LP、QP、NLP、MILP、MINLP)的大规模求解器相结合。 操作模式包括参数回归、数据协调、实时优化、动态模拟和非线性预测控制。 GEKKO 是一个面向对象的 Python 库,用于促进 APMonitor 的本地执行。

很快就会有另一种选择:从 1.9.0 版本开始, SciPy将支持 MILP。 请参阅开发文档中的scipy.optimize.milp SciPy milp实现是HiGHS线性优化软件的封装。 它于 2022 年 2 月 16 日在此 PR中添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM