当前位置: 首页 > 面试题库 >

Python混合整数线性规划

霍修筠
2023-03-14
问题内容

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

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


问题答案:

Pulp 是一个python建模接口,可连接到
CBC
(开源),
CPLEX

(商业), Gurobi (商业), XPRESS-
MP
(商业)和
YALMIP (开源)之类的
求解器

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

您还可以从 GLPK / PythonPyGLPK
PyMathProg 调用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
在这里

最后,如果您对简单的约束求解器(而非优化)感兴趣,请查看 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)的优化建模功能的非常全面的文章,请查看本文。



 类似资料:
  • 混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 <beans xmlns="http://www.springframework.org/schema/b

  • 混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 # 数据源配置 # 数据源名称,多数据源以逗号分隔 spring.shardingsphere.datas

  • 混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 dataSources: # 配置真实存在的数据源作为名称 write_ds: # ...省略

  • 混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 /* 数据源配置 */ HikariDataSource writeDataSource0 = new H

  • 在ORM映射类上定义具有“混合”行为的属性。 “混合”是指属性在类级别和实例级别定义了不同的行为。 这个 hybrid 扩展提供了一种特殊形式的方法修饰器,大约有50行代码,几乎不依赖于其他的sqlacalchemy。理论上,它可以与任何基于描述符的表达式系统一起工作。 考虑映射 Interval ,表示整数 start 和 end 价值观。我们可以在生成类级SQL表达式的映射类上定义更高级别的函

  • 有许多订单需要发货。对于每个订单,可能有1到3个路线选项。这里的问题是找出这些路线中订单的最佳分配(组合)。 假设: 假设每种类型卡车的全部运力和每公里运输成本为: 假设所有路线都有3次到达目的地的中转时间,那么: 假设路线的运输成本基于使用的卡车数量和运输距离,那么: //变量 目标函数: 受制于: 这是输入数据的CSV格式: 优化结果可能如下所示: 我的问题:我不知道如何编写约束2、3、5、6