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
我的目标是只用一种方法编写代码,并且仍然使用两种求解器对结果进行基准测试。为了加快比较求解器的速度:
Scipy是否存在 LP 问题的 Gurobi 式模型构造?
是否存在一些包可以使这两种方法互换(我可以为 Gurobi 编写 scipy 风格或为 Scipy 编写 Gurobi 风格)?
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 求解器
我想比较一下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
我的目标是只用一种方法编写代码,并且仍然使用两种求解器对结果进行基准测试。为了加快比较求解器的速度:
Scipy是否存在 LP 问题的 Gurobi 式模型构造?
是否存在一些包可以使这两种方法互换(我可以为 Gurobi 编写 scipy 风格或为 Scipy 编写 Gurobi 风格)?
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 求解器