Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ローカル線全駅下車の最適化 @Optimization Night #4
Search
hiromakimaki
December 02, 2020
0
1.1k
ローカル線全駅下車の最適化 @Optimization Night #4
数理最適化: Optimization Night #4 のLT資料です
https://optimization.connpass.com/event/194695/
hiromakimaki
December 02, 2020
Tweet
Share
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Visualization
eitanlees
148
16k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
The World Runs on Bad Software
bkeepers
PRO
71
11k
The Straight Up "How To Draw Better" Workshop
denniskardys
237
140k
RailsConf 2023
tenderlove
30
1.2k
Done Done
chrislema
185
16k
Balancing Empowerment & Direction
lara
4
660
Gamification - CAS2011
davidbonilla
81
5.4k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Transcript
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線全駅下車の最適化 Lightning Talk at Optimization Night #4 Masayuki Hirota (@hiro_makimaki) 2020/12/02 1 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 自己紹介 職歴 サーバーサイドエンジニア(約 5 年) データサイエンティスト(約半年) 趣味 鉄道旅行 競技プログラミング (AtCoder) などなど 2 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線の旅の楽しさ 景色が良い! 各駅周辺を散策してみるといろいろ面白い! (a) 神戸駅の「清流」 (b) 北濃駅の転車台 ローカル線 100 線とか見てみると、 「こんな路線あったのか」 という気付きがあるかも: http://j100s.com/localline.html 3 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ローカル線の旅の難点 全駅下車して回ろうとすると時間がかかることが多い 列車の運行本数が少なかったり 駅間の所要時間が長かったり ↓ 効率的に回る方法はないものか...? 4 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 解きたい問題 目的 特定の路線の全駅を訪問する 最初の出発駅・出発時刻を固定した上で, 最終駅到着時刻 を最も早くしたい 制約 最終的に出発駅に戻ってくる 各駅では最低 D 分間滞在することにする 散策用の時間確保のため 移動可能な時刻及び最低滞在時間が指定されている 巡回セールスマン問題 5 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 問題で登場する値の整理 V = {1, 2, · · · , N}: 訪問対象の駅 T: 探索対象期間(分) M: 探索対象期間内に走っている列車の本数 D: 各駅における滞在時間(分) 列車データ 1 列車のデータは駅間のセクション情報のリスト セクション情報:出発駅・到着駅・出発時刻・到着時刻 このリストを要素に持つリストが列車データ 6 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 駅数と列車本数の規模 路線によって駅数も列車本数も様々 銚子電気鉄道: 10 駅 34 本 わたらせ渓谷鐵道: 17 駅 39 本 秋田内陸線: 29 駅 28 本 長良川鉄道: 38 駅 51 本 ※2020/12/05 時点、両方面合計、臨時列車除く土日ダイヤ 7 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 解法:前処理& Bit DP 列車データを使いやすい形に変換 Bit DP に帰着して解く 8 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 列車データの変換 元となる列車データ 1 列車のデータは駅間のセクション情報のリスト セクション情報:出発駅・到着駅・出発時刻・到着時刻 このリストを要素に持つリストが列車データ 下記のような map に変換する(arr_time と表記) キー:出発駅・到着駅・現在時刻 値:最速到着時刻(途中の乗換OK) 処理の詳細は割愛するが、各駅のペアについて出発時刻を ずらしつつ乗換検索を走らせるイメージ 9 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験 駅数 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
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 1(人工データ) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 9 経由の移動(無駄な動き…) 計算時間: 0.23s (前処理) + 0.02s (Bit DP) 12 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 2(人工データ) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 7 経由の移動(無駄な動き…) 計算時間: 1.42s (前処理) + 6.61s (Bit DP) 13 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数値実験結果: ケース 3(実例) 水平線の部分が滞在箇所 time=600 付近の斜め線は駅 2 経由の移動(無駄な動き…) 計算時間: 1.89s (前処理) + 8.43s (Bit DP) 14 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Future work 無駄な動きを抑えられないか? 他の路線でも試してみる 実際の路線の時刻表データを作るのが大変 時刻表がデータのコピペ不可な PDF だったり... 1 日で回りきるのが不可能な場合の考慮 「一夜を明かす場合は野宿せずに済む駅で明かす」というよ うな制約を組み込みたい 15 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . まとめ ローカル線の全駅下車最適化問題を Bit DP で解いてみた 16 / 17
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 以上です 17 / 17