『最短経路探索のアルゴリズム』 環境システム 松本 英敏 最短経路探索のアルゴリズムは、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
© Copyright 2024 Paperzz