最短路問題を G urobi で解こう!

7
最最最最最最 Gurobi 最最最最最最最最最最最 最最最最

description

最短路問題を G urobi で解こう!. 流通最適化工学 補助資料. 単純な実装. from gurobipy import * E, cost = multidict ( {(0,1):10, (0,2):5, (1,2):2, (1,4):1, (2,1):3, (2,3):2, (3,4):6} ) V=range(5) print "E=",E print "cost=",cost. E= [(0, 1), (1, 2), (2, 3), (1, 4), (3, 4), (0, 2), (2, 1)] - PowerPoint PPT Presentation

Transcript of 最短路問題を G urobi で解こう!

Page 1: 最短路問題を G urobi で解こう!

最短路問題を Gurobi で解こう!

流通最適化工学補助資料

Page 2: 最短路問題を G urobi で解こう!

単純な実装from gurobipy import *E, cost = multidict( {(0,1):10, (0,2):5, (1,2):2, (1,4):1, (2,1):3, (2,3):2, (3,4):6} )V=range(5)print "E=",Eprint "cost=",cost

multidict( ) 関数は,辞書を入力キー(枝)のリスト, 費用を表す辞書 cost を返す.

E= [(0, 1), (1, 2), (2, 3), (1, 4), (3, 4), (0, 2), (2, 1)]cost= {(0, 1): 10, (1, 2): 2, (2, 3): 2, (1, 4): 1, (3, 4): 6, (0, 2): 5, (2, 1): 3}

Page 3: 最短路問題を G urobi で解こう!

モデルの構築m=Model()x={}for (i,j) in E: x[i,j] = m.addVar(name="x(%s,%s)"%(i,j))m.update()

m.addConstr( -x[0,1] - x[0,2] == -1 , name="source")m.addConstr( x[0,1] + x[2,1] -x[1,2] -x[1,4] ==0 , name="1" )m.addConstr( x[0,2] + x[1,2] -x[2,1] -x[2,3] ==0 , name="2")m.addConstr( x[2,3] - x[3,4] ==0 , name="3")m.addConstr( x[1,4] + x[3,4] ==1 , name="sink")

m.setObjective(quicksum( cost[i,j]*x[i,j] for (i,j) in E ), GRB.MINIMIZE)m.optimize()

Page 4: 最短路問題を G urobi で解こう!

結果の出力print "Optimal Value=",m.ObjValfor (i,j) in x: print i,j,x[i,j].X for c in m.getConstrs(): print c.ConstrName, c.Pi

Optimal Value= 9.00 1 0.01 2 0.01 4 1.02 3 0.02 1 1.03 4 0.00 2 1.0source -5.01 3.02 0.03 2.0sink 4.0

最適値

最適解

最適双対解

モデルオブジェクト m の getConstrs() メソッドで制約オブジェクトのリストを得る

各制約 c に対して, ConstrName で制約名,Pi ( π )で双対変数を得る!

Page 5: 最短路問題を G urobi で解こう!

より一般的な実装from gurobipy import *E, cost = multidict( {(0,1):10, (0,2):5, (1,2):2, (1,4):1, (2,1):3, (2,3):2, (3,4):6} )V=range(5)Out =[ [] for i in V ]In =[ [] for i in V ]for (i,j) in E: Out[i].append(j) In[j].append(i)print "Out=",Outprint "In=",In

隣接する点のリスト Out, In の準備

Out= [[1, 2], [2, 4], [3, 1], [4], []]In= [[], [0, 2], [1, 0], [2], [1, 3]]

Page 6: 最短路問題を G urobi で解こう!

モデルの構築m=Model()x={}for (i,j) in E: x[i,j] = m.addVar(name="x(%s,%s)"%(i,j))m.update()for i in V: if i==0: m.addConstr( quicksum( x[i,j] for j in Out[i]) ==1 ) elif i==4: m.addConstr( quicksum( x[j,i] for j in In[i]) ==1 ) else: m.addConstr( quicksum( x[j,i] for j in In[i]) == quicksum( x[i,j] for j in Out[i]) )m.setObjective(quicksum( cost[i,j]*x[i,j] for (i,j) in E ), GRB.MINIMIZE)

Page 7: 最短路問題を G urobi で解こう!

モデルの確認m.update()m.write("sp.lp")

Minimize 10 x(0,1) + 2 x(1,2) + 2 x(2,3) + x(1,4) + 6 x(3,4) + 5 x(0,2) + 3 x(2,1)Subject To R0: x(0,1) + x(0,2) = 1 R1: x(0,1) - x(1,2) - x(1,4) + x(2,1) = 0 R2: x(1,2) - x(2,3) + x(0,2) - x(2,1) = 0 R3: x(2,3) - x(3,4) = 0 R4: x(1,4) + x(3,4) = 1BoundsEnd

モデル更新 update() の後でWrite メソッド

ファイル “ sp.lp” が出力される