
スルッとKANSAIエリアの最長片道経路を求める 【その1】
お世話になっております。'はまなす'です。
1. スルッとKANSAIの最長片道経路

『スルッとKANSAI』は近畿圏を中心とした鉄道・バス事業者で構成するスルッとKANSAI協議会が展開していた磁気式共通乗車カードシステムで、2018年まで2府7県で約1,500kmの鉄道路線への乗車が可能でした。
また、2016年まで*は『スルッとKANSAI 3dayチケット』や『スルッとKANSAI 2dayチケット』等、スルッとKANSAIエリア内のフリーきっぷ(周遊券)が発売されており、1枚のきっぷで関西の多くの私鉄を乗り回すことができました。(*2016年以後もエリア限定版や訪日外国人向けは販売中。)
現在、磁気カード式の『スルッとKANSAI』は利用終了となっていますが、非接触式ICカード『PiTaPa』がスルッとKANSAIエリアにおいて利用可能となっています。

このスルッとKANSAIエリアの中で、「最も長い一筆書きのルート(最長片道経路)はどこか?」について、以前から気になっていました。
今回、プログラミングにより最長片道切符経路の導出を試みた先人である、JNOT様やPsyduck様のサイトを参考にpythonを用いて"スルッとKANSAIエリアの最長片道経路"を求めてみましたので、算出プロセスも含めてご紹介いたします。
(なお、今回のスルッとKANSAI最長片道経路探索は、正確にはスルッとKANSAIではない近鉄の愛知県/三重県区間も含めて行います。)
(参考にした先人達のWebページ↓)
2. スルッとKANSAIの最長片道経路 算出の流れ
「スルッとKANSAIの最長片道経路」について、今回は2パターンの最長片道経路を算出しますが、その全体の流れを簡単に記載しておきます。
1. 探索するエリアの全駅間のデータセットを作成する
2. 全駅間のデータセットを「必要な駅間」のみのデータセットに加工する
3. スルッとKANSAI最長片道経路の有力候補の見当をつけ、経路距離を算出
4. 3.で求めた有力候補が最長経路であることを証明する
↑↑↑
ここまでで1パターン目の「スルッとKANSAI最長片道経路」を特定。
5. 駅名が違う乗換え駅を同一駅扱いするよう改め、最長片道経路を再算出
↑↑↑
これにより2パターン目「スルッとKANSAI"真の"最長片道経路」を算出。
3. 駅間データセットの作成
スルッとKANSAIの最長片道経路は、Graphillionを使用するコードをpythonで動かして算出します。

まず、最長片道経路特定用のコードで使用する「必要な駅間のデータセット(以下、「必要駅間データセット」)」について、スルッとKANSAIエリアのデータセットを作成します。
3-1. スルッとKANSAIエリア 全駅間データセットの作成

(https://ja.wikipedia.org/wiki/%E8%BF%91%E9%89%84%E5%B1%B1%E7%94%B0%E7%B7%9A)
「必要駅間データセット」の作成の前に、まずスルッとKANSAIエリアの「全駅間データセット」を用意します。
「全駅間データセット」は、スルッとKANSAIエリア内の鉄道路線の"全駅間"とその"駅間距離"を一つにまとめたデータセットですが、インターネット上には残念ながら使えそうなデータがないため、Wikipedia等から情報を持ってきてまとめる必要があります。
ほとんどの鉄道路線のWikipedia個別ページには、「駅一覧表」など、駅間距離がまとめられた"表"が掲載されていますので、この表を有効活用するのが良いでしょう。
(国土数値情報等にこのデータがあれば助かるのですが…)

3-2. スルッとKANSAIエリア 必要駅間の考え方
2-1で用意した「スルッとKANSAIエリアの全駅間データセット」を「スルッとKANSAIエリアの必要駅間データセット」に加工します。
最長片道経路探索対象エリア内の駅について、以下の3タイプの駅を考えます。
①分岐駅
②分岐駅の隣駅
③盲腸線の終端駅
この時、最長片道経路の算出において必要な駅間距離は「①〜①間」「①〜②間」「②〜②間」「①or②〜③間」のみなので、これら4種類の駅間データのみに「全駅間データセット」を加工したものが「必要駅間データセット」です。
※「盲腸線」とは、起点もしくは終点のどちらかが他の路線に接続していない行き止まりの路線のこと。路線網の中であたかも盲腸(虫垂)のように見えることからこのように俗称。(詳しくは次回【その2】にて。)
「必要駅間データセット」について分かりにくいので補足すると、


fig.1の阪急電鉄の路線において、最長片道経路を求めたい場合に考慮しなければいけない「必要駅間」は、fig.2に載っている駅だけにまで絞り込める、ということです。
(この時、
①は 桂/淡路/十三/石橋/塚口/西宮北口/夙川
②は 西京極/上桂/洛西口/上新庄/下新庄/柴島/崇禅寺…
③は 河原町/嵐山/北千里/天神橋筋六丁目/梅田/箕面/伊丹…
となります。)
3-3. スルッとKANSAIエリア 必要駅間データセットの作成
「全駅間データセット」を「必要駅間データセット」に加工するコードは上記のPsyduck様のコードをそのまま使用しました。

なお、上述のコードで「必要駅間データセット」を作成する際は2地点間の距離を二重に登録することがないように強制的な分割駅を定める必要があります。

スルッとKANSAIエリアにおいては、「くいな橋(京都~竹田のため)」と「中崎町(天神橋筋六丁目~南森町)」を分割駅として設定します。

また、この後最長片道経路を求めるコードを動かす際、必要駅間データセットに他のどの路線とも接続しない"孤立線"が含まれている場合、エラーが出てしまいます。
そのため、近鉄田原本線や比叡山坂本ケーブルなどの孤立線の端駅を別の路線と接続するように駅名を修正します。(厳密に駅名が一致する場合のみ乗換可能とする場合、孤立線の駅間データを削除します。)

ここまでの作業で「スルッとKANSAIエリアの必要駅間データセット」が完成しました。
4. 最長片道経路の算出(次回に続く)
長くなりましたので、今回の記事はここまで。
次回以降の記事で「スルッとKANSAIエリアの最長片道経路」を"2種類"算出します。