
ChatGPT & Pythonで始めるJR最長経路検索【関西版】
概要
JRの大都市近郊区間を利用する場合、JRの規則上最短経路を取らなくてもルールを守りさえすれば遠回り乗車が可能となります。
ルールとはこちら。
重複しない限り乗車経路は自由に選べますが、途中下車はできません。
簡単ですね。
ただ大阪や東京となるとその地域は広大で、調べるのも中々手間です。そこでChatGPTとPythonを利用し、二点の駅を与えると最長経路を調べるプログラムを作成しました。
なお、試行錯誤の最中なのでソースコードの提供はありません。
ちなみに遠回りきっぷに興味のある方は下記の記事をご覧ください。
準備したもの
1.Pythonが実行できる環境
2.ライブラリ:networkx/matplotlib
3.データ:駅間の距離データ/駅の位置情報
1.Pythonが実行できる環境
当然必要なので割愛!
2.ライブラリ:networkx/matplotlib
networkxとはグラフとネットワークを分析するためのライブラリです。グラフとはノード(点)とエッジ(枝)から構成されており、まさに今回の例が分かりやすい一例です。
広い意味ではもっと複雑な意味を持ちますが、目的達成にはそこまで理解する必要が無いのでそういうことにしておきます。偉い人ごめんなさい。
matplotlibは得られた結果を図に描写するためのライブラリです。
無くても問題ないですが、より視覚的に参照できるようになります。
3.データ:駅間の距離データ/駅の位置情報
これが重要。
先ほどお伝えしたnetworkxを利用するためにはノードとエッジの情報を提供する必要があります。
今回の場合、駅をノード、駅間の情報(区間、距離)をエッジとして提供しました。プログラムは距離を探索し、その最長ルートを検索します。
駅の位置情報については可視化する際に利用します。
実行結果
例えば下記の条件で実行しました。
開始:京橋
終了:天王寺
その結果は下記の通りです。

これを可視化すると下記の通りです。

良い感じかもしれない。大阪市内の複雑なところを拡大します。

見事に京橋、天王寺間を遠回りしている様子がよくわかります。

この辺怪しいのですが、これは駅の位置情報に不具合がありますね。プログラムの実行結果としては
徳庵 -> 放出 -> 高井田中央 -> 新加美
となっているので、同じ駅、ルートを二度通っている訳では無さそうです。
今後の課題
作成するうえで面倒なのがデータの準備。各駅の位置情報や距離感などを調べるのが大変手間です。そのため今回は重要なノード(駅)とその前後のノードに限ってデータを作成しました。
ただしこれはそういったAPIがあるかもしれないので解決することが可能かもしれません。
そしてデータがあったとしても次に面倒なのがエッジの情報を作るところ。
いまのところ、下記のようなデータを作成しています。
No From To 距離
1 播州赤穂 坂越 4.5
2 坂越 西相生 6
3 西相生 相生 4.5
4 相生 竜野 10.5
これを1駅ずつ作っていくと、関西のどこの駅でも検索できるようになります。何かAPIを利用して一括で取得できる仕組みを構築できればと思います。
最終的に関西近郊区間全駅制覇できれば、遠回り切符の検索が楽になりますね!
また進捗があれば報告したいと思います。