最短路問題を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} ) E= [(0, 1), (1, 2), (2, 3), (1, 4), (3, 4), (0, 2), V=range(5) (2, 1)] print "E=",E cost= {(0, 1): 10, (1, 2): 2, (2, 3): 2, (1, 4): print "cost=",cost 1, (3, 4): 6, (0, 2): 5, (2, 1): 3} multidict( ) 関数は,辞書を入力 キー(枝)のリスト, 費用を表す辞書 cost を返す. モデルの構築 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.ObjVal for (i,j) in x: print i,j,x[i,j].X 最適解 for c in m.getConstrs(): print c.ConstrName, c.Pi モデルオブジェクト m のgetConstrs()メソッド で制約オブジェクトのリストを得る 各制約 c に対して,ConstrNameで制約名, Pi(π)で双対変数を得る! 最適双対解 Optimal Value= 9.0 0 1 0.0 1 2 0.0 1 4 1.0 2 3 0.0 2 1 1.0 3 4 0.0 0 2 1.0 source -5.0 1 3.0 2 0.0 3 2.0 sink 4.0 より一般的な実装 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, Inの準備 Out =[ [] for i in V ] In =[ [] for i in V ] Out= [[1, 2], [2, 4], [3, 1], [4], []] for (i,j) in E: In= [[], [0, 2], [1, 0], [2], [1, 3]] Out[i].append(j) In[j].append(i) print "Out=",Out print "In=",In モデルの構築 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") モデル更新 update()の後で 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) = 1 Bounds End
© Copyright 2024 ExpyDoc