離散数学

Similar documents
離散数学

Microsoft PowerPoint - mp13-07.pptx

Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - 06graph3.ppt [互換モード]

Microsoft PowerPoint - DA2_2017.pptx

グラフの探索 JAVA での実装

人工知能入門

計算幾何学入門 Introduction to Computational Geometry

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2018.pptx

PowerPoint Presentation

Microsoft PowerPoint - mp11-06.pptx

alg2015-6r3.ppt

Microsoft PowerPoint - DA2_2018.pptx

memo

データ構造

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

橡ボーダーライン.PDF

Microsoft PowerPoint - algo ppt [互換モード]

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Taro-スタック(公開版).jtd

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Taro-再帰関数Ⅲ(公開版).jtd

C#の基本2 ~プログラムの制御構造~

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

PDF


木村の理論化学小ネタ 体心立方構造 面心立方構造 六方最密構造 剛球の並べ方と最密構造剛球を平面上に の向きに整列させるのに次の 2 つの方法がある 図より,B の方が A より密であることがわかる A B 1

生命情報学

7 章問題解答 7-1 予習 1. 長方形断面であるため, 断面積 A と潤辺 S は, 水深 h, 水路幅 B を用い以下で表される A = Bh, S = B + 2h 径深 R の算定式に代入すると以下のようになる A Bh h R = = = S B + 2 h 1+ 2( h B) 分母の

umeda_1118web(2).pptx

Microsoft PowerPoint - mp11-02.pptx

人工知能論 第1回

メソッドのまとめ

Taro-cshプログラミングの応用.jt

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

F-08E

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

ネットワークフロー入門

Microsoft Word - 実験4_FPGA実験2_2015

DVIOUT

フローチャートの書き方

Microsoft Word - 2_0421

Taro-ポインタ変数Ⅰ(公開版).j

東邦大学理学部情報科学科 2014 年度 卒業研究論文 コラッツ予想の変形について 提出日 2015 年 1 月 30 日 ( 金 ) 指導教員白柳潔 提出者 山中陽子

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

Microsoft Word - NumericalComputation.docx

memo

Microsoft Word - VBA基礎(3).docx

プログラム言語及び演習Ⅲ

PowerPoint プレゼンテーション

Transcription:

離散数学 最小全域木と最大流問題 落合秀也

今日の内容 最小全域木 プリムのアルゴリズム 最大流問題 フォード ファルカーソンのアルゴリズム

今日の内容 最小全域木 プリムのアルゴリズム 最大流問題 フォード ファルカーソンのアルゴリズム

最小全域木を考える Minimum Spanning Tree Problem ラベル付 ( 重み付 ) グラフ G(V, E) が与えられたとき ラベルの和が最小となる全域木を作りたい 全域木 G(V, T) Vのすべての頂点で構成される木 最小全域木 e T Ce 9 を最小にする T で作られる G(V,T) 7 (Ceは辺 eのラベル ) 例 : ラベルを地点間の配線コストとするこのとき 全地点がつながるネットワークを最小コストで配線したい 6

プリム法による最小全域木の作成 H a 6 7 e g b f c 6 h 7 d 考え方 任意の頂点を選び開始点 とする T を辺の集合とする ( 開始時は空とする ) H の領域まで最小全域木の一部を作っているとする H から出る辺のうち そのコストが最小の辺で接続する頂点を H に取り込む (*) その辺を T に追加する H=V となるまで (*) を繰り返す G(V,T) が最小全域木となる

プリムのアルゴリズム : 素直な実装 H := {} T := {} While H V min_length :=, min_edge := null Foreach (u,v) : u H, v H-V If min_length > length(u,v) Then, min_length := length(u,v) min_edge := (u,v) EndIf EndFor T.add ( min_edge ) H.add( min_edge.right ) EndWhile e a 6 7 g 時間計算量 O(nm) この疑似コードの場合 b f c 6 h 7 6 d

練習 プリム法により 以下のグラフに対する最小全域木を作成せよ 9 7 6 7

. 開始点を選ぶ 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (6/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (7/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9 6

. コストが最小の辺を選び接続する頂点を取り込む (9/) 6 7 9 7

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9 9

. コストが最小の辺を選び接続する頂点を取り込む (/) 6 7 9

. 最小全域木の完成 6 7 9

プリムのアルゴリズム ( 改良版 ) ダイクストラ法で工夫したように ダイクストラ法とよく似た形に実装できる H := {} T := {} While H V min_length :=, min_edge := null Foreach (u,v) : u H, v H-V If min_length > length(u,v) Then, min_length := length(u,v) min_edge := (u,v) EndIf EndFor T.add ( min_edge ) H.add( min_edge.right ) EndWhile 改良前 Foreach v V (v ) c[v] :=, prev[v]:=null Q.add(v) EndFor c[] := While Q i not empty u := Q.extractMin() Foreach v in Adj[u] If c[v] > length(u,v) Then, c[v] := length(u,v) prev[v] := u ( Q.changeKey() ) EndIf EndFor EndWhile 改良後

確認 プリム法 ( 改良版 ) により 以下のグラフに対する最小全域木を作成してみよ 6 7 9 While Q i not empty u := Q.extractMin() Foreach v in Adj[u] If c[v] > length(u, v) Then, c[v] := length(u, v) prev[v] := u EndIf EndFor EndWhile

プリム法 : 計算量の考察 While 文の内部は n 回実行される Foreach 文の内部は nm 回実行される 実装によっては O(nm) となりえる Q にリストや配列を使う場合 Q.extractMin() に O(n) の時間を要する Q.extractMin() は n 回呼び出される O(n ) While Q i not empty u := Q.extractMin() Foreach v in Adj[u] If c[v] > length(u, v) Then, c[v] := length(u, v) prev[v] := u ( Q.changeKey() ) EndIf EndFor EndWhile Q に 分ヒープを使う場合 Q.extractMin() に O(log n) の時間を要する Q.extractMin() の呼び出しは n 回ある O(n log n) c[v] の更新に伴うヒープの組換え処理に O(log n) の時間を要する c[v] の更新は m 回発生する O(m log n) O( (n+m) log n )

今日の内容 最小全域木 プリムのアルゴリズム 最大流問題 フォード ファルカーソンのアルゴリズム

最大流問題 Maximum Flow Problem ラベル付 ( 重み付 ) グラフ G(V, E) が与えられたとき 流入点 から流出点 t までの総流量を最大化したい 辺のラベルの意味 : 流量の容量 ( 最大量 ) 運べる荷物の量 流せる水の量 送れるパケット数 このとき に流れ込む流量 = t から流れ出る流量 ( グラフの外から見た場合 ) から流れ出す流量 = t に流れ込む流量 ( グラフの中で見た場合 ) である 6 この量の最大値 ( とそのときのフロー ) をどう求めればよいか? 9 7 6 t

最大流問題 : 解決へのアプローチ u v t -t 間の適当な道を考え その流量上限 ( 最小容量 ) を算出する 赤色のケース 赤色のフローを流しても余っている別の -t 間の道を考える ( 逆向きは押し戻すと考える ) この際の 流量上限を算出する 青色のケース 上記を繰り返していけば 徐々に総流量が増えてやがてそれ以上流せなくなる これにより ネットワーク全体の最大流が求まるのではないか?? 7

フローの定式化 辺を流れるフロー u f(u,v) f(u, v) C(u, v) v f(v, u) = - f (u, v) -C(v, u) f(u, v) C(u, v) ただし C(u, v) = C(v, u) とは限らない C(u,v) C(v,u) 頂点への流入量と流出量 v 流入量 : f in (v) = u V, f(u,v)> f(u,v) 流出量 : f out (v) = w V, f(v,w)> f(v,w) v,t であれば f in (v) = f out (v) 総流量 : total(f)= f out () = f in (t)

フォード ファルカーソン法 Ford-Fulkeron Algorithm 考え方 -t 間の何らかの道を考え その流量の上限 u v u v t フローに沿って - t を算出する そのフロー f を容量 C から引いた値 ( 残余容量 ) を計算し グラフから差し引く そのグラフを Gf とする Gf に対して 同様のことをする ( つまり -t 間の何らかの道を考え その流量の上限を算出し 総フローを算出し 容量から差し引いて ) -t 間の道が無くなれば 終了 フローに沿って ( さらに ) - u v -t 間の道がなくなった ( 容量 > の弧についてのみ考える ) t このとき差し引いている総フローが求める最大流 9

練習 フォード ファルカーソン法を用いて 以下のフローグラフにおける から t への最大流を求めよ t (*) 辺のラベルは 容量 ( 向きは問わない ) を表している

容量を まず有向グラフに置き換える t

-t 間の適当な道を考え その流量の上限を算出する t

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし Gf を作成する t 7

Gf において -t 間の適当な道を考え その流量の上限を算出する t 7

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし Gf を作成する 6 (*) 本来は f(u,v) はフローの総和道 P によって作られるフローではない t 9

Gf において -t 間の適当な道を考え その流量の上限を算出する 6 t 9

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし Gf を作成する 6 7 (*) 本来は f(u,v) はフローの総和道 P によって作られるフローではない t 9

Gf において -t 間の適当な道を考え その流量の上限を算出する 6 ( ここでは複数回まとめて表示 ) 7 t 9

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし Gf を作成する 6 6 (*) 本来は f(u,v) はフローの総和道 P によって作られるフローではない t 9

Gf において -t 間の (Cf> の辺で作られる ) 道が存在しないので 終了 6 6 t 9

最大流は以下のフローの総和である t

各辺が以下のフローを通すとき からtに対して最大流が得られる その流量は t t

フォード ファルカーソンのアルゴリズム Max-Flow(G(V,E),, t) e E, f(e)= While any path from to t exit in reidual graph Gf P := imple-path(,t) in Gf f := augment(f, P) Update f to be f Update Gf to be Gf EndWhile Return f 道の発見には 幅優先探索 深さ優先探索 などが用いられる フロー f に道 P を流れるフローの上限分を追加し それを f に代入する処理 このアルゴリズムの停止性について考察してみよ

今日の内容 最小全域木 プリムのアルゴリズム 最大流問題 フォード ファルカーソンのアルゴリズム

今後の予定 6 月 日 : 平面的グラフ 地図 7 月 日 : スキップグラフ 7 月 日 : 内容未定 7 月 日 : 試験 : : @ 講義室 ( 未確定 )