最長大回り経路を計算する

目次

  1. 最長大回り経路
  2. 最長経路の探索方法
  3. 最長大回り経路の分類
  4. 制約式を考える
  5. 乗換の分類と制約式化
  6. 制約式生成プログラムを作る
  7. 計算してみる
    1. JR東京近郊区間130円最長大回り経路
    2. 東京メトロ160円最長大回り経路
    3. 都営地下鉄170円最長大回り経路
    4. Suica/PASMO初乗り最長大回り経路

1.最長大回り経路

大回り乗車として知られている特殊な乗車方法があります。 例えば、東京→有楽町の乗車券で、逆回りに東京→上野→池袋→品川→有楽町と乗ったりすることです。 こういう乗車方法は、ある一定のルールを守れば鉄道会社との契約違反にはなりません。

概ね、大回り乗車を可能にしているルールは、次の3つがあります。

  1. JRの大都市近郊区間大回り乗車
  2. 環状経路を持つ私鉄の大回り乗車
  3. ストアードフェアカードを用いた大回り乗車

JRの大都市近郊区間については、大都市近郊区間であれば、券面の経路以外を乗車しても良い、という規則(選択乗車と言います)を利用しています。 ストアードフェアカード(ICカードも含む)については、一般的に、自動改札機による処理を前提としていることと、 乗車時には降車駅やそこに至る経路が決まっておらず乗車経路が特定不可能なため、 最安値で計算するという規則(最安運賃計算と言います)になっていることを利用しています。 私鉄については、会社によって違いますが、選択乗車か最安運賃計算のどちらかの規則があることが多いです。(ない場合もあります。)

ここでは、大回り乗車のうち、最も距離のかせげるルートは何かを計算しよう、ということを考えています。 できるだけ路線の形に左右されない、一般的な解法を考えて、いろんなタイプの大回り乗車に適用可能なように考えます。 こうして乗れる経路を、ここでは「最長大回り経路」と呼びます。

2.最長経路の探索方法

最長乗車経路を求める方法としては、整数計画法を用いると、 比較的短時間で、数学的に最長であることが保証できる経路を求められることが知られています。 インターネット上での初出は葛西隆也氏による最長片道きっぷの経路算出でしょう。

最長大回り経路については、近藤英明氏によって、EXCELによる最長片道ルート探索の一環として、 東京近郊区間の130円、150円ルートや東京メトロの160円での最長大回り経路が調べられています。 近藤英明氏はExcel付属のソルバーを用いて誰でもお手軽に、というところを目指した功績が大きいでしょう。

しかし、その後葛西隆也氏によって紹介されたGLPKというソルバーと、これを用いた葛西隆也氏作のLOP toolkitを使うことで、 整数計画法で最長経路の算出はさらに楽になりました。Excelのものよりかなり高速に解くことができます。 (その代わり、数式ファイルは自作しなくてはなりませんが。)

今回は、このGLPKを用いて最長大回り経路の求め方を考えてみようと思います。

3.最長大回り経路の分類

葛西隆也氏による分類ですが、JRでは一枚の乗車券で乗車できる経路の形状は、L型、O型、P型をしています。 その他の私鉄でも、だいたい同じでしょう(O,P型が存在しないかもしれません)。 このうち、L型とO型が最長大回り経路に成り得ます。 P型の大回り、6の字大回りと言うほうが一般的ですが、この是非については、かなり意見が割れており、 一応「相当理論武装すれば可能であるが、やめておくのが無難」という扱いになっているようです。 なので、ここでは対象外とします。

また、O型経路ができる条件もかなり限られています。 JRの近郊区間の場合、駅Aから駅B,Cを経由して駅Aに戻ってくるX円の経路が存在すれば、X円でA→B→C→A以外の経路(A→D→E→F→...→A)に乗れます。 X円を初乗り運賃とした場合、秋葉原、御茶ノ水、神田しかこの駅A,B,Cに当てはまりません。 O型経路が最長になるとしたら、このX円の経路内にある駅ならどこを発着駅にしても構いません。 私鉄ではO型が可能な規則を持つところもあるようです。

一番ありがちなのは、L型経路でしょう。ただ、この経路はもう少し分類できます。 一般的には、大回り経路というと、Cのような形をしたルートをイメージするかもしれません。 しかし、それだけではありません。8の字を少し切った、Sのようなルートも大回り経路に成り得ます。 最短経路と大回り経路がクロスできるところがポイントです。

そこで、L型大回り経路と、最短経路をあわせた形がどうなるか分類しました。
L型大回り経路と最短経路の形状の分類
黒線が最長大回り経路、ピンクの線が最短経路です。このぐらいの形状をとり得ると思います。 以下では、ピンクの線を「券面経路」、この経路を乗るのに必要なきっぷで乗れる最長距離を「券面距離」と言います。 (例えば、券面経路が東京→有楽町なら、運賃130円なので、券面距離は3kmです。) あとは、8や呂を縦につなげた、
うねうね経路
こんな経路もあるかと思います。(さすがに初乗りではないでしょうが、1000円以内でできる大回りとか考えるとこういうのが出てくる可能性はあります。)

さて、ここまで分類しましたが、目的としては、発着駅候補を絞り込みたいのです。 左上のOを1箇所切っただけのものをこれ以後C型と呼びますが、L型のうちC型以外は、発着駅以外に、分岐駅が必ず1つ以上あります。 そして、発着駅は最寄りの分岐駅から、券面距離以内に確実にあります。 さらに言うと、券面距離から、分岐駅からすべての隣駅への距離のうち最短のものを引いた距離以内にあります。 分岐駅から隣駅への距離がすべて券面距離の半分を超えている場合、その周辺駅は発着駅にはなり得ません。 こうして周辺駅を取り除いた後、隣の分岐駅まで券面距離以上離れている分岐駅も発着駅にはなり得ません。 例えば、東京近郊区間で130円(3km)大回りを考えるとき、 新宿の周辺で発着駅になりうる駅を探すため3km以内にある駅を集めてくるとこれぐらいです。

信濃町2.4km
千駄ヶ谷1.7km
原宿2.2km
代々木0.7km
新大久保1.3km
高田馬場2.7km
大久保1.4km
東中野2.5km

新宿から最寄りの駅は代々木の0.7kmです。つまり、ここであげた全駅が発着駅候補になるわけではなく、 3.0km-0.7km=2.3km以内の駅しか発着駅候補になりませんから、信濃町、高田馬場、東中野が候補から外れます。 (もっとも、信濃町は代々木を基準とした発着駅候補として復活します。)

これが、品川の周辺だとこうなります。

田町2.2km
大井町2.4km
大崎2.0km
五反田2.9km
西大井3.6km

最寄りは大崎の2.0kmですが、品川を挟むようにとるとあと1.0kmしかありません。1.0km以下のところはないので、 ここに挙げたすべての駅が発着駅候補からはずれます。 さらに、品川も3km以内に分岐駅はないため、品川も発着駅にはならず、分岐駅としてだけ残ります。

C型以外のL型は、こうして選んだ発着駅候補と分岐駅だけをグラフの頂点として最長経路を求めればよいことになります。 券面距離が分岐駅間の長さに比べて小さいことが多い場合は、発着候補駅のフィルタとしてはそこそこ有効なはずです。

では、最長大回り経路がC型である場合、どうすれば計算できるでしょうか? たとえばこんな路線だった場合、C型が最長になってしまいます。しかも、前述の発着駅絞り込みから外れてしまいます(券面距離3kmの場合)。
C型>L型の例
最長はL型0.8+1.9+10.0+0.5=13.2kmでも、L型0.8+2.0+0.5+10.0=13.3kmでもなく、C型2.0+1.9+10.0=13.9kmです。

C型最長は、長いO型をいくつか求めて、それらの最短の区間を1つ切断すれば求まるはずです。 なので、O型がL型の長さを超えていて、O型乗車が不可能な場合、C型が最長になる可能性があるので考えねばなりません。 上記例の場合、L型最長13.3kmとO型最長14.4kmなので、O型が不可能な規則の場合はC型が最長になる可能性を検討する必要がある、ということです。

「長いO型をいくつか」と書きましたが、多少補足が必要です。 例えば求めたい路線ネットワークのうち、最短の駅間が0.5kmで、O型最長が110.0km、この経路に含まれる最短の駅間が0.8kmだったとします。 すると、このO型の最長のものから0.8kmを引いた、109.2kmがこのO型から得られるC型経路になります。 しかし、これだけでは109.2kmがC型最長であるとは断言できません。 次点の109.8kmのO型経路が0.5kmの区間を含んでいた場合、109.3kmというC型経路が求まって、最長になるでしょう。 つまり、この場合109.7kmまでのO型経路を探索すれば、最長のC型経路が出てくると言えます。 最長のC型はこのようにして求められます。

とは言っても、C型が最長大回り経路になることはあまりないでしょう。普通に考えて、L型>O型>C型になりそうなものです。 なので、L型とO型の最長経路を求めて、L型>O型になっていればL型が最長であることが確認できる、という手順になりそうです。 O型>C型は確実に言えますが、O型が乗車不可能であるときにC型が最長経路になる可能性はあります。がたぶん考えることはないでしょう。

4.制約式を考える

ということで、L型、O型を整数計画法で表現する制約式を考えましょう。

ある駅からのびる枝を0本または2本用いるという式を葛西隆也氏が提示しています。駅から枝a,b,cがのびている場合、各枝を用いるとき1、 用いないとき0とする変数Ea, Eb, Ecを用意すると、

Ea + Eb + Ec ≦ 2
- Ea + Eb + Ec ≧ 0
Ea - Eb + Ec ≧ 0
Ea + Eb - Ec ≧ 0

これでEa, Eb, Ecのうち2つが1、1つが0であるという状態を表現できます。

O型の場合、制約式は基本的にこれだけで済みそうです。 L型はもう少し面倒です。発着駅に限り、枝は1本しか使ってほしくありません。 そこで、駅sが発駅であれば1、発駅でなければ0とする変数Fs、着駅であれば1、着駅でなければ0とする変数Tsを加えます。 あと、発着が同じ駅になっては困るのでそれも入れておきます。

Fs + Ts + Ea + Eb + Ec ≦ 2
- Fs + Ts + Ea + Eb + Ec ≧ 0
Fs - Ts + Ea + Eb + Ec ≧ 0
Fs + Ts - Ea + Eb + Ec ≧ 0
Fs + Ts + Ea - Eb + Ec ≧ 0
Fs + Ts + Ea + Eb - Ec ≧ 0
Fs + Ts ≦ 1

また、発着駅はそれぞれ1つずつなので、

Fs + Ft + Fu + Fv + ... = 1
Ts + Tt + Tu + Tv + ... = 1

という式が必要そうです。さらに発着駅の間が券面距離以下でなければなりません。 こうした発着駅の組合せは、あらかじめ用意しておくしかなさそうです。 そして書き方としては、駅sに対して、駅t, u, v, ...からでは発着駅の組合せになれない、と書くしか思いつきませんでした。

Fs + Tt + Tu + Tv + ... ≦ 1

あとは、最大化する目的関数です。これは簡単です。枝a,b,cの長さをDa, Db, Dcとすると、

Ea×Da + Eb×Db + Ec×Dc + ...

ですね。制約式は概ねこれでいいと思います。 ただし、整数計画法によるアプローチにはつきものですが、孤立したループが作られてしまう可能性が高いです。 孤立ループは、葛西隆也氏の方法と同様、出現してからそれを禁止する制約を増やせばよいと思います。 例えば、枝a,b,c,dによる孤立ループができてしまった場合は、

Ea + Eb + Ec + Ed ≦ 3

という制約式を追加して解き直すという手法をとります。

5.乗換の分類と制約式化

さて、ここまで乗換は無条件にできることを想定していたわけですが、実際には制約が加わったり、逆に特殊に可能になるようなものがあったりします。 そうした乗換パターンを分類してみました。

乗換パターン名 詳細 乗換条件
無条件 特に条件なく、乗換可能である。 なし。 ほとんどの乗換駅
中間改札 路線Aと路線Bの間に中間改札がある。 発着駅が同じ会社(グループ)であること特になし(他社発着でも通れました(2009年4月実験済)) JR鶴見・加古川(有人窓口)
ラッチ外乗換 路線Aと路線Bを乗り継ぐには、一度改札外に出る必要がある。 特になし JR浜川崎・折尾
発着駅が同じ会社であり、発駅からの距離が券面キロ以内にあること メトロ上野・三越前・池袋・飯田橋・九段下・渋谷、都営蔵前
大回り中は利用できない(実乗経路計算)。 東急渋谷
全列車通過 分岐駅を全列車が通過するため、乗り換えられない。しかし、その救済のため、経路によっては区間外への折り返し乗車を認める特例が存在することがある。 特例規則の範囲で乗ること JR鶴見・東神奈川・日暮里
乗り入れ列車 乗り入れ列車に乗車して通過するときのみ別線に移ることができる。 列車進行方向に移動すること 西船橋(JR〜メトロ)、栗橋(JR〜東武)
乗換可他駅 ラッチ外で、他の駅に乗り換えられる。乗り換えなければ他駅として扱う。 発着駅が同じ会社であり、発駅から途中下車駅までの距離が券面距離以内にあること。2社に対しての合計金額以内で発駅から途中下車駅まで乗れる場合も含む。 メトロ上野広小路〜仲御徒町・淡路町〜新御茶ノ水・日比谷〜有楽町、都営東日本橋〜馬喰横山、大阪市営梅田〜東梅田〜西梅田、メトロ/都営乗換可能な各駅。
ラッチ内乗換可他駅 改札なく乗換可能な他駅。乗り換えなければ他駅として扱う。 特になし メトロ赤坂見附〜永田町・溜池山王〜国会議事堂前、大阪市営心斎橋〜四ツ橋

整数計画法のモデルにあらかじめ用意しておくのが良さそう制約は、一律に乗換を禁止する制約、 発駅からの距離が券面距離を超える場合に乗換を禁止する制約、でしょうか。 また、他駅への乗換は距離0の徒歩という路線を設定することで表現できそうです。 実乗経路計算については、乗換駅の隣から券面キロ以内にある駅を、乗換駅で接続可能な別路線として切り出せばいいでしょう。 その他の制約については、出現し次第に禁止するという扱いでいいと思います。

制約式は以下のように書けるでしょう。枝a,bと枝c,dの間の乗換禁止:

Ea + Ec ≦ 1
Ea + Ed ≦ 1
Eb + Ec ≦ 1
Eb + Ed ≦ 1

駅s,t,uを発駅とするとき枝a,bと枝c,dの間の乗換禁止:

Ea + Ec + Fs + Ft + Fu ≦ 2
Ea + Ed + Fs + Ft + Fu ≦ 2
Eb + Ec + Fs + Ft + Fu ≦ 2
Eb + Ed + Fs + Ft + Fu ≦ 2

ところで、よくわからないので今回無視しましたが、メトロの臨時列車で他線に乗り入れるものがあります(東京湾大華火祭臨時や臨時特急ベイリゾートなどの有楽町線直通が典型)。 普段は営業路線にならない連絡線を通過しますが、これの経由駅はどうなるのでしょうか?JRみたいに運賃計算用路線図にある線をむりやり通す、のでしょうか? ちょっと規則が気になります。

6.制約式生成プログラムを作る

具体的な制約式ですが、まさか手で書くとか面倒すぎるしミスも混入しやすいので、 営業キロデータと乗換データを与えて制約式を出力するプログラムを書きました。 相変わらずRubyスクリプトです。葛西隆也氏によるLOP toolkitが非常に参考になりました。 名前もなんとなく似せて「最長大回り経路」=「Longest Detour Route」ということでLDR toolkitと呼んでいます。

ダウンロードはここから(18.9KB, Zip圧縮, 2010/2/11更新)。一切無保証・改造自由・再頒布自由のフリーソフトウェアとしてどうぞ。 Ruby, GLPKを別途インストールがすることが必須です。 自分は両方ともWindows向けバイナリ (Ruby 1.8.6GLPK 4.34)を使っています。

 ┌─路線データテキスト
 │  ↓
 │ [modmaker.rb]
 │  ↓
 │ 整数計画法モデルファイル←─┐
 │  ↓            │
 │ [glpsol.exe]   [手動(コピペ)で制約式追加]
 │  ↓            │
 │ ソルバー出力ファイル    │
 ↓  ↓            │
[resultparser.rb]         │
  ↓              │
結果表示─────────────┘

主にこんな感じの設計です。この他にedgeviewer.rb, sourcedata.rbがあります。 edgeviewer.rbはすべての枝のID(Exxx)とその路線・区間を表示するだけのツールです。 sourcedata.rbは路線データテキストのパーサで、modmaker.rb、resultparser.rb、edgeviewer.rbが内部的に用いています。 使用するコマンドはこのぐらいだと思います。

ruby modmaker.rb metro_data.txt 1
glpsol -m metro_data_ltype.mod -o metro_ltype_out.txt
ruby resultparser.rb metro_data.txt metro_ltype_out.txt 1

ruby edgeviewer.rb metro_data.txt 1

なんとなくわかってください。ただし、1と3箇所あるところがよくわからないと思います。これは経路タイプ指定の数字で、

となっています。 発着駅指定最長経路モードは、主にSuica/PASMOで乗降車駅の会社以外を乗るときを想定して作成していますが、 他にも例えば自分の最寄り駅〜その隣駅までの最長大回り経路探索にも使えます。 路線データテキストのフォーマットはこんな感じです。

[路線ID]
駅名	営業キロ	駅ID(省略可)
…
[路線ID]
駅名	営業キロ	駅ID(省略可)
…
<ラッチ外>
接続ID	駅ID	駅ID	…
…
<中間改札>
接続ID	駅ID	駅ID	…
…
<ラッチ外接続他駅>
駅ID	駅ID	…
…
<外部>
駅ID
…
{券面最長距離}
キロ数

路線名、駅名、駅ID、接続IDにはタブ、改行、[]<>{}以外の任意の文字列が使えます。 注意点として、IDと名のつくものは同一文字列は同じものとして扱われます。 路線IDはすべて重複してはいけません(重複するとどっちかが無視されます)。 ラッチ外接続他駅の接続IDも内部的に路線IDと同一視されることがあるので、重複を避けてください。 駅IDについては、同一の駅IDを持つものは無条件に乗換可、 特殊条件で乗換可になるものは<ラッチ外>、<中間改札>、<ラッチ外接続他駅>に記述してください。 <外部>は発着駅指定最長経路モードでの発着駅になりうる駅IDを指定します。 ここに3つ以上指定した場合、発着駅の全組合せを網羅するnC2個のファイルを作成します。 {券面最長距離}はL型,O型最長経路モードでのみ利用します。利用するきっぷ等で乗車可能な最長距離の数字を書いてください。

サンプルデータも添付しているのでそれらしく作ってください。(2010/2/11追記:JR部のデータ誤りを修正しました) 乗換条件がこれじゃよくわからん!って人のために、厳密な定義を書いておきます。

<ラッチ外>
L型モードでは出発駅から券面距離以内にあれば乗換可能になる。O型モードでは乗換可能な前提で計算し、全ラッチ外駅から券面距離以内にある駅(出発駅)が存在するかのチェックに用いる。
<ラッチ外接続他駅>
L型モードでは出発駅から券面距離以内にあれば乗換可能になる。乗り換えなければ他駅なので、複数回通過できる。O型モードでは乗換可能な前提で計算し、全ラッチ外駅から券面距離以内にある駅(出発駅)が存在するかのチェックに用いる。
<中間改札>
L型,O型モードでのみ乗り換え可になる。(現状では意味がない記述、Suica/PASMOでの私鉄発鶴見乗換の実態誤認による実装)

(2009/9/5追記)当方の規則の誤認によるバグが発見されました。A駅とB駅がラッチ外乗換可であり、 C駅からの距離がA駅は券面距離を超えている、B駅は券面距離を超えていない、という場合に 今まではC→B→Aという経路は可、C→A→Bという経路は不可としていたのですが、 ラッチ外他駅乗換の存在する東京メトロ・都営・大阪市3社局ともにC→Aの運賃はC→Bと同一であり、C→A→Bを可能としているので修正しました。 これにより、ラッチ外乗換の絡む本稿の最長経路がかなり変化しています。

7.計算してみる

7-1. JR東京近郊区間130円最長大回り経路

2009年3月13日までの130円での最長ルートはわらしべ長者町氏により提示され近藤英明氏により最長であることが証明されています。 3月14日から近郊区間が拡大し、松岸や安房鴨川までもが近郊区間に入りました。 今まで我孫子〜成田〜佐倉〜成東〜大網〜蘇我〜千葉と通っていた最長経路が、 我孫子〜成田〜松岸〜成東〜大網〜安房鴨川〜蘇我〜千葉と変化するだけと言われていましたが、どうでしょうか。

L型、O型両方についての最長は次の表の通りになりました。最長経路は予想通りにはなりませんでした。 (※コメント欄でより長いルートが報告され、JR部のデータ作成ミスが見つかったことで予想通りでなかったことが証明されました)

L型最長 北小金〜馬橋 1039.2km
常磐線北小金友部76.8
水戸線友部小山50.2
両毛線小山新前橋84.4
上越線新前橋高崎7.3
高崎線高崎大宮74.7
川越線大宮高麗川30.6
八高線高麗川八王子31.1
横浜線八王子橋本8.8
相模線橋本茅ヶ崎33.3
東海道線茅ヶ崎大船12.1
根岸線大船横浜22.1
横須賀線横浜品川24.9
京浜東北線品川川崎11.4
南武線川崎立川35.5
中央線立川西国分寺4.7
武蔵野線西国分寺武蔵浦和25.9
埼京線武蔵浦和赤羽10.6
京浜東北線赤羽南浦和9.3
武蔵野線南浦和西船橋40.1
総武線西船橋佐倉34.7
成田線佐倉松岸75.4
総武線松岸成東40.4
東金線成東大網13.8
外房線大網安房鴨川70.4
内房線安房鴨川蘇我119.4
京葉線蘇我東京43
総武線東京錦糸町4.8
総武緩行線錦糸町秋葉原3.4
京浜東北線秋葉原神田0.7
中央線神田新宿9
山手線新宿日暮里11.3
常磐線日暮里馬橋19.1
O型最長 秋葉原〜秋葉原 1014.6km
総武緩行線秋葉原錦糸町3.4
総武線錦糸町佐倉50.5
成田線佐倉松岸75.4
総武線松岸成東40.4
東金線成東大網13.8
外房線大網安房鴨川70.4
内房線安房鴨川蘇我119.4
京葉線蘇我東京43
京浜東北線東京神田1.3
中央線神田代々木8.3
山手線代々木品川9.9
東海道線品川川崎11.4
南武線川崎尻手1.7
南武支線尻手浜川崎4.1
鶴見線浜川崎鶴見5.7
京浜東北線鶴見横浜7.1
根岸線横浜大船22.1
東海道線大船茅ヶ崎12.1
相模線茅ヶ崎橋本33.3
横浜線橋本八王子8.8
中央線八王子立川9.9
青梅線立川拝島6.9
八高線拝島高麗川21.2
川越線高麗川大宮30.6
高崎線大宮高崎74.7
上越線高崎新前橋7.3
両毛線新前橋小山84.4
水戸線小山友部50.2
常磐線友部新松戸78.1
武蔵野線新松戸南浦和25.8
京浜東北線南浦和赤羽9.3
埼京線赤羽武蔵浦和10.6
武蔵野線武蔵浦和西国分寺25.9
中央線西国分寺新宿22.5
山手線新宿秋葉原15.1

O型は神田〜神田でも構いません。

ちなみに、発着駅の制限がかなり効き、L型でも投入した駅数106、区間数133、変数数合計281におさえることができました。 GLPKで解く時間も、1回を解くのに概ね3分程度、孤立ループが出現し禁止すること5回、禁止制約計10個ぐらいでした。 当然O型はもっと楽です。

また、データ作成誤りが見つかったきっかけでもある、 よねざわいずみさんによるO型の最長解を読んで気づいたのですが、 特例による折り返し乗車分も乗車距離に含むという計算方法もあります。 何を基準にするかという考えの違いですので、この考え方によるL型も計算したいところです。 今はとりあえず次の課題というところで。

7-2. 東京メトロ160円最長大回り経路

これも近藤英明氏により証明されていますが、副都心線開業前のものです。 副都心線開業でどう変化したか調べてみましょう。

前述のラッチ外乗換他駅のバグのおかげで最長を見逃していました。 この点を修正して、 結果は以下の通りです。L型が最長になりました。

L型最長 本郷三丁目→西ケ原 63.6km
丸ノ内線本郷三丁目淡路町1.6
乗継淡路町新御茶ノ水0
千代田線新御茶ノ水北千住8.6
日比谷線北千住仲御徒町5.8
乗継仲御徒町上野広小路0
銀座線上野広小路日本橋3
東西線日本橋茅場町0.5
日比谷線茅場町銀座2.5
銀座線銀座青山一丁目4.5
半蔵門線青山一丁目大手町6.1
千代田線大手町日比谷1.4
日比谷線日比谷霞ケ関1.2
千代田線霞ケ関表参道4.1
半蔵門線表参道渋谷1.3
副都心線渋谷新宿三丁目3.6
丸ノ内線新宿三丁目四ツ谷2.6
南北線四ツ谷市ケ谷1
有楽町線市ケ谷池袋6
丸ノ内線池袋後楽園4.8
南北線後楽園西ケ原5
O型最長 神保町〜神保町 59.4km
半蔵門線神保町青山一丁目4.4
銀座線青山一丁目銀座4.5
日比谷線銀座茅場町2.5
東西線茅場町日本橋0.5
銀座線日本橋上野3.5
日比谷線上野北千住5.3
千代田線北千住新御茶ノ水8.6
乗継新御茶ノ水淡路町0
丸ノ内線淡路町池袋7.2
有楽町線池袋市ケ谷6
南北線市ケ谷四ツ谷1
丸ノ内線四ツ谷新宿三丁目2.6
副都心線新宿三丁目渋谷3.6
半蔵門線渋谷表参道1.3
千代田線表参道霞ケ関4.1
日比谷線霞ケ関日比谷1.2
千代田線日比谷大手町1.4
半蔵門線大手町神保町1.7

L型の市ヶ谷〜飯田橋は有楽町線でも南北線でも構いません。O型も九段下発着でも同じです。

最長は、銀座→表参道→霞ヶ関→日比谷→大手町→永田町→市ヶ谷と辿っていたのが、 副都心線開業により、銀座→青山一丁目→大手町→日比谷→霞ヶ関→表参道→渋谷→新宿三丁目→四ツ谷→市ヶ谷となり、 皇居をコの字に行って戻るルートが皇居を2週するルートに変わりました。

ちなみに、O型ですが、どうやらメトロにはO型の乗車形式はないそうです。 ということであくまでもC型を否定するための参考資料ですね。この通り乗らないでください。

メトロは路線の形状的に、発着駅の絞り込みがあまりできない構造をしています。 おかげで、L型の場合、駅数119、区間数149、合計変数数387とJR近郊区間よりも手間そうな数字が出てきました。 ところが、意外と一発で1分ぐらいで解けてびっくりしました。

7-3. 都営地下鉄170円最長大回り経路

以前芝公園〜五反田/宝町→赤羽橋の36.1kmと書いていましたが、プログラムのバグ修正でさらに長いものが見つかりました。

L型最長 新橋→汐留 41.3km
浅草線新橋東日本橋4
乗継東日本橋馬喰横山0
新宿線馬喰横山神保町2.5
三田線神保町三田5.6
浅草線三田大門1.5
大江戸線大門都庁前8.6
大江戸線都庁前汐留19.1
O型最長 森下〜森下 33.9km
大江戸線森下大門7.3
浅草線大門東日本橋5
乗継東日本橋馬喰横山0
新宿線馬喰横山新宿8.1
大江戸線新宿都庁前0.8
大江戸線都庁前森下12.7

O型は、森下を発着にしてみましたが、 それ以外でも東日本橋〜馬喰横山を170円で超えられるところならどこでもいいです(26駅もあります)。 下記コメント欄で情報提供いただきましたが、都営地下鉄はO型乗車可能なようです。

L型は、駅数64、区間数68、変数196と、あまり絞れた気がしませんでしたが、1回10秒程度で、十分早いと思います。

7-4. Suica/PASMO初乗り最長大回り経路

分量が多くなってきたので、別ページに分けました。こちらからどうぞ→Suica/PASMO初乗り最長大回り経路


以下、初稿時後に追加された、調子に乗っていろいろ調べてみた編です。

7-5. 大阪近郊区間最長大回り経路

大阪の最長経路は、2ch大阪近郊区間大回りスレのテンプレに入っているものが最新ですが、実際その通りになりました。 券面距離の制限をなくしても最長距離にわかりやすい上限があるのが大阪近郊区間の特徴のようです。

ついでに、券面距離を長くしていくとどう変化するのかを見ることにしました。 なお、都合上加古川まで東海道本線扱いしています。

3km以内最長 天満〜福島 563.7km
大阪環状線天満京橋2.6
JR東西線京橋尼崎12.5
東海道本線尼崎山科56
湖西線山科近江塩津74.1
北陸本線近江塩津米原31.4
東海道本線米原草津45.5
草津線草津柘植36.7
関西本線柘植木津47
片町線木津放出41.6
おおさか東線放出久宝寺9.2
関西本線久宝寺奈良30.4
桜井線奈良高田29.4
和歌山線高田和歌山76
阪和線和歌山天王寺61.3
大阪環状線天王寺福島10
6km以内最長 塚口〜加島 738.9km
福知山線塚口谷川70.5
加古川線谷川加古川48.5
東海道本線加古川山科120.5
湖西線山科近江塩津74.1
北陸本線近江塩津米原31.4
東海道本線米原草津45.5
草津線草津柘植36.7
関西本線柘植木津47
片町線木津放出41.6
おおさか東線放出久宝寺9.2
関西本線久宝寺奈良30.4
桜井線奈良高田29.4
和歌山線高田和歌山76
阪和線和歌山天王寺61.3
大阪環状線天王寺京橋6.5
JR東西線京橋加島10.3
15km以内最長 塚口〜福島 741.1km
福知山線塚口谷川70.5
加古川線谷川加古川48.5
東海道本線加古川尼崎64.5
JR東西線尼崎京橋12.5
大阪環状線京橋大阪4.2
東海道本線大阪山科48.3
湖西線山科近江塩津74.1
北陸本線近江塩津米原31.4
東海道本線米原草津45.5
草津線草津柘植36.7
関西本線柘植木津47
片町線木津放出41.6
おおさか東線放出久宝寺9.2
関西本線久宝寺奈良30.4
桜井線奈良高田29.4
和歌山線高田和歌山76
阪和線和歌山天王寺61.3
大阪環状線天王寺福島10
25km以内最長 塚口〜JR難波 743.5km
福知山線塚口谷川70.5
加古川線谷川加古川48.5
東海道本線加古川尼崎64.5
JR東西線尼崎京橋12.5
大阪環状線京橋天王寺6.5
阪和線天王寺和歌山61.3
和歌山線和歌山高田76
桜井線高田奈良29.4
関西本線奈良久宝寺30.4
おおさか東線久宝寺放出9.2
片町線放出木津41.6
関西本線木津柘植47
草津線柘植草津36.7
東海道本線草津米原45.5
北陸本線米原近江塩津31.4
湖西線近江塩津山科74.1
東海道本線山科大阪48.3
大阪環状線大阪今宮8.8
関西本線今宮JR難波1.3

7-6. 福岡近郊区間最長大回り経路

大阪と同じように距離を変えて試してみたんですが、 よく考えたら福岡は概ね「目」の字+αという構造なので、「目」の外周のどこを切断して伸ばすと有利か、というだけの話でした。

3km以内最長 原町〜門松 169.9km
篠栗線原町博多6.8
鹿児島本線博多原田19.7
筑豊本線原田新飯塚28.5
後藤寺線新飯塚田川後藤寺13.3
日田彦山線田川後藤寺城野30
日豊本線城野西小倉5.3
鹿児島本線西小倉香椎58
香椎線香椎長者原6.3
篠栗線長者原門松2

終点は6kmでは新原、10kmでは城戸南蔵院前、15kmでは九郎原、20kmでは筑前大分と伸びていくだけでした。 篠栗線はさすがにこれ以上になると無理で、25kmになると飯塚〜中間に移りました。

7-7. 大阪市営地下鉄初乗り最長大回り経路

大阪市営地下鉄の距離には、営業キロと実キロの2種類があり、両方が公開されているので両方で計算してみました。 (実キロでの計算方法をちょっと考えましたが、制約式は営業キロのもの、目的関数は実キロのものを使って算出すればいいはずです。)

上記のプログラムの他駅乗り継ぎについてのバグ修正により、これも新たな最長が見つかりました。

営業キロ最長1・実キロ最長 東梅田〜西中島南方 営業キロ64.6km/実キロ65.1km
谷町線東梅田太子橋今市7.37.3
今里筋線太子橋今市今里8.28.2
千日前線今里谷町九丁目2.62.6
谷町線谷町九丁目天王寺1.72.1
御堂筋線天王寺動物園前11
堺筋線動物園前日本橋1.72.1
千日前線日本橋難波0.70.7
四つ橋線難波住之江公園7.77.7
南港ポートタウン線住之江公園コスモスクエア7.97.9
中央線コスモスクエア阿波座8.38.3
千日前線阿波座西長堀10.9
長堀鶴見緑地線西長堀森ノ宮5.15.1
中央線森ノ宮谷町四丁目1.31.3
谷町線谷町四丁目南森町2.72.3
堺筋線南森町堺筋本町1.71.9
中央線堺筋本町本町0.70.7
御堂筋線本町西中島南方55
営業キロ最長2 西中島南方〜西梅田 営業キロ64.6km
御堂筋線西中島南方梅田2.8
徒歩梅田東梅田0
谷町線東梅田太子橋今市7.3
今里筋線太子橋今市今里8.2
千日前線今里谷町九丁目2.6
谷町線谷町九丁目天王寺1.7
御堂筋線天王寺動物園前1
堺筋線動物園前日本橋1.7
千日前線日本橋難波0.7
四つ橋線難波住之江公園7.7
南港ポートタウン線住之江公園コスモスクエア7.9
中央線コスモスクエア阿波座8.3
千日前線阿波座西長堀1
長堀鶴見緑地線西長堀森ノ宮5.1
中央線森ノ宮谷町四丁目1.3
谷町線谷町四丁目南森町2.7
堺筋線南森町堺筋本町1.7
中央線堺筋本町本町0.7
四つ橋線本町西梅田2.2
難波〜住之江公園 他候補(営業キロ/実キロ)
御堂筋線難波大国町1.21.2
四つ橋線大国町住之江公園6.56.5