Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
グラフ探索
+
分割統治法
グラフの諸概念 • グラフとは(有限個の)点=頂点と(有限個の)線=辺,エッジを結んだもの
• 頂点(vertex),辺(edge)
• 隣接(adjacent):1本のエッジの両端にある頂点は隣接している
• 近傍(neighbors):隣接している頂点集合
• 路(path):ある頂点から他の頂点に至る一連のエッジ
• 単純路(simple path):同じ節点を2回以上使わない路
• サイクル(cycle):最初と最後が同じ節点である単純路.
• ツリー(tree):サイクルのないグラフ.
• 連結グラフ:拡張点から他の全ての頂点へのパスが必ず1つ以上あるグラフ←→不連結グラフ
• 有向グラフ:エッジに方向性あがる←→無向グラフ
• 重み付きグラフ:エッジに重きがある場合
• ネットワーク:重み付き有向グラフ
オイラーの一筆書き定理
ロシアのケーニヒスベルグという町を流れるプレーゲル川には、中央に島があって、その島と川の両岸との間には7つの橋がかかっていたという。
昔から、その町に住む人々が議論していた問題は、「7つの橋すべてを、1つの橋を複数回渡ることなくすべて渡り終えるような橋の渡り方を見つけられるのか?」 であった。
ケーニヒスベルグの橋
陸地を頂点,橋をエッジとすればどのようなグラフ表現になるか?
ケーニヒスベルグの橋のグラフ表現 (世界最初のグラフ応用例?)
• グラフの全ての辺をちょうど1回ずつ通って、開始点に戻るような道を オイラー閉路という. オイラー閉路が存在すれば、そのグラフを一筆書きすることができる.
• Gがオイラー閉路を持つ ⇔ Gの全ての頂点に対して、繋がっている辺の 数は偶数本である
ケーニヒスベルグの橋のグラフ表現 (世界最初のグラフ応用例?)
別の橋のグラフ表現
別の橋のグラフ表現
グラフの適用事例
• 具象事物とそれらの接続関係を抽象的に表現したものとしてグラフを利用する
• 物理的なつながり
町と道,都市と空路,Web,...
• ビジネスプロセス,作業工程計画,...
グラフの表現
• グラフ→隣接行列で表現
A
B
C
D
A B C D
A
B
C
D
1 1 1 0
1 1 1 1
1 1 1 1
0 1 1 1
節点の分類と隣接節点の取り扱い
• 既に訪問した節点集合:T
• Tの隣接節点集合:F
• それ以外の節点集合:U
Fの選択方法によりグラフ探索が変わる
(1)深さ優先探索(DFS, Depth First Search)
(2)幅優先探索(BFS, Breadth First Search)
深さ優先探索,縦型探索 DFS
• 節点を辿れる限り深く探索し続ける
①出発点の隣接節点集合をリストFに記録する
②リストFの第一要素の節点aを選びaを訪れる
③aとaの隣接節点集合を置換する
(二重登録があればリストの後ろを削除する)
④Fの要素が空になるまで②と③を繰り返す
DFSの実行例
1
3
2
4
5
6
7
8
9
10
11
15
14
13
12
1
2
3
4
5
6
7
8
9
10
隣接節点集合F
DFSの実行例
1
3
2
4
5
6
7
8
9
10
11
15
14
13
12
1 2 5 3
2 4 5 3
4 7 8 5 3
隣接節点集合F 訪問先
幅優先探索,横型探索 BFS
• 隣接節点を順次訪問し,横方向に節点を辿る
①出発点の隣接節点集合をリストFに記録する
②リストFの第一要素の節点aを選びaを訪れる
③リストFよりaを削除し,aの隣接節点集合をリストFの最後に追加する
(二重登録があればリストの後ろを削除する)
④Fの要素が空になるまで②と③を繰り返す
BFSの実行例
1
3
2
4
5
6
7
8
9
10
11
15
14
13
12
1
2
3
4
5
6
7
8
9
10
隣接節点集合F
BFSの実行例
1
3
2
4
5
6
7
8
9
10
11
15
14
13
12
1 2 5 3
2 5 3 4
5 3 4 8 9 6
3
隣接節点集合F
Divide&Conquer(分割統治法)
• 全体を部分に分割し,各部分を解き,その結果を統合して解を得る方法
• 全体の問題構造と部分の問題構造が同型であり,再帰的(recursive)という.
• 再帰法:処理手順を自分自身を使って定義する方法.
階乗関数 f(n)=n! の再帰的定義
f(3) 3 f(2)
2 f(1)
1 f(0)
f(0)=1
n=0 -> f(n)=1
n not =0 -> f(n)=n x f(n-1)
最大値を再帰的に求める
アルゴリズム?
(通常はコストが大きいので使わない)
データ集合をS,データ数をn
n=1 → それが最大値
n=2 → 2数を比較して大きいほうが最大値
n>2 → Sを二分して(S1,S2),S1とS2の最大値を求める
再帰的図形:コッホ曲線
1.線分を3等分する
2.真中の部分を正三角形を埋め込んだ形に曲げる
3.できた4辺について,1と2の同じ操作を適用する
上記操作を繰り返し適用した結果得られる曲線
→コッホ曲線と呼ぶ
→n回操作後の長さは?
→n回操作後の面積は?
→どの部分を拡大しても同じ図形が現れる再帰的な図形
→自己相似性を持つ図形
→フラクタル
シルピンスキーのギャスケット?