ネットワーク理論 Text. Part 3 pp. 57-104 • 最短路問題 pp.58-84 • Ford法,双対問題とポテンシャル, Bellman方程式とBellman-Ford法 • 負の費用をもつ閉路がある場合,閉 路を含まない場合 • 最大流問題 pp.85-94 • 最小費用流問題 pp.95-104 1 大名の例題 10 s 始点 飛脚に払う費用 (単位は両) 1 1 3 2 5 2 t 終点 6 2 3 2 最短路問題(定義) V 枝集合 E 点集合 c は枝集合Eから 非負の実数全体への写像 G=(V,E) 枝の費用 c: E → R+ 有向グラフ 目的: 点とそれに接続する 枝が交互に並んだもの 始点sから終点tまでの最小費用のパス 最短路 3 Ford法(アイディア) 費用=10(両) 富士山 氷の価格=0(両) 宿場1 氷の価格=9(両) 氷の価格=10(両) 氷を運びますか? 氷の価格=11(両) 4 アイディアの形式化 小売価格=ポテンシャル c 費用= 点v y 氷の価格= v(両) 氷を運びますか? ywがyv+cvw以上なら 飛脚は氷を運ぶ! vw 点w 氷の価格= yw(両) 点のポテンシャル y : V→ R y は点集合 V から 実数全体への写像 5 「小売価格の見直し」操作 費用=10(両) 宿場1 富士山 氷の価格=0(両) 小売価格が 適正でない! 氷の価格=13(両) 小 見売 直価 し格 の 氷の価格=10(両) 6 Ford法(飛脚組合バージョン) 1. 2. 3. 富士山の氷の価格=0;他の宿場町の氷の価 格=∞ while 小売価格が適正でなければ... do (wにおける)価格が適正でない枝 vw に対して 「小売価格の見直し」 7 解いてみよう!(1) 10 s 1 1 3 2 5 2 t 6 2 3 8 解いてみよう!(2) ∞ 0 1 10 s 1 ∞ t 3 2 6 2 3∞ 5 ∞ 2 9 解いてみよう!(3) ∞ 0 1 10 s 1 ∞ t 価格が適正でない 3 2 6 2 3∞ 5 ∞→5 2 10 解いてみよう!(4) ∞→10 0 10 1 1 ∞ t 価格が適正でない s 5 5 3 2 6 2 3∞ 2 11 解いてみよう!(5) 10→8 0 1 10 1 ∞ t 価格が適正でない s 5 5 3 2 6 2 3∞ 2 12 解いてみよう!(6) 8 0 1 10 1 ∞ t 価格が適正でない s 3 2 6 ∞→7 5 5 2 2 3 13 解いてみよう!(7) 8 0 1 10 s 1 ∞→13 3 2 5 t 6 価格が適正でない 5 2 2 37 14 解いてみよう!(8) 8 0 1 10 s 1 13→9 3 2 t 6 価格が適正でない 5 5 2 2 37 15 解いてみよう!(9) 8 0 1 10 s 3 2 5 5 2 1 全ての価格が 適正になった 2 9 t 6 37 16 ポテンシャルの実行不能,実行可能 小売価格=ポテンシャル ポテンシャルが実行不能 (小売価格が適正でない) yw yv cvw ポテンシャルが実行可能 (小売価格が適正) yw yv cvw 17 Ford法 1. 2. 3. 集合の差演 算 ys:=0, yv :=∞, v V \ s While ポテンシャル yが実行不能 do yw>yv+cvwを満たす枝を見つけて yw:=yv+cvw 18 双対問題とポテンシャル -まずは線形計画として定式化変数 xvw: 最短路(最適パス)が枝vwを使う なら1,それ以外なら0 例:始点 s に対して, xs1=0, xs2=1 (8ページ目のスライド参照) xがパスを表すためには... 始点 s から飛脚が1人出ていく! xs1+xs2=1 19 線形計画として定式化2 xがパスを表すためには... 点1に飛脚が入ってきたら出ていかなければ ならない! xs1+x21 -x12-x1t =0 点2に飛脚が入ってきたら出ていかなければ ならない! xs2+x12 –x21-x23 =0 点3に飛脚が入ってきたら出ていかなければ ならない! x23-x3t =0 終点tには飛脚が入ってくる! x1t+x3t =1 20 線形計画として定式化3 パスに含まれている枝の費用の合計は最小化 最小化10xs1+5xs2+2x12+x1t+3x21+2x23+6x3t 条件 -xs1- xs2 =-1 xs1 - x12-x1t+ x21 =0 xs2+ x12 - x21- x23 =0 x23- x3t =0 x1t + x3t =1 xs1, xs 2 , x12 , x1t , x21 , x23 , x3t 0 21 双対問題を作ってみよう! 絶対に失敗しない方法 (Lagrange緩和 を用いる!) まず,主問題のそれぞれの制約式に対応する双対変数を用意 22 双対問題を作ってみよう! 最小化10xs1+5xs2+2x12+x1t+3x21+2x23+6x3t 条件 -xs1- xs2 =-1 xs1 - x12-x1t+ x21 =0 xs2+ x12 - x21- x23 =0 x23- x3t =0 x1t + x3t =1 (xs1+xs2-1)×ys (-xs1+x12+x1t-x21)×y1 (-xs2-x12+x21+x23)×y2 任意の実数 (-x23+x3t)×y3 (負でも良い) =0 (-x1t-x3t+1)×yt ×ys ×y1 ×y2 ×y3 ×yt 23 双対問題を作ってみよう! 最小化 10xs1+5xs2+2x12+x1t+3x21+2x23+6x3t +(xs1+xs2-1)ys+(-xs1+x12+x1t-x21)y1 +(-xs2-x12+x +x23)y2+(-x23+x3t)y3 =0 21 任意の実数 +(-x1t-x3t+1)yt 条件 この部分は0 主問題と同じ 24 双対問題を作ってみよう! 目的関数をyについてまとめる 最小化 yt-ys +(10+ys-y1)xs1+(5+ys-y2)xs2+(2+y1-y2)x12 +(1+y1-yt)x1t+(3+y2-y1)x21 +(2+y2-y3)x23+(6+y3-yt)x3t 条件 主問題と同じ 25 双対問題を作ってみよう! 目的関数に加えた制約を全て緩和 最小化 下界を与える yt-ys+(10+ys-y1)xs1+(5+ys-y2)xs2+(2+y1-y2)x12 +(1+y1-yt)x1t+(3+y2-y1)x21+(2+y2-y3)x23+(6+y3-yt)x3t 条件 xは0以上 0以上でないと 最小化 発散してしまう 最大化 最適値 下界(目的関数に加えた項の 合計は0,式を緩和したので) 26 双対問題 双対問題 最大化 yt-ys 条件 y1 y s 10 ポテンシャルが実 行可能である条件 y2 y s 5 小売価格が適正 y2 y1 2 yt y1 1 y1 y2 3 y3 y 2 2 yt y3 6 27 双対問題の意味合いを考えてみよう (ポテンシャルと双対変数の関係) 双対変数yは宿場町での氷の小売価格 (ポテンシャル)を表す. 双対問題の目的関数は,江戸と富士山の 小売の価格(ポテンシャル)の差の最大 化を表す. 双対問題の制約式は,小売価格が適正 (ポテンシャルが実行可能)であること を表す. 28 Bellman方程式とBellman-Ford法 -双対問題を眺めてみよう!y1 ys 10 y1 y2 3 よりy1=min{ys+10,y2+3}である. 同様に y2=min{ys+5,y1+2}, y3=min{y2+2}, yt=min{y1+1,y3+6} 29 Bellman方程式 つまり次式を満たすyを求めれば良い. yw min yv cvw w V \ s v:vwE ys 0 Bellman方程式 30 Bellman方程式を解こう1 ys=0(富士山sの小売価格は0) y1=min{ys+10,y2+3} y1=min{10,y2+3} y2=min{ys+5,y1+2} y2=min{5,y1+2} y3=min{y2+2} y3=y2+2 yt=min{y1+1,y3+6} yt=min{y1+1,y3+6} 31 Bellman方程式を解こう2 y1=min{10,y2+3}を y2=min{5,y1+2} に代入 y2=min{5,min{10,y2+3}+2} 整理して y2=min{5,min{12,y2+5}} もっと整理して y2=min{5,12,y2+5};よって y2 =5 32 Bellman方程式を解こう3 y2 =5 がわかったので... y1=min{10,y2+3}より y1=min{10,5+3} =8 y3=y2+2 より y3=5+2=7 yt=min{y1+1,y3+6}より yt= min{8+1,7+6}=9 より系統的な方法はないものか? (手計算でなくコンピュータでもできるように!) 33 Bellman方程式(修正版) yv(k)=始点sから,たかだかk本の枝を経由し, 点vに至る最適パスの費用 点wにk+1本の枝を経由してくるときの費用 yw k 1 min yv k cvw , yw k w V \ s v:vwE 点vにk本の枝を経由してくるときの 点wにk本の枝を経由 費用にvからwへ移動の費用を加えたもの してくるときの費用 34 Bellman方程式(修正版)をもと にしたFord法 -Bellman-Ford法Bellman-Ford法を言葉で書くと... k=0のときは簡単! ys(0)=0(始点 s までは枝 0 本で費用0) yv(0)=∞(s以外の点vには,枝 0 本では行けない) これを初期条件として... k=1,2,3,4(点の数から1を減じた回数だけ;なぜか?) の順にy(k) を計算する. 35 Bellman-Ford法の適用例 表の値はyv(k) 点 k=0 k=1 k=2 k=3 k=4 s 0 0 0 0 0 1 ∞ 10 8 8 8 2 ∞ 5 5 5 5 3 ∞ ∞ 7 7 7 t ∞ ∞ 11 9 9 最適値 36 Bellman-Ford法 ys(0):=0, yv(0):=∞, v V \ s for k=0 to n-1 do yw(k+1):=yw(k) ,∀w ∈V for all vw E do if yv(k)+cvw<yw(k) then yw(k+1):=yv(k)+cvw 37 Bellman-Ford法の適用例 最適パスを記憶する場合 sからきたことを表 pr k=2 pr k=3す pr k=4 点 k=0 pr k=1 s 0 0 1 ∞ 10 s 8 2 8 2 8 2 2 ∞ 5 s 5 s 5 s 5 s 3 ∞ ∞ 7 2 7 2 7 2 t ∞ ∞ 11 1 9 1 9 1 0 0 pr 0 表の値はyv(k)と直前の点pr(Previousの略) 38 Bellman-Ford法の適用例 点 k=0 k=1 pr s 0 0 1 ∞ 2 ∞ 3 ∞ 10 s 5 s ∞ t ∞ ∞ k=2 k=3 k=4 pr pr sからきたことを表 pr 0 0 す 0 8 2 5 s 7 2 11 1 8 2 5 s 7 2 9 1 8 2 5 s 7 2 9 1 最適値 39 最短路木 (最適パスの情報を含んだ木) Bellman-Ford法の表を後からたどることにより, 最短路木を作成 1 t 2 3 s 40 演習問題1 1. Aから各点への最短路をFord法で求めてみよう. 2. Aから各点への最短路をBellman-Ford法で求めてみよう. A B 4 E 5 4 9 3 C F 3 10 注:無向グラフなので A->B,B->Aの両方向に 枝がある有向グラフと みなして解くこと! 3 D 4 41 演習問題2 下のネットワークにおいて,sからtへの最短路を Bellman-Ford法で求めることができるかな? (オプション課題) 10 s 1 3 2 5 2 1 -5 2 t 6 3 42 ネットワーク理論 Text. Part 3 pp. 57-104 • 最短路問題 pp.58-84 • Ford法,双対問題とポテンシャル, Bellman方程式とBemmlan-Ford法 • 負の費用をもつ閉路がある場合,閉 路を含まない場合 • 最大流問題 pp.85-94 • 最小費用流問題 pp.95-104 43 大名の例題 10 始点 s 飛脚に払う費用 (単位は両) 1 3 2 5 2 1 -5 2 t 終点 6 3 Ford法を適用してみよう 44 Ford法の適用 ∞ 1 ∞ 1 t 10 0 s 3 5 -5 2 2 ∞ 2 6 3 ∞ 45 Ford法の適用 ∞→10 1 ∞ 1 t 10 0 s 3 5 -5 2 2 ∞ 2 6 3 ∞ 46 Ford法の適用 10 1 ∞ 1 t 10 0 s 3 5 -5 2 2 ∞→5 2 6 3 ∞ 47 Ford法の適用 10 1 ∞ 1 t 10 0 s 3 5 -5 2 2 5 2 6 3 ∞→7 48 Ford法の適用 10→2 1 ∞ 1 t 10 0 s 3 5 -5 2 2 5 2 6 3 7 49 Ford法の適用 10→2→1→ 1 ∞ 1 t 10 0 s 3 5 終わらない! -5 2 2 2 6 3 5→4→3→ 7→6→5→ 合計費用が負の閉路 (=負の閉路) 50 最短路問題 (枝の費用が負を許す場合) (下線を引いた部分が改訂箇所) V 枝集合 E 点集合 G=(V,E) 枝の費用 c: E → R 有向グラフ (Rは実数全体の集合;負でも良い!) 目的: 始点sから終点tまでの最小費用のパス あるいは負の閉路を見つける 51 Ford法は失敗した! Bellman-Ford法はどうだろう? (復習) yv(k)=始点sから,たかだかk本の枝を経由し, 点vに至る最適パスの費用 Bellman-Ford法を言葉で書くと... k=0のときを初期条件として... k=1,2,3,4 (点の数は5個;最適パスの枝は最大でも4本だから!) の順にyv(k)を計算する. 52 Bellman-Ford法のちょっとし た変形(アイディア) 最適パスは枝をたかだか4本使う. 5本使ったときに,最適パスの費用 yv(k)が(4本使ったときより)小さく なったら,負の閉路がある! 53 改訂したBellman-Ford法 (負の費用をもつ枝をもつ 最短路問題に対するアルゴリズム) 改訂したBellman-Ford法 k=0のときを初期条件として, k=1,2,3,4,5 まで yv(k)を計算し,yv(4) > yv(5)になる点 v がある なら「負の閉路がある」といって終了 それ以外なら, yt(4)が最適パスの費用 54 Bellman-Ford法(擬似コード) (下線を引いたのが改訂箇所) ys(0):=0, yv(0):=∞, v V \ s pred(v):=empty, v V for k=0 to n do yw(k+1):=yw(k) ,∀w ∈V for all vw E do if yv(k)+cvw<yw(k) then yw(k+1):=yv(k)+cvw pred(w):=v 55 Bellman-Ford法を適用してみよう 表の値はyv(k)と直前の点pr(Previousの略) 点 k=0 k=1 k=2 k=3 k=4 k=5 pr pr pr pr pr pr s 0 1 ∞ 2 ∞ 3 ∞ ∞ t ∞ ∞ 0 0 0 0 0 10 s 5 s 8 2 5 s 7 2 11 1 2 3 5 s 7 2 9 1 2 3 4 1 7 2 3 1 2 3 4 1 6 2 3 1 v=3に対して yv(4) >yv(5) 56 最短路木の作成 Bellman-Ford法の表を後からたどることにより, 最短路木を作成 点 … k=5 pr s … 0 tの直前は1 1 … 2 3 2の直前は1 1の直前は3 2 … 4 1 3 … 6 2 t … 3 1 1 s 2 t 3 3の直前は2 57 最短路木の作成 Bellman-Ford法の表を後からたどることにより, 最短路木を作成 点 … k=5 pr 1 t s 2 3 s … 0 1 負の閉路 発見 … 2 3 2 … 4 1 3 … 6 2 t … 3 1 58 通貨の変換によって儲けよう ¥ 1ドル=112.44円 ×112.44 1円=0.007689ユーロ 1ユーロ=1.1567ドル $ ×0.007689 ユーロ ×1.1567 1×112.44×0.007689×1.1567=1.000026326772 投資額が大きい機関投資家なら手数料が無視できる ので,ちょっと儲かる. 59 通貨の変換によって儲けよう 通貨vから通貨wへの変換レートを Rvk,v1 とする. 通貨を点としたグラフで,閉路 v1->v2->…vk->v1で Rv1,v2× Rv2,v3×‥‥ Rvk-1,vk× Rvk,v1>1 となるものを求める問題. 枝vw上の費用cvwをcvw=-log Rvwとすると -(logRv1,v2+logRv2,v3+‥‥+logRvk-1,vk+logRvk,v1)= -log(Rv1,v2×Rv2,v3×‥‥×Rvk-1,vk×Rvk,v1) < 0 なのでグラフ上で負の閉路を求める問題に帰着される. 61 通貨の変換によって儲けよう 注意!個人投資家がやっても,手数料 があるので儲からない. (日本の)銀行だと1$あたり1円の手数料がかかる. 一度に変換する額が大きすぎると,為 替レート自身が動いてしまう. -> 次々回にやる最小費用流を用いて,一度に変換す る量に制限(容量)をつける. 62 大名の例題 ストライキ 10 始点 s 1 3 2 5 2 1 -5 2 t 終点 6 3 64 大名の例題 (閉路がない場合) 1 1 t 10 s -5 3 5 2 2 6 3 閉路がなくなったので,枝の費用が負でも 負の閉路ができる心配はない! 65 閉路がないグラフ上の問題を 解くときの基本ツール -トポロジカル・ソート- s 2 3 1 t トポロジカル・ソート (topological sort;位相の情報を用いた並べ替えの意) 66 並べ替えのアルゴリズム (ソーティング)(復習?) 挿入ソート(insertion sort) やってみよう! 67 並べ替え(ソーティング) 問題の入力 – データの個数nおよびデータのキー A[j](j=1,・・・,n) 出力 – A[j](j=1,・・・,n)を小さい順に並べた列 挿入ソート マージソート クイックソート ヒープソート 良いアルゴリズム O(n2) O(n logn) O(n2) 平均的にはO(n logn) O(n logn) 68 挿入ソート(Insertion sort) 1 2 3 jを2からnまで1ずつ増やす A[1..j-1]まではちゃんと並べられている A[j]をA[1..j]の中の適切な場所に挿入する j A[j] 1 3 2 2 A[j] 2 3 A[j] 2 A[j] 1 3 4 4 1 A[1..1]はOK 4 1 A[1..2]はOK 3 4 1 A[1..3]はOK 2 3 4 A[1..4]はOK 69 挿入ソート(Insertion sort) 「A[j]をA[1..j]の中の適切な場所に挿入する」の詳細化 key =A[j] i=j-1から1まで,key<A[i]になるまでA[i]を右にずらす key(A[j])をずらした位置に入れる keyに一時保存 A[j] A[j] 2 1 3 4 2 3 2 3 1 A[1..3]はOK 4 4 A[1..4]はOK 70 挿入ソート(Insertion sort) 1 2 3 4 5 jを2からnまで1ずつ増やす key = A[j] iをj-1からA[i]>keyまたはi=0になるまで1ずつ減らす A[i+1]=A[i] A[i+1] =key 最悪の場合の計算量: O(n2) n2 回かかる例: A[j] 5 4 3 2 1 A[j] 1 2 4 3 5 71 トポロジカル・ソート 言葉の準備(復習!覚えているかな?) 入次数:点に入ってくる枝の数 出次数:点から出て行く枝の数 1 t 入次数:0 入次数:2 入次数:1 入次数:3 入次数:1 出次数:2 出次数:0 出次数:2 出次数:1 出次数:2 s 2 3 72 トポロジカル・ソート While グラフに点がある do 入次数=0の点を見つける (必ず一つは見つかる) その点とその点に入ってくる枝をグラフから消す 点を消した順に左から並べる やってみよう 73 トポロジカル・ソート2 3 1 t 入次数が0なので この点と この点から出る枝を消す 0 s 1 1 2 3 74 トポロジカル・ソート2 3 1 t 0 s 1 1 2 3 75 トポロジカル・ソート2 2 1 t 入次数の変化 する点がある 0 1 2 3 s 76 トポロジカル・ソート2 2 1 t 入次数が0なので この点と この点から出る枝を消す 0 1 2 3 s 77 トポロジカル・ソート2 2 1 t 0 1 2 3 s 78 トポロジカル・ソート2 1 1 t 入次数の変化 する点がある 0 3 s 2 79 トポロジカル・ソート2 1 1 t 入次数が0なので この点と この点から出る枝を消す 0 3 s 2 80 トポロジカル・ソート2 1 1 t 0 3 s 2 81 トポロジカル・ソート1 0 1 t 入次数の変化 する点がある s 2 3 82 トポロジカル・ソート1 0 1 t 入次数が0なので この点と この点から出る枝を消す s 2 3 83 トポロジカル・ソート1 0 s 1 2 t 3 84 トポロジカル・ソート1 t s 2 3 1 85 トポロジカル・ソート s 2 3 1 t 86 トポロジカル・ソートの擬似コード 点vの入次数をindegree(v)と書く indegreeの初期設定 1. indegree(v):=0, v V 2. for all v V do 3. for all w : vw E do 4. indegree(w):=indegree(w)+1 87 トポロジカル・ソートの擬似コード 入次数が0である点のリストをLISTと書く LISTの初期設定 1. LIST:=empty 2. for all v V do 3. if indegree(v)=0 then LIST : LIST v 4. 88 トポロジカル・ソートの擬似コード トポロジカル・ソート 1. indegreeの初期設定 2. LISTの初期設定 3. while LISTが空でない do 4. LISTから適当に点vを選択し,vを左詰めで並べる 5. for all w : vw E do 6. indegree(w):=indegree(w)-1 7. if indegree(w)=0 then LIST : LIST v 8. 89 Ford法の高速化(アイデア) トポロジカル・ソートを用いるとFord法を高速化できる. なぜか? トポロジカル・ソートされた順にポテンシャル を更新すれば,あともどりがなくなる (つまり,ポテンシャルは1回だけ更新すれば良い)から やってみよう 90 大名の例題 1 1 t 10 s -5 3 5 2 2 6 3 トポロジカル・ソートすると 91 Ford法(高速化版) 3 6 0 ∞ ∞ ∞ s 2 3 1 5 2 -5 ∞ 1 t 10 92 Ford法(高速化版) 3 6 0 ∞→5 ∞ ∞→10 s 2 3 1 5 10 2 -5 ∞ 1 t 点v(上の場合はs)の走査(scan) 1. for all w : vw E do 2. if yv+cvw<yw then 3. yw:=yv+cvw 93 Ford法(高速化版) 3 0 5 s 2 5 6 ∞→7 2 3 10→8 -5 1 ∞ 1 t 10 94 Ford法(高速化版) 3 6 0 5 7 s 2 3 5 2 8→2 -5 1 ∞→13 1 t 10 95 Ford法(高速化版) 3 6 0 5 7 2 s 2 3 1 5 2 -5 13→3 1 t 10 96 Ford法(高速化版) 最短路が 求まった 3 6 0 5 7 2 s 2 3 1 5 2 -5 3 1 t 10 ちゃんと書くと 97 Ford法(高速化版) ちゃんと書くと 点vの走査 1. for all w : vw E do 2. if yv+cvw<yw then 3. yw:=yv+cvw 宿場町vから直接 行ける宿場町の 価格を一度に見直す! 閉路を含まないグラフに対するFord法 1. グラフをトポロジカル・ソート(その順にv1,v2,…) 2. ポテンシャルyの初期設定 3. for i=1 to n do 4. 点viの走査 98 航空機を早く離陸させよう (閉路なし最短路問題の一例) 13分 15分 25分 27分 22分 飛行機の着陸から離陸まで最低何分かかるかな? 最短路問題に変形してみよう 99 航空機を早く離陸させよう 13分 15分 27分 点ではなく枝に長さを持つ ネットワークに変形 →閉路のない最短路問題に 25分 22分 ダミーの枝 -15 -27 -13 0 s -25 -22 t 100 航空機を早く離陸させよう 実際に計算してみよう -15 -27 -13 0 s -25 -22 t 着陸から離陸までの時間を,Ford法(高速化版)の適用 によって求めてみよう!(OHP利用) 101 ダイクストラ法 枝の費用が非負のネットワークに対する 最短路問題の代表的なアルゴリズム だいたいの教科書にはこれが最初に 書いてある. 102 ダイクストラ法(アイディア) 点の走査順序を「点が一度走査されたら、それ以降 走査する必要がない」ことが肝要 枝の費用が非負ならば,そのようにできる ポテンシャルが最小の点を走査すれば, その点はその後走査する必要はない(なぜか?) やってみよう 103 ダイクストラ法(やってみよう) ∞ 1 1 ∞ t 10 0 s 3 5 ポテンシャル 最小の点を走査 2 2 ∞ 2 6 3 ∞ 104 ダイクストラ法(やってみよう) ∞→10 1 1 ∞ t 10 0 s 3 5 6 2 2 ∞→5 2 3 ∞ 105 ダイクストラ法(やってみよう) 10 1 1 ∞ t 10 ポテンシャル 最小の点を走査 2 0 s 3 5 走査済み 2 5 2 6 3 ∞ 106 ダイクストラ法(やってみよう) 10→8 1 1 ∞ t 10 0 s 3 5 6 2 2 5 2 3 ∞→7 107 ダイクストラ法(やってみよう) 8 1 1 ∞ t 10 ポテンシャル 最小の点を走査 2 0 s 3 5 2 5 2 6 3 7 108 ダイクストラ法(やってみよう) 8 1 1 ∞→13 t 10 0 s 3 5 6 2 2 5 2 3 7 109 ダイクストラ法(やってみよう) 8 1 1 13 t 10 ポテンシャル 最小の点を走査 2 0 s 3 5 2 5 2 6 3 7 110 ダイクストラ法(やってみよう) 8 1 1 13→9 t 10 0 s 3 5 6 2 2 5 2 3 7 111 ダイクストラ法(やってみよう) 8 1 1 9 t 10 0 s 3 5 2 2 5 終了 2 6 3 7 112 ダイクストラ法(きちんと書くと) Dijkstra法 ポテンシャルyの初期設定 S:=V while Sが空でないならば do yvが最小の点 v S を選択 S:=S\{v} 点vの走査 113 演習問題1 1. Aから各点への最短路をDijkstra法で求めてみよう. A B 4 E 5 4 9 3 C F 3 10 注:無向グラフなので A->B,B->Aの両方向に 枝がある有向グラフと みなして解くこと! 3 D 4 114 演習問題2 自分の家(下宿もしくは実家)から大 学までの交通機関を表すネットワーク を作成し,最短時間のパスおよび最小 費用を求めよ. 注:移動時間や費用の計算には,「駅 前探検クラブ」http://ekitan.com/ などを利用して良いが,最短路は自分 で計算して求めること. 115 最短路問題を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), (2, 1)] cost= {(0, 1): 10, (1, 2): 2, (2, 3): 2, (1, V=range(5) 4): 1, (3, 4): 6, (0, 2): 5, (2, 1): 3} print "E=",E print "cost=",cost 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( m.addConstr( m.addConstr( m.addConstr( m.addConstr( -x[0,1] - x[0,2] == -1 , name="source") x[0,1] + x[2,1] -x[1,2] -x[1,4] ==0 , name="1" ) x[0,2] + x[1,2] -x[2,1] -x[2,3] ==0 , name="2") x[2,3] - x[3,4] ==0 , name="3") 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() 結果の出力 最適値 Optimal Value= 9.0 0 1 0.0 1 2 0.0 最適解 1 4 1.0 for c in m.getConstrs(): 2 3 0.0 print c.ConstrName, c.Pi 2 1 1.0 3 4 0.0 0 2 1.0 モデルオブジェクト m のgetConstrs()メソ source -5.0 ッドで制約オブジェクトのリストを得る 最適双対解 1 3.0 各制約 c に対して,ConstrNameで制約名, 2 0.0 Pi(π)で双対変数を得る! 3 2.0 sink 4.0 print "Optimal Value=",m.ObjVal for (i,j) in x: print i,j,x[i,j].X より一般的な実装 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} ) 隣接する点のリスト Out, Inの準備 V=range(5) Out= [[1, 2], [2, 4], [3, 1], [4], []] Out =[ [] for i in V ] In= [[], [0, 2], [1, 0], [2], [1, 3]] In =[ [] for i in V ] for (i,j) in E: 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 2025 ExpyDoc