【发布时间】:2014-05-11 03:33:29
【问题描述】:
我正在尝试解决在 Gurobi / python 中使用稀疏矩阵表示的 LP 问题。
max c′ x, 服从 A x = b, L ≤ x≤你
其中 A 是大小约为 10002 的 SciPy linked list sparse matrix。使用代码
model = gurobipy.Model()
rows, cols = len(b), len(c)
for j in range(cols):
model.addVar(lb=L[j], ub=U[j], obj=c[j])
model.update()
vars = model.getVars()
S = scipy.sparse.coo_matrix(A)
expr, used = [], []
for i in range(rows):
expr.append(gurobipy.LinExpr())
used.append(False)
for i, j, s in zip(S.row, S.col, S.data):
expr[i] += s*vars[j]
used[i] = True
for i in range(rows):
if used[i]:
model.addConstr(lhs=expr[i], sense=gurobipy.GRB.EQUAL, rhs=b[i])
model.update()
model.ModelSense = -1
model.optimize()
问题在 ~1s 内构建和解决,这比 Gurobi / Matlab 中的相同任务慢 ~10-100 倍。你有什么提高问题定义效率的建议,或者避免翻译成sparse coordinate格式的建议吗?
【问题讨论】:
-
第 1 步:找出自己哪一步花费的时间最多。特别是,用于形成优化问题的
for i, j, s构造看起来效率低下。缓慢的步骤似乎不太可能是 LIL->COO 转换。求解器可能有办法更有效地传递稀疏矩阵。 -
违规行是
expr[i] += s*vars[j]。相反,使用语法expr[i].addTerms(s, vars[j])导致该代码段的速度提高了 20 倍。
标签: python scipy sparse-matrix linear-programming gurobi