我正在尝试解决在 Gurobi / python 中使用稀疏矩阵表示的 LP 问题。
最大 c′ x, 服从 A x = b, L ≤ x ≤ U
其中 A 是大小为 ~1000 2的 SciPy链表稀疏矩阵。使用代码
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()
该问题在约 1 秒内构建并解决,这比 Gurobi / Matlab 中的相同任务慢约 10-100 倍。你有什么提高问题定义效率的建议,或者避免翻译成稀疏坐标格式的建议吗?