Scipy.linprog 的 Gurobi 风格模型构建?

Posted

技术标签:

【中文标题】Scipy.linprog 的 Gurobi 风格模型构建?【英文标题】:Gurobi-style model construction for Scipy.linprog? 【发布时间】:2017-06-05 08:41:39 【问题描述】:

我想比较一下 Gurobi 和 Scipy 的线性编程工具,比如 linprog。 Scipy 需要在 matrix-list-vector-form 中指定问题,而 Gurobi 的工作方式类似于 here 这样

m = Model()
m.addVar(...) %for variables
m.addConstr(..>) %for constraints
m.update() %for updating the model
m.optimize % for optimizing the model
m.params %for getting parameters
m._vars %for getting variables

相比之下Scipy

Minimize: c^T * x

Subject to: A_ub * x <= b_ub
A_eq * x == b_eq


c : array_like
Coefficients of the linear objective function to be minimized.
A_ub : array_like, optional
2-D array which, when matrix-multiplied by x, gives the values of the upper-bound inequality constraints at x.
b_ub : array_like, optional
1-D array of values representing the upper-bound of each inequality constraint (row) in A_ub.
A_eq : array_like, optional
2-D array which, when matrix-multiplied by x, gives the values of the equality constraints at x.
b_eq : array_like, optional
1-D array of values representing the RHS of each equality constraint (row) in A_eq.
bounds : sequence, optional

我的目标是只用一种方法编写代码,并且仍然使用两个求解器对结果进行基准测试。为了加快比较求解器:

    Scipy 是否存在 Gurobi 风格的 LP 问题模型构建?

    是否存在使这两种方法可互换的包(我可以为 Gurobi 编写 scipy 样式或为 Scipy 编写 Gurobi 样式)?

    scipy 是否提供任何其他接口来指定线性规划问题?

【问题讨论】:

你看过this的回答吗? loannis:谢谢,但它与稀疏矩阵有关,在这里并不真正相关。 【参考方案1】:

这听起来需要做很多工作来展示显而易见的东西:

Gurobi 等商业求解器比非商业求解器更快、更健壮 H. Mittelmann 也提供了高质量的基准测试(CLP 和 GLPK 是最受欢迎的非商业基准) 虽然 scipy 的 linprog 还可以,但比包括 CBC/CLP、GLPK、lpSolve 在内的开源竞赛差多了…… 速度和稳健性! 另外:scipy 的 linprog 似乎真的没有维护open issues

有一些方法可以做到这一点:

A) 使用 linprog 的问题定义方式并将其转换为 Gurobi 风格 很容易将矩阵形式转换为 Gurobi 的模型 B) 使用cvxpy 作为建模工具,grab the standard-form 并为 Gurobi(实际上:有一个)和 linprog(再次简单)编写一个包装器。这将允许两者都使用非常强大的建模语言 缺点:根据问题进行不透明的转换(例如abs(some_vector) 可能会引入辅助变量) C) 编写一些 MPS 阅读器/或从其他工具中获取一个在 Gurobi 中为您的问题建模,输出这些并在 linprog 中阅读和解决 候选工具:cvxopt's mps-reader(隐藏在文档中)、一些 GLPK 接口甚至一些 CBC 接口 (可能是隐藏的转换)

无论您做什么,解决方案过程分析都将成为您代码的重要组成部分,因为 linprog 可能会失败很多。它也无法处理大型稀疏模型。

基于您的 gurobi 示例的备注

您的示例 (TSP) 是 MIP,而不是 LP 对于 MIP,上面所说的一切都变得更糟(尤其是商业和开源之间的性能差异) scipy 中没有 MIP 求解器!

【讨论】:

该操作没有提及 TSP。你的"Your example (TSP) is a MIP, not an LP"这句话指的是哪一种TSP? 检查你的链接Gurobi works like here,这会导致一些页面The Traveling Salesman Problem with integer programming and Gurobi CVXPY 看起来很不错,还有 Pulp。看起来 CVXPY 是最好的免费产品。是对的吗?指定问题与我喜欢的 Gurobi 非常相似。 cvxpy 与类似 gurobi 的建模非常非常不同。它基于有纪律的凸规划的思想,基本上是:通过构造证明凸性。这也意味着:你不能表达非凸问题,甚至可能是一些凸问题。另外:它喜欢类似矩阵的表达式,并且在其他表达式上会很慢(这对于 gurobi 是不同的)。但是您可以免费获得许多强大的功能(比在 gurobi 中更容易制定)

以上是关于Scipy.linprog 的 Gurobi 风格模型构建?的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制Gurobi得到的结果?

学习笔记之Gurobi

gurobi 6.0.2 / setPWLObj 的分段线性目标崩溃

使用Gurobi的线性和双线性约束。

google or-tools 无法获得最佳 LP 结果,如 gurobi 示例

Gurobi 中一个目标函数的两个表达式