Pythonでメトロ・都営全ラッチ外のりかえ使用280円最長ルートを求める(理論・規則編)

求めるに至った動機

虎ノ門ヒルズ駅開業や多くの徒歩連絡駅の追加など、変化が多々あったため、それらを加味してステイホーム中に経路を求めてやろうと思ったため。

計算の方法

Python+pulpを用いて整数計画問題として解く

  • pulpPython上で使える整数計画問題を表現するためのライブラリ(でいいと思う)です。

問題の定義

280円とは

  • メトロの初乗り運賃170円と都営地下鉄の初乗り運賃180円から、両者を乗り継ぐ際に適用される乗継割引70円を引いた額(170+180-70=280)増税前は260円(だった気がする)

改札外乗換駅について

  • 東京メトロ都営地下鉄には駅構内の都合から一度改札を出て乗り換えをする必要のある駅がある。また、開設当初は無関係だった駅同士を乗客の利便性向上を目的に乗換駅に指定する例もある。まずはその一覧を示す
駅名 路線
メトロ
上野 銀座と日比谷
三越前 半蔵門と銀座
上野広小路-仲御徒町 銀座と日比谷
大手町 丸ノ内と東西と千代田と半蔵門
池袋 丸ノ内、有楽町と副都心
飯田橋 東西と有楽町、南北
日比谷-有楽町 日比谷、千代田と有楽町
淡路町-新御茶ノ水 丸ノ内と千代田
渋谷 銀座と副都心
新宿三丁目 丸ノ内と副都心
人形町-水天宮前 日比谷と半蔵門
築地-新富町 日比谷と有楽町
銀座-銀座一丁目 銀座、丸ノ内、日比谷と有楽町
虎ノ門-虎ノ門ヒルズ 銀座と日比谷
都営
蔵前 浅草と大江戸
馬喰横山-東日本橋 新宿と浅草

改札外のりかえが可能となる条件

  • これらの駅で乗り換えをするには条件がある。それは、発駅からその駅までの最短運賃が乗車券の金額以下であることである。例えば、表参道から渋谷までの最短運賃は170円である。今回使う乗車券の運賃は280円であるため改札を出場できる。しかし、これが西船橋からの場合渋谷までの最短運賃は290円であるため、280円の乗車券では改札を出られない。これは、乗り換えのためとはいえこのケースでの出場を許してしまうと、ここで客が乗車を終えた際に運賃をとりっぱぐれるためである。しかし、このルールが区間によっては行きと帰りで運賃が異なるという現象を生むことにもなる(詳しくは、デスクトップ鉄のデータルームをご覧ください)

メトロと都営を乗り継ぐ条件

  • 一般に連絡乗車券は、発駅Aから接続駅Bまでとそこから何円区間、といった表記がなされることがほとんどである。例えば、横浜線新横浜から菊名のりかえ東急線130円区間、といった具合である。しかしながら、メトロ、都営の連絡乗車券は独特の表示をしている。発駅Aから都営地下鉄線連絡何円区間、という表示である。もうお気づきだろうが、接続駅の指定がないのである。メトロも都営も都内に蜘蛛の巣のように張り巡らされており両者の接続駅も無数に(なんと30駅も)あるからである。このおかげで我々は特に意識することなく最も便利な経路を選んで乗車をすることができる。
  • しかしながら、運賃の計算となると少しややこしい。ここで、メトロ、都営連絡で運賃が280円となる条件を考える。先に挙げた通り、この運賃はメトロ初乗りと都営初乗りの合計なわけだから、メトロ発駅-都営接続駅の最短運賃が170円かつ都営接続駅-都営着駅の最短運賃が180円、またはその逆に都営発駅-メトロ接続駅-メトロ着駅が同様にそれぞれ初乗りとなればいいわけである。当然ながら、この接続駅は計算上の接続駅なので、それ以外の接続駅でも発駅からの最短運賃が足りていれば改札外に出て乗り換えできる。

これらを踏まえた発着駅の条件

発駅条件

  • 発駅から280円以内にすべての改札外乗換駅がある
  • 発駅から初乗り以内に一つ以上のメトロ・都営接続駅がある
  • 上の条件を満たす接続駅のいずれかを通ればもう一方の社局(以下後発と呼ぶ)のすべての改札外乗換駅まで後発の初乗り以内に到達できる

    着駅条件

  • 発駅から接続駅まで初乗り以内、その接続駅から着駅までが初乗り以内となるルートがある

これらを満たすルートの中で最長のものを求めればよい

次の記事で具体的な計算に使うアルゴリズムなどを解説します