最短経路探索法

『最短経路探索のアルゴリズム』
環境システム 松本 英敏
最短経路探索のアルゴリズムは、E.F.Moore が 1957 年に発表した後、多くの研究者によって発表さ
れている。その中で、どのアルゴリズムは最も効率的であるかは、E.W.Dijkstra の方法を始め、諸説
がある。しかし、その多くは Moore の基本的な考えに類似しており、今回は B.V.Martin および
E.W.Dijkstra によってプログラム化された
5
2
Moore のアルゴリズムについて紹介する。
7
4
2
Moore のアルゴリズムは1つの発生(起点)
3
10
ノードから他のすべてのノードまでの最短経
路樹(ツリー)を効率よく機械的に探索する
7
5
6
ものである。最短にする指標は、 時 間 、 コ ス
8
6
3
8
2
8
6
12
1
10
7
ト 、 距 離 、 危 険 度 等、その他いろいろなもの
7
2
4
5
7
を目的にあわせて指標とすることが出来るが、
6
ここでは時間を最短とする。今、右図のよう
9
な仮想ネットワークを考える。アルゴリズム
3
表 1 のリンク表は、発ノード i から
着ノード j までの所要時間を TLINK
として表している。
この場合 i ノードは番号の小さい方
から順番に並べる。
ツリー表は、各ノード j から発生ノ
ードまでの最短経路上で j に一番近い
ノードを jj、発生ノードからノード j
までの所要時間を TSUM とする。
[Step0]
リンク表は表1のように与え、最初
にツリー表をノード数だけ用意する。
また、jj は空欄にし、TSUM は非常に
大きな値を与えておく(表2)。
この例では、ノ ー ド 7 か ら ノ ー ド 9
へ の 最 短 経 路を抽出する。そこで発生
ノードは TSUM(7)=0.0 とする。
5
8
には、リンク表、ツリー表、連続表の 3 表が
必要になる。
2
4
図1 仮想ネットワーク
表1 リンク表
a
i
j
TLINK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
1
1
2
2
3
3
3
4
4
4
5
5
6
6
6
7
7
8
8
8
8
9
5
7
8
4
6
5
8
9
2
7
8
1
3
2
8
9
1
4
1
3
4
6
3
5.0
12.0
3.0
2.0
10.0
4.0
4.0
6.0
5.0
2.0
7.0
7.0
2.0
3.0
7.0
2.0
8.0
7.0
10.0
8.0
6.0
5.0
8.0
1
表2 ツリー表
j
jj
1
2
3
4
5
6
7
8
9
0
TSUM
9999.99
9999.99
9999.99
9999.99
9999.99
9999.99
0.0
9999.99
9999.99
表3 連続表
NSEQ
TSEQ
1
4
8.0
7.0
[Step1]
リンク表でノード 7 を発ノードとする全てのリンクを捜し、発ノードか
表4 ツリー表
ら着ノードまでの累積時間を計算する。この例では、リンク 17[7,1]、
j
jj
TSUM
1
2
3
4
5
6
7
8
9
7
8.0
9999.99
9999.99
7.0
9999.99
9999.99
0.0
9999.99
9999.99
18[7,4]であり、TLINK(17)=8.0、TLINK(18)=7.0 をノード 7 までの累積
時間 TSUM(7)=0.0 に加える。その結果、ノード 1,4 までの累積時間
TSUM(1),TSUM(4)は、それぞれ 8.0,7.0 となる。これらの値とツリー表
の j が 1,4 の時の TSUM を比較し(表2)、新しく計算された累積時間が
ツリー表の TSUM よりも小さければ、それらの TSUM および jj を新し
いものに置き換える。(表4)もし、大きい場合はそのままにしておく。
連続表には新たにノード 7 から出ているリンク着ノード 1,4 を NSEQ 欄、
7
0
着ノードまでの累積時間 8.0,7.0 を TSEQ 欄に書き込む。この過程が
図2のステップ 1 である。次に、連 続 表 の T S E Q の 最 も 小 さ い N S E Q
を 起 点として上記と同様な作業を続ける。この例では、表3よりノー
7
4
7
ド 4 の TSEQ が最も小さいので、ノード 4 からの経路を捜すことにし、
連続表の NSEQ=4,TSEQ=7.0 は除去する。(表5)
8
[Step2]
ステップ 1 で次ぎは、ノード 4 から経路を捜すことになったので、
1
ノード 4 に接続しているリンクをリンク表から捜すと、この例では
[4,2],[4,7],[4,8]であるが、リンク[4,7]は発生ノードに返る ことになる
図2 ステップ1
ので除く。ノード 4 までの TSUM(4)=7.0 にリンク[4,2],[4,8] の所要時間
TLINK(9)=5.0,TLINK(11)=7.0 を加えて、 TSUM(2)=12.0,TSUM(8)=14.0
表5 連続表
となる。ここで計算された TSUM とそれまでに TSUM に記録されている
NSEQ
TSEQ
1
8.0
値を比較すると、新しく計算された方が小さいので、jj(2)=4,jj(8)=4,
TSUM(2)=12.0,TSUM(8)=14.0 となる。連続表の NSEQ 欄に 2 と 8 を加え、
TSEQ をそれぞれ 12.0,14.0 とする。この過程が表6,7である。
また、図3がステップ 2 の状況である。
5
7
2
4
7
8
7
8
図3 ステップ2
1
表6 ツリー表
表7 連続表
j
Jj
TSUM
NSEQ
TSEQ
1
2
3
4
5
6
7
8
9
7
4
8.0
12.0
9999.99
7.0
9999.99
9999.99
0.0
14.0
9999.99
1
2
8
8.0
12.0
14.0
2
7
0
4
表8 連続表
NSEQ
TSEQ
2
8
12.0
14.0
[Step3]
連続表で、TSEQ の一番小さい NSEQ はノード 1 であり、このステップではノード 1 を経由した最
短経路を捜す。その時の連続表の NSEQ=1,TSEQ=8.0 を除く。その状況を表8に示す。リンク表より
ノード 1 を発ノードとするリンクは[1,5],[1,8]であり、発生ノードからノード 5 までの累積時間は、ノ
ード 1 までの TSUM(1)=8.0 に TLINK(1)=5.0 を加えると TSUM(5)=13.0、ノード 8 までの累積時間
は TLINK(3)=3.0 を加えると TSUM(8)=11.0 となる。ツリー表では、ノード 8 は jj(8)=4 を経由した経
路がすでに記載されており、その TSUM(8)=14.0 となっている。ノード 1 を経由した経路は 11.0 なの
で、この経路の方が短い。そこで、jj(8)のノード 4 を 1 に置き換えて、TSUM(8)=11.0 とする。連続
表では NSEQ 欄に 5,8、TSEQ 欄に 13.0,11.0 を記入する。その結果、NSEQ が 8 の時 TSEQ は 14.0
と 11.0 と 2 つになるので、大きい方の TSEQ=14.0 を連続表より除く。(表9、10)
以上のことより、発生ノード 7 からノード 8 までの最短経路は、7-4-8 から 7-1-8 に変わったことを
意味する。
表9 ツリー表
2
4
表 10 連続表
7
j
8
3
8
1
5
5
jj
1
2
3
4
5
6
7
8
9
7
4
7
1
0
1
TSUM
NSEQ
TSEQ
8.0
12.0
9999.99
7.0
13.0
9999.99
0.0
11.0
9999.99
2
5
8
12.0
13.0
11.0
表 11 連続表
NSEQ
TSEQ
2
5
12.0
13.0
図4 ステップ3
[Step4]
同様に、連続表で、TSEQ の一番小さい NSEQ はノード 8 であり、ノード 8 を経由した最短経路を
捜す。その時、連続表から NSEQ=8,TSEQ=11.0 を除く(表 11)。リンク表より、[8,1],[8,3],[8,4],[8,6]
であるが、ノード 1,4 は発生ノードに返るので[8,3],[8,6]が対象となる。発生ノードからノード 3,6 ま
で の 累 積 時 間 は 、 TSUM(8)=11.0 に TLINK(20)=8.0,TLINK(22)=5.0 を 加 え る と 、 そ れ ぞ れ
TSUM(3)=19.0,TSUM(6)=16.0 となる。そこで
ツリー表の TSUM に対して、ノード 3,6 とも新
表 12 ツリー表
j
しい TSUM の方が小さいので、jj および TSUM
1
2
3
4
5
6
7
8
9
を書き換える。
(表 12)また、連続表も同様に
表 13 の様に追加される。
[Step5]
連続表より、ノード 2 を除いて(表 14)、経
由したリンクは[2,4],[2,6]であるが、4 は発ノー
ドに返るので、発生ノードからノード 6 までの
3
jj
7
4
8
7
1
8
0
1
表 13 連続表
TSUM
NSEQ
TSEQ
8.0
12.0
19.0
7.0
13.0
16.0
0.0
11.0
9999.99
2
5
3
6
12.0
13.0
19.0
16.0
表 14 連続表
NSEQ
TSEQ
5
3
6
13.0
19.0
16.0
累積時間は、TSUM(2)=12.0 に TLINK(5)=10.0 を加えると TSUM(6)=22.0 となり、記載された TSUM
より大きくなるため、書き換えはしない。
表 15 ツリー表
[Step6]
連続表より、TSEQ の一番小さいノード 5 を取
j
jj
1
2
となるが、ノード 1 は発ノードであるため[5,3]の
3
みが対象となる。累積時間は、TSUM(5)=13.0 に
4
TLINK(13)=2.0 を加えると TSUM(3)=15.0 となり、 5
6
記 載 し て あ る TSUM よ り 小 さ い た め 、
7
jj(3)=5,TSUM(3)=15.0 となる。TSEQ も 19.0 を
8
9
15.0 に変更する(表 15,16)。ステップ 4∼6 は図
7
4
5
7
1
8
0
1
り除き、同様に経由したリンクを捜すと、[5,1],[5,3]
表 16 連続表
TSUM
NSEQ
TSEQ
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
9999.99
3
6
15.0
16.0
5∼7 の様に表される。
2
4
7
2
4
7
6
8
1
3
5
2
4
7
6
8
1
10
5
6
8
1
3
5
8
図5 ステップ4
2
5
3
図6 ステップ5
図7 ステップ6
[Step7]
連続表より、TSEQ の一番小さいノード 3 を取り除き、経由したリンクを捜すと対象は[3,9]のみで
あり累積時間は、TSUM(3)=15.0 に TLINK(8)=6.0 を加えると、TSUM(9)=21.0 となり、記載してあ
る TSUM より小さいため jj(9)=3,TSUM(9)=21.0 となる。連続表に追加。(表 17、18)
[Step8]
表 17 ツリー表
連続表より、TSEQ の小さいノード 6 を取り除
j
き、経由したリンクを捜すと対象は[6,9]のみであ
1
2
3
4
5
6
7
8
9
り累積時間は、TSUM(6)=16.0 に TLINK(16)=2.0
を加えると TSUM(9)=18.0 となり、記載の TSUM
より小さいため、jj(9)=6,TSUM(9)=18.0 に書き
換える。NSEQ,TSEQ も同様に書き換える。(表
19,20)
[Step9]
連続表より、目的のノード 9 に到達したので、
終了する。
4
jj
7
4
5
7
1
8
0
1
3
表 18 連続表
TSUM
NSEQ
TSEQ
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
21.0
6
9
16.0
21.0
表 19 ツリー表
2
4
6
7
8
1
3
5
6
9
表 20 連続表
j
jj
TSUM
NSEQ
TSEQ
1
2
3
4
5
6
7
8
9
7
4
5
7
1
8
0
1
6
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
18.0
9
18.0
図8 ステップ7
2
4
7
2
4
7
6
8
1
6
8
1
9
3
5
9
3
5
2
図9 ステップ8
図 10 ステップ9
ステップ 7∼9 を図示したのが、図 8∼10 になる。書き換えられた jj および TSUM は破線で表され
てきたが、この経路は完全に対象外で最終的には図 10 のようになる。図 10 およびツリー表により、
9-6-8-1-7 といった最短経路を読み取ることが出来る。以上が、B.V.Martin による方法である。
[Dijkstra の方法]
最短経路を求める計算の途中の段階で、ノードが次の3つの集合に分けられる。
A:起点ノードから最短経路が見つかったノード集合
B:集合 A に加えられる候補となるノード集合。この集合に含まれるノードは、集合 A 内の少な
くとも1つのノードから出るリンクの終点となっている。
C:残りのノード集合
リンクは、次の3つの集合に分けられる。
Ⅰ:起点ノードから集合 A 内のノードへの最短経路に含まれるリンクの集合。
Ⅱ:集合Ⅱに加えられる候補となるリンクの集合。この集合に含まれるリンクは、集合 B 内のノ
ードに向かっている。
Ⅲ:残りのリンクの集合。
5
同じ図 11 について Dijkstra 法を適用してみる。
[Step0]
リンク表は、さきほどと同じ表1を用いる。まず、
あるノードに連結しているリンク番号を表 1 より算
出したものが表 21 である。
個数
3
2
3
3
2
3
2
4
2
1
4
6
9
12
14
17
19
23
7
5
8
6
3
8
12
1
10
7
2
7
2
3
10
6
リンク番号
2
3
5
7
8
10
11
13
15
16
18
20
21
24
7
4
2
表 21 連結表
Node
1
2
3
4
5
6
7
8
9
5
2
8
6
4
5
6
7
2
9
3
5
8
4
図 11 仮想ネットワーク
22
[Step1]
全ノードを集合 C として初期化する。この例でもノード 7 からノード 9 への最短経路を抽出するこ
とにより、両方法の違いを理解する。まず、ノード 7 を起点ノードにするので、集合 A へ移動させる。
次に表 21 からその起点ノードにリンクしているノードを捜す。この例では、ノード 1,4 でありこれら
のノードは集合が C→B に変更され、jj および TSUM も前例と同様に書き込む。(表 22)
[Step2]
次に、集合 B の中で TSUM
表 22 ツリー表
が最も小さいノード 4 を集合 A
として同様にリンクしているノ
ードを抽出すると、ノード 2,8
となる。そこで同様に 2,8 の集
合は C であるから集合を C→B
に 変 更 し 、 jj お よ び 累 積 時 間
TSUM も書き換える。(表 23)
[Step3]
これも同様に、表 23 の集合 B
Node
1
2
3
4
5
6
7
8
9
集合
B
C
C
B
C
C
A
C
C
jj
7
7
0
TSUM
8.0
9999.99
9999.99
7.0
9999.99
9999.99
0.0
9999.99
9999.99
表 23 ツリー表
Node
1
2
3
4
5
6
7
8
9
集合
B
B
C
A
C
C
A
B
C
jj
7
4
7
0
4
TSUM
8.0
12.0
9999.99
7.0
9999.99
9999.99
0.0
14.0
9999.99
の中で、最短経路の TSUM を選ぶとノード 1 の集合が B→A に変更され、リンクしているノード(5,7,8)
の中で集合 C のノード 5 は、集合を C→B に変更され、jj および累積時間 TSUM が書き換えられる。
また、その他の集合の 7,8 は、TSUM を計算し、記載されているものより小さい場合に jj および TSUM
を書き換える。(表 24)
[Step4]
集合 B の中で最短経路はノード 8 であり、集合が B→A、リンクされているノードの中で 3,6 のみが
集合 C→B になる。記載されている TSUM より小さいため、jj と TSUM を書き換える。(表 25)
6
[Step5]
表 24 ツリー表
集合 B で最短経路は、ノード
2 であり、集合が B→A、リン
クされているノードはどれも累
積時間が大きくなるため変化し
ない。(表 26)
[Step6]
集合 B で最短経路は、ノード
5 であり、集合が B→A、リン
クされているノードは 1,3 であ
るが累積時間が小さいノード 3
のみ書き換える。(表 27)
[Step7]
集合 B で最短経路は、ノード
3 であり、集合が B→A、リン
クされているノードは、 5,8,9
であるが累積時間が小さくなる
ノード 9 のみ書き換えられる。
(表 28)
Node
1
2
3
4
5
6
7
8
9
集合
A
B
C
A
B
C
A
B
C
jj
7
4
7
1
0
1
TSUM
8.0
12.0
9999.99
7.0
13.0
9999.99
0.0
11.0
9999.99
表 25 ツリー表
Node
1
2
3
4
5
6
7
8
9
表 26 ツリー表
Node
1
2
3
4
5
6
7
8
9
集合
A
A
B
A
B
B
A
A
C
jj
7
4
8
7
1
8
0
1
TSUM
8.0
12.0
19.0
7.0
13.0
16.0
0.0
11.0
9999.99
集合
A
B
B
A
B
B
A
A
C
jj
7
4
8
7
1
8
0
1
TSUM
8.0
12.0
19.0
7.0
13.0
16.0
0.0
11.0
9999.99
表 27 ツリー表
Node
1
2
3
4
5
6
7
8
9
集合
A
A
B
A
A
B
A
A
C
jj
7
4
5
7
1
8
0
1
TSUM
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
9999.99
[Step8]
集合 B で最短経路は、ノード
6 であり、集合が B→A、リン
クされているノードは、累積時
間の小さいノード 9 のみ書き換
えの対象になる。(表 29)
[Step9]
集合が B なのは、ノード 9 の
みで、集合は B→A となる。他
は変化しない。
表 28 ツリー表
Node
1
2
3
4
5
6
7
8
9
集合
A
A
A
A
A
B
A
A
B
jj
7
4
5
7
1
8
0
1
3
TSUM
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
21.0
表 29 ツリー表
Node
1
2
3
4
5
6
7
8
9
集合
A
A
A
A
A
A
A
A
B
jj
7
4
5
7
1
8
0
1
6
TSUM
8.0
12.0
15.0
7.0
13.0
16.0
0.0
11.0
18.0
すべてのノードで集合 B がなくなり、空集合になるため終了する。
以上が手順である。Martin も Dijkstra も同じ結果になるが、プログラム上のアルゴリズムに違いが
あるように思われる。自分の目的に合った使い方を心がけよう。
参考文献
・土木情報処理の基礎「FORTRAN77 に即して」pp.231-236 土木学会。
・交通需要予測ハンドブック pp.100-102 土木学会
・交通ネットワークの分析と計画と最新の理念と応用 pp.33-38 土木計画学研究委員会
7