2017-08-03 3 views
1

私はPySCIPOPのIP問題を解決し、Juliaも同様の問題を解決し、解決時間が著しく異なることを発見しました。 JuliaはCbcを使用して25秒で問題を解決し、PySCIPOptはinbuiltソルバーを使用して198秒を要しました。コードを1行ずつ実行しているうちに、PySCIPOPの問題の定式化の部分では、実際に問題を解決するのに比べて、ほとんどの時間が費やされていました。私はこれが予想されたものか、これをより効率的にする方法(またはJuliaのパフォーマンスに匹敵する)があるかどうか疑問に思っていました。PySCIPOPの性能が遅い

編集:以下は、私が持っている製剤です。

+0

処方の共有はどうですか? – mattmilten

答えて

1

行列Aの希薄性を利用していることが判明したため、モデルの作成速度が大幅に向上しました。コードを次のように編集すると、はるかに高速に動作します。

model=Model("Route_Selection") 

start_time=time.clock() 
x={} 
for j in range(J): 
    x[j]=model.addVar(vtype = 'B', name = 'x (%s)' %j) 

y={} 
for i in range(I): 
    y[i]=model.addVar(vtype='C', name = 'y (%s)' %i) 

model.setObjective(quicksum(C[j]*x[j] for j in range(J))+ M* quicksum(y[i] for i in range(I)), "minimize") 

from scipy.sparse import csr_matrix #added line 1 
B=csr_matrix(A_mat) #added line 2 

for i in range(I): 
    start=B.indptr[i] #added line 3 
    end=B.indptr[i+1] #added line 4 
    model.addCons(quicksum(x[j] for j in B.indices[start:end])+y[i] ==1, name='coverage of (%s)' %i) #edited line 5 

model.addCons(quicksum(x[j] for j in range(J))<= N, name = 'vehicle constraint') 

model.optimize() 
print (time.clock()-start_time, "seconds") 

追加:参考のためのジュリアコードです。解決時間の比較は、PySCIPOptでは約17秒、Juliaでは約22秒です。

tic() 
Routing=Model(solver=CbcSolver(logLevel=0)) 

#Variables 
@variable(Routing, X[j=1:J], Bin) 
@variable(Routing, Y[i=1:I], Bin) 

#Objective 
@objective(Routing, Min, sum(C[j]*X[j] for j=1:J)+sum(M*Y[i] for i=1:I)) 

#Constraints 
A=sparse(A_mat) 
@constraint(Routing, consRef[i=1:I], sum(A[i,j]*X[j] for j=1:J)+Y[i]==1) 
@constraint(Routing, sum(X[j] for j=1:J)<=N) 

solve(Routing) 
toc() 
+0

興味深い!だから、PySCIPOptの欠陥ではなく、むしろPython独自のデータ構造でした。比較として、Juliaモデルを追加することもできます。 – mattmilten

関連する問題