【问题标题】:sparse matrix LP problems in Gurobi / pythonGurobi / python中的稀疏矩阵LP问题
【发布时间】: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


【解决方案1】:

在处理稀疏矩阵时,MATLAB 总是比 scipy 更有效。不过,您可以尝试一些事情来加快速度。

Gurobi 的 Python 接口采用单独的稀疏约束。这意味着您希望以压缩的稀疏行格式(而不是坐标格式)访问您的矩阵。

尝试做:

   S = S.tocsr()

或直接以压缩稀疏行格式构建矩阵。

page 表示您可以从 CSR 格式的 scipy 稀疏矩阵访问原始数据、索引和行指针。因此,您应该能够按如下方式迭代这些:

  model = gurobipy.Model()
  row, cols = len(b), len(c)
  x = []
  for j in xrange(cols):
      x.append(model.addVar(lb=L[j], ub=U[j], obj=c[j])
  model.update()

  # iterate over the rows of S adding each row into the model
  for i in xrange(rows):
      start = S.indptr[i]
      end   = S.indptr[i+1]
      variables = [x[j] for j in S.indices[start:end]]
      coeff     = S.data[start:end]
      expr = gurobipy.LinExpr(coeff, variables)
      model.addConstr(lhs=expr, sense=gurobipy.GRB.EQUAL, rhs=b[i])

   model.update()
   model.ModelSense = -1
   model.optimize()

请注意,我使用 LinExpr() 构造函数一次将所有术语添加到表达式中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2015-04-26
    • 2023-04-10
    • 2011-11-20
    • 2020-10-16
    • 2021-12-30
    • 2023-03-02
    相关资源
    最近更新 更多