・俳句の表現をつか 解 法 短歌・俳句の鑑賞...47 短歌・俳句の鑑賞① 確 認 問 題 1 次のそれぞれの短歌を味わい、あとの問いに 答 えなさい。A
最短路問題を G urobi で解こう!
-
Upload
sylvester-duffy -
Category
Documents
-
view
62 -
download
0
description
Transcript of 最短路問題を G urobi で解こう!
最短路問題を Gurobi で解こう!
流通最適化工学補助資料
単純な実装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}
モデルの構築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()
結果の出力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 ( π )で双対変数を得る!
より一般的な実装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]]
モデルの構築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)
モデルの確認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” が出力される