スライド 1: Dijkstra法によるグラフ最短路問題
スライド 2
スライド 3: グラフとは
スライド 4
スライド 5: 最短経路問題
スライド 6: 最短経路問題のクラス
スライド 7: Dijkstra法
スライド 8: Dijkstra法による最短経路検索
スライド 9
スライド 10
スライド 11
スライド 12
スライド 13
スライド 14
スライド 15
スライド 16
Dijkstra
法によるグラフ最短路問題
グラフ
理論の
基礎概
念と、
Dijkstra
法
による
最短経路
探索
アル
ゴリズ
ムの理
解
【学習内容の構成】
1.
グラフの
基礎
:節点
(V
ertex)
と枝
(Edge)
の集合
G=(V
,E)
に
よる構造表現
2.
グラフ
の種類
:有向グラフ、無向グラフ、重み付きネット
ワーク
N=(G,w)
3.
Dijkstra
法
:始点から全節点への最短経路を求めるア
ルゴリズム(
1959
年、
E.Dijkstra
提案)
4.
実装手順
:未調査・調査中・調査済の
3
リストを用いたラ
ベル確定による探索
•
前提:グラフの概念、集合の基礎知識
•
意義:カーナビ等の経路探索シス
テムの原理理解、アル
ゴリズム設計の基礎習得
グラフとは
・グラフ
G(Graph)
は、節
点の集合
V(V
ertex)
と、
それを結ぶ枝
E(Edge)
の集合から
成る(下図)
・
G=(V
,E
)
で表される
:
vertex
:
edge
グラフ
グラフには、それぞれの枝に向きのある
有向グラフ
(directed
graph)
、向きのない無向グラフ
(undi
rected graph)
、枝に重み
w
のついたネットワーク
(Network)N=(G,w
)
などがある.重み
w
というのは、節点間の距離みたいなもの.
これらのグラフは、アルゴリズム解析の道具やデー
タ構造とし
て用いられる.例えば、グラフを用いた問題として一筆書き出
来るかの問題や,最短経路探索
の問題などがある.
有効グラフ
:
vertex
:
edge
ネットワーク
:
vertex
:
edge
15
10
24
26
16
11
12
15
最短経路問題
・最短経路問題は、グラフ問題の一つ
・重みつきグラフ
G=(V
,E)
が与えられた
時に、任
意の
2
頂点を結ぶ経路の中から
、辺の重みの総
和が最小のものを求めるもの
・
カーナビで今の場所から目的地への最短の道
順の探索などに利用
最短経路問題のクラス
•
最短経路問題は、解を求める範囲によっ
て三つのクラスに分けることができる
1.出発点
A
から目的地
B
への最短経路を求める
2.出発点
A
から
V
の中の各頂点への最短経路の
コストを全て求める
代表的なアルゴリズム:
Dijkstr
a
のアルゴリズム
3.
V
の中の全
ての頂点対の最短経路のコストを
求める
代表的なアルゴリズム:
Flo
yd
のアルゴリズム
Dijkstra
法
•
1
節点から全節点への最短経路を求めるアルゴリズム
•
1959
年に
E.D
ijkstra
によって提案された
•
全ての枝の重みが非負の場合にのみ適用でき
る
•
手順:
1.始点のラベルを
0
、それ以外の点
のラベルを無限大とする
2.最短路の長さが確定した点のラ
ベルを
確定ラベル、それ以
外の点を一時ラベルと置き、
次に一時ラベルの中で最小の点
x
をみつける
3.2で見つけた点を確定ラベ
ルに変更し、隣接する点の一時
ラベルを、
「一時ラベルの値と、点
x
のラベルの値とその間の
枝の重みを足したものの小さいほう」の値に変更
し、確定ラベ
ルにする
4.1,2,3を繰り返し、
すべての点が確定ラベルに
なったら終
了.その結果,各点の確定ラベ
ルが始点からの最短路の長さ
になっている。
Dijkstra
法による最短経路検
索
下図の有向グラフにおいて,
[13]
から
[4]
までの最短経路
を、
Dijkstra
法を用い
て求めてみる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
10
12
31
34
1
5
12
8
40
30
20
30
30
9
24
33
10
32
15
12
32
17
16
10
まず、このグラフについてのデー
タを与える
(
始点・・・
Ns=13,
終点・・・
Ng=4)
存在する区間データを与える
区間データ・・・
(Ni,Nj,2
点間の距離
)
1 2 10
2 1 10
2 3 12
3 2 12
:
15 16 30
以下の
3
つのリストを用意する
・リスト
A
(
未調査リスト
)
・リスト
B (
調査中リスト
)
・リスト
C (
調査済リスト
)
1.
区間データからノードデータ
(Ni,Ns
からの最短
距離
)
を生
成しリスト
A
に登録、最短距離の初期
値は
∞
リスト
A:(1,∞)(2,∞)(3,∞)
・・・
(16,∞)
2.
始点
Ns
に関するノードデータを未調査リストから
調査済リストへ移動、その際ノードデータの最短
距離を
0
に更新
リスト
A:(1,∞)(2,∞)(3,∞)
・・・
(16,∞)
リスト
B
リスト
C(13,0)
3.
区間データを元に、始点
Ns
から直接到達可能
なノードを調べ、そのノードに関するノードデー
タをリスト
A
からリスト
B
に移動しノードデー
タを
更新
リスト
A:(1,∞)(2,∞)(3
,∞)
・・・
(16,∞)
リスト
B(9,32)(1
4,30)
リスト
C(13,0)
4.
以下の項目をリスト
B
が空になるまで繰り返す。
(a)
リスト
B
から最短距離最小のノード
Nm
を選び
C
へ移動
リスト
A:(1,∞)(2,∞)(3,∞
)
・・・
(16,∞)
リスト
B(9,32)
リスト
C(13,0)(14,30)
(b)Nm
から直接到達可能なノード
Ni
を探
し、
Ni
がリスト
A
にあればリスト
B
へ移動
リスト
A:(1,∞)(2,∞)(3,∞)
・・・
(16,∞)
リスト
B(9,32)(10,∞)(15,∞)
リスト
C(13,0)(14,30)
(c)Ni
が
B
にあれば、
Ns
から
Nm
の最短距離に区間
距離
Nm
,Ni
を加えた値と、既知の最短距離
Ns,Ni
を比べ、より小さい方を新たな
最短距離と
する
リスト
A:(1,∞)(2,∞)(3,∞
)
・・・
(16,∞
)
リスト
B(9,32)(10,30+17)(15,30+20)
リスト
C(13,0)(14,30)
5.
リスト
B
が空に成った時点で
A,B,C
について以下のような
リストが得られる。
リスト
A:
リスト
B:
リスト
C:
(4,120)(8
,102)(12,90)(3
,89)(16,80)(2
,77)(1,72)
(6,68)(7,6
7)(1
1,52)(15,5
0)(10,44)
(5,42)(9,3
2)
(13,0)(14
,30)
ここでリスト
C
に、始点
Ns
から各ノードへの最
短距離が入っていることになり、ノード
13
から
4
までの最短距離が
120
であることが判明す
る
ノードデータに対して一歩手前のノード番号
を記憶させておき、終点から順に遡ることで
最短距離だけでなく,最短経路も求めること
ができる