最短経路導出

最短経路導出論理を作成した。考えた案は次の通り。


1)デフォルトで、前回作成した最短経路予想を最短経路とする
2)駅をノード化して、子ノード(複数)と親ノードを持てるようにする
−後楽園−本郷三丁目−御茶ノ水
  |
−飯田橋−九段下−
  |
市ケ谷
なら、
後楽園(親)
本郷三丁目(子1)
御茶ノ水(子1の子)
飯田橋(子2)
九段下(子2の子1)
市ケ谷(子2の子2)
のように。
3)開始駅を決めたら、隣接駅全部のノードを作り、子ノードとして追加
4)再帰処理で順次ノードを作るが、子ノードを追加してはいけないルールに合致したら追加しない
[4-a]親ノードに存在する駅(逆戻り、無限ループの防止)
[4-b]行き止まりの駅に着いたが目的地の駅と異なる場合
[4-c]現時点の最短経路と比べて運賃が高くなる場合、または同額だが積算キロ数が多くなる場合
5)運よく目的地の駅に着いたら、[4-c]の論理を使って最短経路と比べる。
最短経路より安い・短い場合は更新する
以上で、子ノードの追加が終わった時点で計算が終了するだろう、と考えて実装した。テストしていたら、東京メトロ内で最長区間の和光市→西船橋を計算したところでブラウザごとフリーズしてしまった。全然計算が終わらない。
で、3)の処理を変えて

3改)隣接する乗換駅 or 終点のノードを作り、子ノードとして追加
上の例なら乗換駅のない本郷三丁目とお茶の水はカット
と、ノードの数を減らしてみたら、劇的に早くなった。和光市→西船橋でも0.1秒くらいで終わる。
ただテストで10件ほど計算してみたけれどどれも最短経路予想と違わない結果になるのが気になる。何か問題あるんじゃないか。
これ以上のデバッグは後回しにして、次回は運賃表示とマップの保存に対応しよう。
仕事が苦しいので他のプログラム作成に情熱を燃やして発散しようと思っていたら仕事以外でもデバッグばかりする羽目になってしまった。


コメントを残す

メールアドレスが公開されることはありません。