【カーナビの仕組みが分かる!】経路探索生物「ダイクストラ」
《誕生》
また1匹、交差点に経路探索生物が産み落とされた。
生物の名は「ダイクストラ」。
英語の綴りは「Dijkstra」と書いたりする。勘で綴るのは、ほぼ無理だ。
さてこのダイクストラ、此度は「近くのコンビニを2つ見つけて」と頼まれた。「道順もよ」と、創造主は生物使いが荒い。
でもダイクストラは文句を言わない。少し品種改良をしてもらっているからだ。「ノーマルのままだと、物語を書くのが一手間増えるのよ」と創造主は言っているのだが、ダイクストラはそのことを知らない。
《1巡目》
早速、ダイクストラは、4つの子を産み出した。
始まりの交差点は十字路。4つの道がつながっているからだ。
そして最初のダイクストラは消滅した。
生まれたダイクストラたちは、各道を進む。
それぞれ進む。
そのお腹から、青い糸を吐き出しながら。
そして。
1匹目のダイクストラは15進むと、新たな交差点に差し掛かり、その歩みを止めた。
2匹目は10進んで、別の交差点に着いた。
3匹目の道は、とても曲がりくねっていた。進んでも進んでも、交差点に着かない。
60進んで、ようやく着いた。
でも着いたら疲れは吹き飛んだ。
そこにはコンビニAが、あったから。
4匹目は20進んで、交差点に着いた。
こうして皆、互いに異なる交差点に着いた。
《2巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
離れていても、不思議な力で、比べることができる。
そして今回は2匹目の糸が、10と、もっとも短かった。
故に。
確定した。
始まりの交差点から、2匹目のいる交差点にたどり着くには、2匹目の通ってきた道が最も近道であると、確定したのだ。
なぜって、ほかの3匹は始まりの交差点から10より遠くに離れてる。どんな近道を通ったって、2匹目より短い糸で、この交差点にはたどり着けない。
こうして確定したので2匹めの出した青い糸が、赤色に変わる。
それは確定意味する、赤い色。
そして2匹目は、5匹目と6匹目を産み出して、消滅した。
2匹目のいた交差点は三叉路。つながる道は3つ。
でも、そのうち1つは、赤い糸がある。
だから3匹では無く、2匹を産んだ。
ノーマルだと、ここで3匹産む。
新たに生まれたダイクストラは、道を進む。ひたすら進む。
それぞれ、その腹部から青い糸を出しながら、
やがて。
5匹目のダイクストラは、25進んで交差点に着いた。始まりの地からは35になる。
6匹目も交差点に着いた。こちらは20、始まりの地からは30になる。
そして5匹目と6匹目は同じ交差点に着いた。
ダイクストラは1つの交差点に1匹しか生きられない。
始まりの地に近いダイクストラが生き残る。
だから生まれたばかりの5匹目は消滅した。5匹目の出した青い糸も消滅した。
《3巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
今度は1匹目の糸が、15と、もっとも短かった。
また、確定した。
始まりの交差点から1匹めのいる交差点にたどり着くには、1匹目の通ってきた道が最も近道であると、確定したのだ。
1匹めの出した青い糸が、赤色に変わる。
そして1匹目は、7匹目と8匹目を産み出し、消滅した。
1匹目のいた交差点につながる道は3つ。そのうち1つは、赤い糸がある。
生まれたダイクストラは道を進む。青い糸を出しながら。
7匹目は、55進んで交差点に着いた。始まりの地からは70。そしてそこには、コンビニBがあった。
8匹目も着いた。こちらは25進んだ。始まりの地からは40。
でもそこには4匹目がいた。4匹目は始まりの地から20だった。
ダイクストラは1つの交差点に1匹しか生きられない。
始まりの地に近いダイクストラが生き残る。
だから8匹目は消滅した。出した青い糸も消滅した。
《4巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
コンビニ2つ見つかってるが、それでも長さを比べ始める。
もっと近い、道があるかも。
もっと近い、コンビニあるかも。
そして今度は4匹目の糸が、20と、もっとも短かった。
確定。
4匹目の糸が、青から赤へ。4匹目は、9匹目と10匹目を産んで、消滅した。
4匹目のいた交差点につながる道は3つ。そのうち1つは、赤い糸がある。
生まれたダイクストラは、青い糸を出しながら、道を進む。
9匹目の到着した交差点には誰もいないが、赤い糸が届いていた。なので9匹目は消滅した。その青い糸も消滅した。
10匹目は35進んで交差点についた。そこにはコンビニAがあった。3匹目もいた。
10匹目は始まりの地から55。3匹目は始まりの地から60。
だから3匹目は消滅した。その青い糸も消滅した。
こうしてコンビニAには、更に近道があったことが分かった。
《5巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
そして今度は6匹目の糸が、始まりの交差点から30と、もっとも短かった。
確定した。
始まりの交差点から6匹めのいる交差点にたどり着くには、「6匹目と、その親の2匹目の通ってきた道」が最も近道であると、確定したのだ。
だってほかの2匹の生き残りは、始まりの交差点から55と70。どんな隠れた近道があっても、6匹目より短い糸で、この交差点に来ることはない。
6匹目の出してきた青い糸が、赤色に変わる。
6匹目は、11匹目と12匹目と13匹目を産み、消滅した。
6匹目は変形の交差点にいた。つながる道は4つ。だから赤い糸の道を除いて、3匹産んだ。
11匹目は30進んで、コンビニBのある交差点に着いた。始まりの地からは60。
7匹目がいたが、その糸は70。7匹目は青い糸とともに消滅した。
コンビニBの始まりの地からの長さも、70から60へと、短くなった。
だからコンビニ2つ見つかってても、ダイクストラは活動を続ける。
12匹目は10進んだだけで、コンビニCのある交差点についた。始まりの地からは40。
だからコンビニ2つ見つかってても、活動を続けてきたのである。それは3つ目を見つけても、同じこと。
13匹目の到着した交差点には誰もおらず。でも赤い糸が、届いていた。
13匹目は、青い糸と一緒に、消滅した。
《6巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
そして生まれたばかりの12匹目の糸が、始まりの交差点から40と、もっとも短かった。
確定した。
始まりの交差点から12匹めのいる交差点にたどり着くには、「12匹目と、その親の6匹目と、更にその親の2匹目の通ってきた道」が最も近道であると、確定した。
12匹目の出してきた青い糸が、赤色に変わる。
そして故に。
コンビニCの経路も確定した。この交差点にはコンビニCがあった。これ以上の近道は存在しない。始まりの交差点から、40であることが確定した。
最初に確定したので、もっとも近いコンビニであることも確定。ただ同じ距離の別のコンビニがあるかどうかまでは、まだ分からない。
12匹目は、14匹目と15匹目を産み、消滅した。
12匹目のいた交差点は三叉路。赤い糸のある道を除いて、2匹を産んだ。
14匹目は10進んで交差点に着いた。そこには誰もいなかった。赤い糸も届いていない。
15匹目は50進み、コンビニAのある交差点についた。全部で90。
そこには10匹目もいた。その長さは55。
だから15匹目は消滅した。その青い糸も消滅した。
コンビニAの距離は、今度は更新されず。でも今が最短かどうかは、まだ分からない。
《7巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
そして今度は14匹目の糸が、始まりの交差点から50と、もっとも短かった。
確定。
始まりの交差点から14匹めのいる交差点にたどり着くには、「14匹目と、その親の12匹目と、更にその親の6匹目と、更に更にその親の2匹目の通ってきた道」が最も近道であると、確定した。
14匹目の出してきた青い糸が、赤色に変わる。
14匹目のいた交差点は三叉路。16匹目と17匹目を産んで、14匹目は消滅した。
16匹目は25進んで交差点に着いた。誰もおらず、赤い糸もなかった。
17匹目は10進んで交差点に着いた。そこにはコンビニDだけがあった。
コンビニBとコンビニDは、どちらも始まりの交差点から60。もしこれらが60のままで、創造主が「3つ見つけて」と言っていたら、3位が2つあることになる。創造主はこうした場合、「早いもの勝ちで良いわよ」とダイクストラに告げていた。
《8巡目》
ダイクストラは、皆が止まると、互いに糸の長さを比べ始める。
今回は10匹目の糸が、始まりの交差点から55と、もっとも短かった。
確定した。
始まりの交差点から10匹目のいる交差点にたどり着くには、「10匹目と、その親の4匹目の通ってきた道」が最も近道であると、確定したのだ。
そしてこの交差点にはコンビニAがある。2つ目のコンビニの経路と距離が確定したのだ。同じ距離のコンビニが別にあるかもしれない。でも2番であることは確定した。創造主は早いもの勝ちで良いと言っていた。
《成就》
ダイクストラたちは創造主に、「コンビニ2つ見つけた」と報告した。
創造主は、コンビニCとそれに繋がる赤い糸、コンビニAとそれに繋がる赤い糸を取り出し、黙って去っていった。
ダイクストラたちは怒らない。創造主が利用者のために、これから別の作業をすると知っているから。
「道に迷わないと良いね」
「早く着けると良いね」
そうして全てのダイクストラは、消滅した。
おしまい
おまけ:各道路のコスト
ここまでお読みいただき、ありがとうございました。そしてお疲れさまでした。
なお単純に「A地点からB地点の近道を探し出す」場合は、「A地点を始まりの地にして、B地点に赤い糸が引かれれば、それが近道」になります。
「A*(エースター)アルゴリズム」は、このようにB地点の位置が明確な場合は、「ダイクストラ法」よりも効率良く近道を探し出せるように改良されています。しかし、本作のように位置が不明な目標への近道を探したい場合には、使用することができません。