【问题标题】:Python Mixed Integer Linear ProgrammingPython 混合整数线性规划
【发布时间】:2014-10-10 18:22:08
【问题描述】:

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

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

【问题讨论】:

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

标签: python linear-programming glpk integer-programming


【解决方案1】:

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

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

您也可以通过GLPK/PythonPyGLPKPyMathProg 调用GLPK。

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

上述所有求解器都求解 Mixed Integer Linear Programs,而其中一些(CPLEX、GUROBI 和 XRESS-MP 肯定)可以求解 Mixed Integer Quadratic ProgramsQuadratically constrained quadratic programs(还有圆锥程序,但这可能超出了本文的范围问题)。

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

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

请注意there is a big difference in the performance of commercial and free solvers:后者大大落后于前者。 SCIP也许是最好的非商业求解器(请参阅下面的更新)。它的python接口PySCIPOpt是here

另外,看看this SO question

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

我希望这会有所帮助!

更新

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

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

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

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

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

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

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

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

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

【讨论】:

  • 顺便说一句,SCIP 的 Python 接口得到了极大的改进,可以在这里找到:github.com/SCIP-Interfaces/PySCIPOpt
  • cvxoptcvxpy 也支持混合整数编程。这是一篇文章基准测试cvxoptpulp 快得多:scaron.info/blog/linear-programming-in-python-with-cvxopt.html
  • 我不认为 Gurobi 是开源的,如答案的第一句话所述。
  • @OliverAngelil MIP 求解器的复杂性无法与常规数值分析子程序(例如数组运算、求解方程组等)相比。这主要有两个原因。首先,求解器中嵌入了许多历史知识,跨越了数十年的严格研究和特定于实现的细节。其次,解决 MIP 问题是一个活跃的研究领域,学者们每年都在推动可以解决的问题的界限。商业求解器定期实施新进展,大约每年更新一次版本。
  • 声称 MIPCL 最快的依据是什么?这些基准似乎确实证实了您的说法:plato.asu.edu/talks/ismp2018.pdf。不幸的是,该列表没有区分商业/非商业。 (据我所知,GLPK、CBC、lp_solve、MIPCL 是完全开源的,SCIP 是非商业性的。)
【解决方案2】:

我使用 Gekko Python 包解决了 MILP 问题。您可以在本地或在他们的远程服务器上解决您的模型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多