Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ローカル線全駅下車の最適化 @Optimization Night #4

hiromakimaki
December 02, 2020
990

ローカル線全駅下車の最適化 @Optimization Night #4

数理最適化: Optimization Night #4 のLT資料です
https://optimization.connpass.com/event/194695/

hiromakimaki

December 02, 2020
Tweet

Transcript

  1. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線全駅下車の最適化 Lightning Talk at Optimization Night #4 Masayuki Hirota (@hiro_makimaki) 2020/12/02 1 / 17
  2. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 自己紹介 職歴 サーバーサイドエンジニア(約 5 年) データサイエンティスト(約半年) 趣味 鉄道旅行 競技プログラミング (AtCoder) などなど 2 / 17
  3. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線の旅の楽しさ 景色が良い! 各駅周辺を散策してみるといろいろ面白い! (a) 神戸駅の「清流」 (b) 北濃駅の転車台 ローカル線 100 線とか見てみると、 「こんな路線あったのか」 という気付きがあるかも: http://j100s.com/localline.html 3 / 17
  4. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線の旅の難点 全駅下車して回ろうとすると時間がかかることが多い 列車の運行本数が少なかったり 駅間の所要時間が長かったり ↓ 効率的に回る方法はないものか...? 4 / 17
  5. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 解きたい問題 目的 特定の路線の全駅を訪問する 最初の出発駅・出発時刻を固定した上で, 最終駅到着時刻 を最も早くしたい 制約 最終的に出発駅に戻ってくる 各駅では最低 D 分間滞在することにする 散策用の時間確保のため 移動可能な時刻及び最低滞在時間が指定されている 巡回セールスマン問題 5 / 17
  6. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 問題で登場する値の整理 V = {1, 2, · · · , N}: 訪問対象の駅 T: 探索対象期間(分) M: 探索対象期間内に走っている列車の本数 D: 各駅における滞在時間(分) 列車データ 1 列車のデータは駅間のセクション情報のリスト セクション情報:出発駅・到着駅・出発時刻・到着時刻 このリストを要素に持つリストが列車データ 6 / 17
  7. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 駅数と列車本数の規模 路線によって駅数も列車本数も様々 銚子電気鉄道: 10 駅 34 本 わたらせ渓谷鐵道: 17 駅 39 本 秋田内陸線: 29 駅 28 本 長良川鉄道: 38 駅 51 本 ※2020/12/05 時点、両方面合計、臨時列車除く土日ダイヤ 7 / 17
  8. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 解法:前処理& Bit DP 列車データを使いやすい形に変換 Bit DP に帰着して解く 8 / 17
  9. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 列車データの変換 元となる列車データ 1 列車のデータは駅間のセクション情報のリスト セクション情報:出発駅・到着駅・出発時刻・到着時刻 このリストを要素に持つリストが列車データ 下記のような map に変換する(arr_time と表記) キー:出発駅・到着駅・現在時刻 値:最速到着時刻(途中の乗換OK) 処理の詳細は割愛するが、各駅のペアについて出発時刻を ずらしつつ乗換検索を走らせるイメージ 9 / 17
  10. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bit DP 手順(駅 0 から出発して駅 0 に戻る) dp[S][v]: 駅集合 S ⊂ V に含まれる駅を全て訪問済み&最後 に駅 v ∈ V を訪問する場合の, 最も早い v への到着時刻 v の 1 つ前に訪問した駅が u だとすると, u を出発できる時 刻は滞在時間を考慮して dp[S − {v}][u] + D となる よって dp[S][v] = min u∈S−{v} arr_time[(u, v, dp[S − {v}][u] + D)] が成り立つ あとは dp[ϕ][0] = 0 として dp[V][0] を求めればよい 経路復元に必要な情報は別途用意 計算量: O(N2 × 2N) 10 / 17
  11. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験 駅数 N 列車本数 M 滞在時間 D 探索対象期間 T ケース 1 10 18 30 1280 ケース 2 17 30 15 1540 ケース 3 17 39 15 1361 ケース 1: 人工データ ケース 2: 人工データ ケース 3: 実例(わたらせ渓谷鐵道) コード: https://github.com/hiromakimaki/study- memo/blob/main/railway-tsp/solve.py 実行環境 OS: Windows 10 CPU: Core i7-7700HQ RAM: 16GB Python 3.6.1 11 / 17
  12. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 1(人工データ) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 9 経由の移動(無駄な動き…) 計算時間: 0.23s (前処理) + 0.02s (Bit DP) 12 / 17
  13. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 2(人工データ) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 7 経由の移動(無駄な動き…) 計算時間: 1.42s (前処理) + 6.61s (Bit DP) 13 / 17
  14. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 3(実例) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 2 経由の移動(無駄な動き…) 計算時間: 1.89s (前処理) + 8.43s (Bit DP) 14 / 17
  15. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Future work 無駄な動きを抑えられないか? 他の路線でも試してみる 実際の路線の時刻表データを作るのが大変 時刻表がデータのコピペ不可な PDF だったり... 1 日で回りきるのが不可能な場合の考慮 「一夜を明かす場合は野宿せずに済む駅で明かす」というよ うな制約を組み込みたい 15 / 17
  16. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . まとめ ローカル線の全駅下車最適化問題を Bit DP で解いてみた 16 / 17
  17. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 以上です 17 / 17