サブロウ丸

主にプログラミングと数学

Eppstein's Algorithm (Find the K shortest paths) 解説と実装 (Python)

Qiitaに記事を投稿しました。


K Shortest Path Problem (KSP) とは, K番目(ある文脈では1~K番目)に短いパスを見つける問題です。 多重有向グラフについて始点と終点を固定した上でK shortest path problelmを解く方法として Eppsteinの アルゴリズムを実装しました[1]。

キーポイントについては, 以下のブログに簡潔にまとめられているため, こちらを参考にしてください。 Finding the k Shortest Paths (SICOMP'98) [2]

計算量についてまとめると, グラフ Gのノード数を n, エッジ数を mとすると,
Path Graph  P の作成に O(m+n\log n)
それを用いて第1~K最短路を導出するのに O(K), すなわち全体で O(m+n\log n + K)となります。
Yenのアルゴリム[3] では O(Kn(m+n\log n))なので, これと比較すると大幅に計算長が削減されていることが分かります。

f:id:inarizuuuushi:20180908114949p:plain

参考文献

[1] Eppstein, David. "Finding the k shortest paths." SIAM Journal on computing 28.2 (1998): 652-673.
[2] Finding the k Shortest Paths (SICOMP'98), http://iwiwi.hatenadiary.jp/entry/2013/12/26/001253
[3] 図解: Yen's algorithm (Find the K shortest paths), https://qiita.com/nariaki3551/items/821dc6ffdc552d3d5f22
[4] Yen's algorithm, https://en.wikipedia.org/wiki/Yen%27s_algorithm
[5] 二分木 (binary tree) とヒープ (heap), http://www.geocities.jp/m_hiroi/light/pyalgo03.html