Scipy.linprog 的 Gurobi 式模型构造?

Gurobi-style model construction for Scipy.linprog?

我想比较一下Gurobi和Scipy的线性规划工具,比如linprog。 Scipy 需要在 matrix-list-vector-form while Gurobi works like 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

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

  1. Scipy是否存在 LP 问题的 Gurobi 式模型构造?

  2. 是否存在一些包可以使这两种方法互换(我可以为 Gurobi 编写 scipy 风格或为 Scipy 编写 Gurobi 风格)?

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

这听起来很明显,需要做很多工作:

  • 像 Gurobi 这样的商业求解器比非商业求解器更快、更强大
    • H. Mittelmann(CLP 和 GLPK 是最受欢迎的非商业基准)
    • 也显示了这一点
  • 虽然scipy的linprog还可以,但比起CBC/CLP、GLPK、lpSolve...
    • 速度和稳健性!
    • 另外:scipy 的 linprog 似乎真的没有维护 open issues

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

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

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

根据你的 gurobi-example 的备注

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