Dijkstra
法によるグラフ最短路問題
グラフとは
・グラフ
G(Graph)
は、節点の集合
V(V
ertex)
と、
それを結ぶ枝
E(Edge)
の集合から
成る(下図)
・
G=(V
,E
)
で表される
:
vertex
:
edge
グラフ
グラフには、それぞれの枝に向きのある有向グラフ
(direc
ted
graph)
、向きのない無向グラフ
(undirec
ted
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.Dijkstra
によって提案された
•
全ての枝の重みが非負の場合にのみ適用できる
•
手順:
1.始点のラベルを
0
、それ以外の点のラベルを無限大とする
2.最短路の長さが確定した点のラ
ベルを
確定ラベル、それ以
外の点を一時ラベルと置き、次に一時ラベルの中で最小の点
x
をみつける
3.2で見つけた点を確定ラベ
ルに変更し、隣接する点の一時
ラベルを、
「一時ラベルの値と、点
x
のラベルの値とその間の
枝の重みを足したものの小さいほう」の値に変更し、確
定ラベ
ルにする
4.1,2,3を繰り返し、
すべての点が確定ラベルになった
ら終
了.その結果,各点の確定ラベ
ルが始点からの最短路の長さ
になっている。
Dijkstra
法による最短経路検索
下図の有向グラフにおいて,
[13]
から
[4]
まで
の最短経路
を、
Dijkstra
法を用いて求めてみる
1
234
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)(14,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,9
0)(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
であることが判明す
る
ノードデータに対して一歩手前のノード
番号
を記憶させておき、終点から順に遡ることで
最短距離だけでなく,最短経路も求めること
ができる