我想比较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是否提供其他任何接口来指定线性编程问题?
最佳答案
听起来很明显,这表明了很多工作:
像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求解器!