Gurobi/python에서 희소 행렬을 사용하여 표현 된 LP 문제를 해결하려고합니다. X = B 대상Gurobi/python의 희소 행렬 LP 문제
최대 ′ C, X, L, X ≤ ≤ U, A는 크기가 2 ~ 1,000 의 SciPy linked list sparse matrix이다
. Gurobi/매트랩 같은 작업에 비해 10 ~ 100 배 느린 코드
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 초, ~를 사용. 문제 정의의 효율성을 개선하기위한 제안 사항이나 sparse coordinate 형식으로의 변환을 피하기위한 제안 사항이 있습니까?
1 단계 : 가장 많은 시간이 필요한 단계를 찾으십시오. 특히, 최적화 문제를 형성하기 위해 사용하는'for i, j, s '구조는 비효율적입니다. 느린 단계는 LIL-> COO 변환이 아닌 것 같습니다. 솔버에는 아마도 희소 행렬을보다 효율적으로 전달하는 방법이 있습니다. –
문제가되는 행은'expr [i] + = s * vars [j]'입니다. 대신'expr [i] .addTerms (s, vars [j]) '구문을 사용하면 해당 코드 세그먼트의 속도가 20 배 증가합니다. – u003f