Slide 1

Slide 1 text

0 2024-07-05 第97回NearMe技術勉強会 Kenji Hosoda VRPの近傍操作SWAP* について調べてみた

Slide 2

Slide 2 text

1 SWAP*に興味をもった経緯 ● VRPにおける近傍操作のアルゴリズムの⼀つ ● いくつかのアクティブなVRPのライブラリで取り⼊れられている ○ https://github.com/VROOM-Project/vroom ☆1.3k ○ https://github.com/reinterpretcat/vrp ☆329 ○ https://github.com/PyVRP/PyVRP ☆229 ● ⽐較的最近提案されている ○ 2020年にarxivで提案 ■ https://arxiv.org/abs/2012.10384 ○ 2022年にComputers & Operations Researchに掲載 ■ https://www.sciencedirect.com/science/article/abs/pii/S030505482100349X ● 計算時間が愚直な実装に⽐べて → になる

Slide 3

Slide 3 text

2 https://developers.google.com/optimization/routing/vrp VRP(Vehicle Routing Problem)ついて ⼀連の場所を訪れる複数の⾞両の最適なルートを⾒つける 車庫 (DEPOT) 車両 1 車両 2 車両 3 車両 4

Slide 4

Slide 4 text

3 VRPの解き⽅ ● 混合整数計画法で解く ○ 厳密な最適化ができ、解の品質が保証される ○ 計算時間が⾮常に⻑くなる時がある ● メタヒューリスティクスで解く ○ 厳密な最適解ではないが、実⽤的に良好な解を得られる ○ 計算時間は⽐較的短く、時間制約を設けて解を得ることも可能 ○ 問題に応じてアルゴリズムを調整しやすい ○ シミュレーテッドアニーリング / 遺伝的アルゴリズム など

Slide 5

Slide 5 text

4 https://www.researchgate.net/publication/363632926_A_reinforcement_learning-Variable_neighborhood_search_method_for_the_capacitated_Vehicle_Routing_Problem VRPの近傍操作について ● 近傍操作はメタヒューリスティクスの ⼀部として使⽤される ○ 近傍操作を繰り返すことで局所解 を探索する ● 近傍操作の例 ● ルート内 ○ エッジ繋ぎ変え (2-OPT) ○ ノード移動 (MOVE) ● ルート間 ○ ノード交換 (SWAP) ○ ノード移転 (RELOCATE)

Slide 6

Slide 6 text

5 SWAP操作について A B C D DEPOT E F G H Route1 Route2 SWAP前の2つのルート

Slide 7

Slide 7 text

6 SWAP操作について A B C D DEPOT E F G H Route1 Route2 ルート間でノードを交換する

Slide 8

Slide 8 text

7 SWAP操作について あるルート間のノードペアにおいては、例えば、 ノードEをRoute1のどこに挿⼊するか、ノードCをRoute2のどこに挿⼊するか、 を洗い出して、その中でベストな挿⼊ポイントを⾒つける A B C D DEPOT E F G H Route1 Route2 A B C D DEPOT E F G H Route1 Route2 …

Slide 9

Slide 9 text

8 SWAP操作について ● 全体としては、 ○ ルート間のノードペアがΘ(n^2)通り ○ あるノードペアにおける挿⼊ポイントがΘ(n^2)通り ○ で、Θ(n^4)通りの動きがある ● 愚直な実装で、計算時間はΘ(n^3) ○ (ノードペアにおけるベストな挿⼊ポイントの計算は、 ペアの⽚⽅ずつ独⽴に⾏えるのでΘ(n)の計算時間)

Slide 10

Slide 10 text

9 SWAP*について 1: EをRoute1に付け加えた時のコストを考える A B C D DEPOT E F G H C 0E CEA C0A Route1 Route2 上の例のコスト差分は、∆(E, 0, A) = C0E + CEA - C0A となる ※ルートのコストは各エッジのコストの和で決まるものとする

Slide 11

Slide 11 text

10 SWAP*について 1: EをRoute1に付け加えた時のコストを考える A B C D DEPOT E F G H CAE CEB CAB Route1 Route2 上の例のコスト差分は、∆(E, A, B) = CAE + CEB - CAB となる

Slide 12

Slide 12 text

11 SWAP*について A B C D DEPOT E F G H CBE CEC CBC Route1 Route2 上のコスト差分は、∆(E, B, C) = CBE + CEC - CBC となる 1: EをRoute1に付け加えた時のコストを考える

Slide 13

Slide 13 text

12 SWAP*について A B C D DEPOT E F G H CCE CED CCD Route1 Route2 上のコスト差分は、∆(E, C, D) = CCE + CED - CCD となる 1: EをRoute1に付け加えた時のコストを考える

Slide 14

Slide 14 text

13 SWAP*について 上のコスト差分は、∆(E, C, D) = CDE + CE0 - CD0 となる 1: EをRoute1に付け加えた時のコストを考える A B C D DEPOT E F G H CDE CD0 Route1 Route2 CE0

Slide 15

Slide 15 text

14 SWAP*について 上のコスト差分は、 ∆(E, B, D) - ∆(C, B, D) = (CBE + CED - CBD) - (CBC + CCD - CBD) = CBE + CED - CBC - CCD となる 2: Route1ではCを取り除いて、Cの場所をEで置き換えた場合を考える A B C D DEPOT E F G H CBE CBD Route1 Route2 CED CBC CCD

Slide 16

Slide 16 text

15 SWAP*について この中から最初コストとなるEの配置を選ぶ ↓Cを取り除く場合はこのパタンはない 1: EをRoute1に付け加える場合 2: Cの場所をEで置き換える場合 ここからCを取り除く (差分コストはさらに∆(C, B, D)だけ引かれる) こちらは既に Cは取り除かれてる

Slide 17

Slide 17 text

16 SWAP*について この中から最初コストとなるEの配置を選ぶ 1: EをRoute1に付け加える場合 2: Cの場所をEで置き換える場合 この中から最⼩コストとなるTop3を選ぶ ここからCを取り除く (差分コストはさらに∆(C, B, D)だけ引かれる) Cを取り除く場合にありえないパタンを除く (Top3の中でありえないパタンは最⼤2個なので、最⼩コストのものは残る) 枠の部分はRoute1で取り除くノードに関わらず 事前に計算して使いまわせる (計算量を”n回分”減らせる)

Slide 18

Slide 18 text

17 SWAP*のアルゴリズム全体像 ルートペアを選出(計算量削減のため近傍のルートペアに限定) https://arxiv.org/abs/2012.10384 ベストな挿入ポイントの Top3を事前計算 各ルート間のノードペアにおいて 最小コスト差分を計算 ベストなルート間のノードペアを選択 ベストなルート間のノードペアを交換

Slide 19

Slide 19 text

18 SWAP*の適⽤例 https://arxiv.org/abs/2012.10384 32と46を交換

Slide 20

Slide 20 text

19 SWAP*のパフォーマンス ● 計算時間は最⼤32% → 古典的な⽅法に⽐べ劇的に改善 ● 15%ほどの解の改善に貢献 ● 解の改善が難しくなる後半の探索ほど解の改善に貢献 https://arxiv.org/abs/2012.10384 これは直感に合う

Slide 21

Slide 21 text

20 Thank you