Python混合整数线性编程


75

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

GLPK python可以解决MILP问题吗?我读到它可以解决混合整数问题。
我是线性编程问题的新手。因此,如果混合整数编程与混合整数线性编程(MILP)不同,我会很困惑,无法真正区分。


7
我不太确定为什么要投反对票,但是我实际上已经搜索了几个小时,并且真的不确定MILP是否与MIP相同。
asun 2014年

Answers:


138

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问题

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

我希望这有帮助!

更新

更多的求解器和python接口陷入了我的视野:

MIPCL似乎是最快的最快的非商业MIP求解器之一,它具有python界面,该界面具有相当好的文档。但是请注意,Python API不包括本机MIPCLShell附带的高级功能。我特别喜欢MIPCL-PY手册,该手册在一些小规模实现的基础上演示了运维管理中使用的一系列模型。它本身就是一本非常有趣的入门手册,无论您可能想使用哪种求解器/ API。

Google Optimization Tools,其中包括多种功能,例如

  • 约束规划求解器和线性规划(非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)的优化建模功能的非常全面的文章,请查看本文


嘿,谢谢你的答复。我搜索了您张贴的许多填充物。甚至在发布此之前安装了其中两个(PuLP和GLPK)。由于命名原因,我对MILP和MIP感到很困惑。无论如何,感谢您的澄清。感激。
asun 2014年

3
顺便说一下,这里有SCIP的Python界面非常完善,可以在这里找到:github.com/SCIP-Interfaces/PySCIPOpt
mattmilten

1
cvxopt并且cvxpy还支持混合整数编程。这是一篇基准测试的文章cvxopt,其发布速度比以下文章还要快pulpscaron.info/blog/linear-programming-in-python-with-cvxopt.html
RedPanda

1
我不认为答案第一句中所说的Gurobi是开源的。
奥利弗·安吉尔

3
@OliverAngelil MIP求解器的复杂性无法与常规数值分析子例程(例如数组运算,方程组求解等)相提并论。这主要有两个原因。首先,求解器中包含许多历史知识,涉及数十年的严格研究和特定于实现的细节。其次,解决MIP问题是一个活跃的研究领域,学者们逐年扩大了可以解决的问题的界限。商业求解器会定期实施新的改进,每年大约更新一次。
Ioannis

4

我使用了Gekko Python软件包来解决MILP问题。您可以在本地或在其远程服务器上求解模型。

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

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.