graph algorithms part 1
TRANSCRIPT
グラフアルゴリズムその1
2017-11-07
宮川 拓
グラフアルゴリズムを勉強しよう
背景
機械学習の部分問題として出てきがち
ex.物体検出 , 形態素解析 , . . .
最短経路問題が多そう?
概要2/57
参考文献
コルメン他
『アルゴリズム・イントロダクショ
ン』第3版(2013, 近代科学社)
3/57
アジェンダ
グラフに関する用語と概念
グラフの探索
トポロジカルソート
単一始点最短経路問題(次回)
4/57
グラフに関する用語と概念
5/57
グラフの構成
グラフ:=
頂点 (vertex) と、
頂点同士をつなぐ辺 (edge) 、
からなるデータ構造
6/57
グラフの構成
グラフG=(V, E)
ただしV={v0, v1, ... v5},
E={e0, e1, ... e5}
v0 v1
v2
v5v3 v4
e0
e1
e2
e3
e4
e5
e6
7/57
有向グラフと無向グラフ
有向グラフ
無向グラフ
8/57
有向グラフと無向グラフ
無向グラフは有向グラフの特殊な場合
とみなすこともできる
つまり、(v0, v1)がG.Eの元であるとき、
必ず(v1, v0)もG.Eの元であるような有
向グラフ、と考えれば良い
9/57
道 (path)
列‹v0, v1, ... vk›について、
すべての(v[i], v[i+1])がG.Eの元で
あれば、頂点v0からvkへの道
(path)と呼ぶ
10/57
閉路 (cycle)
最初の要素と最後の要素が同じ頂点で
あるような道を閉路(cycle)と呼ぶ
11/57
有向非循環グラフ (DAG)
閉路のない有向グラフを有向非循環グ
ラフ (Directed Acyclic Graph)と
呼ぶ
木はDAGの特殊な場合とみなせる
ただひとつの頂点(根)から他のすべて
の頂点へ道がたどれること
根以外の頂点への根からの道はひとつだ
けであること
12/57
プログラム上のグラフの表現
隣接リスト
0 1
2
53 4
0 → {2, 3}
1 → {1}
2 → {1, 3, 4}
3 → {}
4 → {2}
5 → {}
省メモリだけど転置グラフが作りづらい
13/57
プログラム上のグラフの表現
隣接行列
0 1
2
53 4
0 0 1 1 0 0
0 1 0 0 0 0
0 1 0 1 1 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
メモリ食いだけど転置グラフが作りやすい
14/57
グラフの探索
15/57
グラフの探索
幅優先探索
コード
辺の重みがすべて等しいときの、
最短経路問題の解法とかんがえられる
深さ優先探索
コード
トポロジカルソートなどの解法の一部と
して使われる
16/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹a›
0 ∞
∞
∞ ∞∞
17/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹c, d›
0 ∞
1
1 ∞∞
18/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹d, b, e›
0 2
1
1 2∞
19/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹b, e›
0 2
1
1 2∞
20/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹e›
0 2
1
1 2∞
21/57
グラフの探索
幅優先探索
a b
c
fd e
Queue = ‹›
0 2
1
1 2∞
22/57
グラフの探索
深さ優先探索
a b
c
fd e
まずはaの探索を開始
23/57
グラフの探索
深さ優先探索
a b
c
fd e
aが指している先であるcの探索を開始
24/57
グラフの探索
深さ優先探索
a b
c
fd e
cが指している先であるbの探索を開始
25/57
グラフの探索
深さ優先探索
a b
c
fd e
bが指している先(b自身)はすでに探索済み
したがってbは探索終了
26/57
グラフの探索
深さ優先探索
a b
c
fd e
27/57
グラフの探索
深さ優先探索
a b
c
fd e
28/57
グラフの探索
深さ優先探索
a b
c
fd e
29/57
グラフの探索
深さ優先探索
a b
c
fd e
30/57
グラフの探索
深さ優先探索
a b
c
fd e
cが指している先に未探索の頂点はない
したがってcは探索終了
31/57
グラフの探索
深さ優先探索
a b
c
fd e
aも探索終了
32/57
グラフの探索
深さ優先探索
a b
c
fd e
多くの場合深さ優先探索では全頂点をなめる
トポロジカルソート等での使いやすさのため
33/57
グラフの探索
深さ優先探索
a b
c
fd e
34/57
トポロジカルソート
35/57
トポロジカルソート
トポロジカルソート:
DAGの頂点を、前後関係を保って一列
に並べること
36/57
トポロジカルソート
ある日の家事のDAG
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
37/57
トポロジカルソート
ア サ リ の 砂 抜 き
ア ン チ ョ ビ す り つ ぶ す
ニ ン ニ ク み じ ん 切 り
ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る
ア ン チ ョ ビ つ ま み 食 い
洗 濯 物 を 取 り 入 れ る
白 身 魚 と ア サ リ と ト マ ト を 投 入
蓋 を し て 蒸 す
ア イ ロ ン 掛 け る
手順の例
38/57
トポロジカルソート
アルゴリズム
全頂点を深さ優先探索する
探索が終わった頂点から順番に、
結果列の先頭に追加する
コード
39/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ∅
40/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ∅
41/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ∅
42/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : 蓋 を し て 蒸 す
43/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
44/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
45/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ つ ま み 食 い → 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
46/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
47/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
48/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
49/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ つ ま み 食 い → 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
50/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : 洗 濯 物 取 り 入 れ る → ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ つ ま み 食 い → 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
51/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : 洗 濯 物 取 り 入 れ る → ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ つ ま み 食 い → 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
52/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア サ リ の 砂 抜 き → 洗 濯 物 取 り 入 れ る → ア イ ロ ン 掛 け る
→ ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
53/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア サ リ の 砂 抜 き → 洗 濯 物 取 り 入 れ る → ア イ ロ ン 掛 け る
→ ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
54/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ す り つ ぶ す → ア サ リ の 砂 抜 き → 洗 濯 物 取 り 入 れ る
→ ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
55/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ す り つ ぶ す → ア サ リ の 砂 抜 き → 洗 濯 物 取 り 入 れ る
→ ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ つ ま み 食 い
→ 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
56/57
トポロジカルソート
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り つ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ と
ニ ン ニ ク を 炒 め る
蓋 を し て
蒸 す
白 身 魚 と ア サ リ と
ト マ ト を 投 入
ア ン チ ョ ビ
つ ま み 食 い
洗 濯 物
取 り 入 れ る
ア イ ロ ン
掛 け る
結 果 : ニ ン ニ ク み じ ん 切 り → ア ン チ ョ ビ す り つ ぶ す → ア サ リ の 砂 抜 き
→ 洗 濯 物 取 り 入 れ る → ア イ ロ ン 掛 け る → ア ン チ ョ ビ と ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ つ ま み 食 い → 白 身 魚 と ア サ リ と ト マ ト を 投 入 → 蓋 を し て 蒸 す
57/57