ワーシャル–フロイド法

最短経路問題 > ワーシャル–フロイド法 ワーシャル–フロイド法（英: Floyd–Warshall Algorithm）は、重み付き有向グラフの全ペアの最短経路問題を多項式時間で解くアルゴリズムである。名称は考案者であるスティーブン・ワーシャル（英語版）とロバート・フロイドにちなむ（2人はそれぞれ独立に考案）。フロイドのアルゴリズム、ワーシャルのアルゴリズム、フロイド–ワーシャル法とも呼ばれる。 ワーシャル–フロイド法の概略は以下の通りである： 入力： (有向または無向)グラフ G = ( V , E ) {\displaystyle G=(V,E)} E {\displaystyle E} の各辺の長さ 出力：頂点 i {\displaystyle i} と頂点 j {\displaystyle j} を結ぶ最短経路を全ての i , j ∈ V {\displaystyle i,j\in V} に対して出力 計算量： O ( V 3 ) {\displaystyle O(V^{3})} 簡単の為 V = 1 , . . . , n {\displaystyle V={1,...,n}} 上のグラフ G = ( V , E ) {\displaystyle G=(V,E)} のみを考える。 k {\displaystyle k} を n {\displaystyle n} 以下の整数とし、 K = 1 , . . . , k {\displaystyle K={1,...,k}} とする。 G {\displaystyle G} の 各頂点 i , j {\displaystyle i,j} に対し、 G {\displaystyle G} を K ∪ { i , j } {\displaystyle K\cup \{i,j\}} に制限したグラフ上での i {\displaystyle i} から j {\displaystyle j} への最短経路を p i , j {\displaystyle p_{i,j}} とする。(経路が無い場合は p i , j = {\displaystyle p_{i,j}=} 「なし」とする。) K ′ = 1 , . . . , k + 1 {\displaystyle K'={1,...,k+1}} とし、 G {\displaystyle G} を K ′ ∪ { i , j } {\displaystyle K'\cup \{i,j\}} に制限したグラフ上での i {\displaystyle i} から j {\displaystyle j} への最短経路を p i , j ′ {\displaystyle p'_{i,j}} とする。 K ′ ∪ { i , j } {\displaystyle K'\cup \{i,j\}} 内での i {\displaystyle i} から j {\displaystyle j} への最短経路は、 k + 1 {\displaystyle k+1} を経由するか、あるいは K ∪ { i , j } {\displaystyle K\cup \{i,j\}} 内にあるかのいずれかであるので、 次が成立することが分かる。ただしここで記号「 p | | q {\displaystyle p||q} 」は「経路 p {\displaystyle p} を進んだ後に経路 q {\displaystyle q} を進む」という経路を表す。 p i , j ′ = p i , k + 1 | | p k + 1 , j {\displaystyle p'_{i,j}=p_{i,k+1}||p_{k+1,j}}  : p i , k + 1 | | p k + 1 , j {\displaystyle p_{i,k+1}||p_{k+1,j}} が p i , j {\displaystyle p_{i,j}} より短い場合 p i , j ′ = p i , j {\displaystyle p'_{i,j}=p_{i,j}}  : そうでない場合。 よって K = 1 , . . . , k {\displaystyle K={1,...,k}} に対する最短経路 p i , j {\displaystyle p_{i,j}} が全ての i , j {\displaystyle i,j} に対して分かっていれば、 K ′ = 1 , . . . , k + 1 {\displaystyle K'={1,...,k+1}} に対する最短経路 p i , j ′ {\displaystyle p'_{i,j}} が全ての i , j {\displaystyle i,j} に対して求まる。 ワーシャル–フロイド法は以上の考察に基づいたアルゴリズムで、 K {\displaystyle K} を空集合に初期化後、 K {\displaystyle K} に頂点 1 , 2 , . . . , n {\displaystyle 1,2,...,n} を付け加えていくことで G = ( V , E ) {\displaystyle G=(V,E)} 上の最短経路を全ての i , j {\displaystyle i,j} に対して求める。 K {\displaystyle K} が空集合の場合、 K ∪ { i , j } = { i , j } {\displaystyle K\cup \{i,j\}=\{i,j\}} 上の i {\displaystyle i} と j {\displaystyle j} を結ぶ最短経路は明らかに次のようになる。ただし簡単の為、各頂点 i , j {\displaystyle i,j} に対し、 i {\displaystyle i} と j {\displaystyle j} を結ぶ辺は多くとも一本としている： i , j {\displaystyle i,j} を結ぶ辺 e {\displaystyle e} があれば、最短経路は e {\displaystyle e} . そうでなければ i {\displaystyle i} と j {\displaystyle j} を結ぶ経路は K ∪ { i , j } {\displaystyle K\cup \{i,j\}} にはそもそも存在しない。 したがってワーシャル–フロイド法では、 p i , j {\displaystyle p_{i,j}} を上述のルールで e {\displaystyle e} もしくは「なし」に初期化した後、前述の方法で G = ( V , E ) {\displaystyle G=(V,E)} 上の最短経路を全ての i , j {\displaystyle i,j} に対して求める。 ワーシャル–フロイド法の擬似コードを記述する。以下で、経路の長さが無限大は経路がないことを意味している。 d i , j {\displaystyle d_{i,j}} は p i , j {\displaystyle p_{i,j}} の長さ。 d i , j {\displaystyle d_{i,j}} を更新する際、経路も記録すると、 p i , j {\displaystyle p_{i,j}} も求めることができる。 グラフ G = ( V , E ) {\displaystyle G=(V,E)} および各辺 e ∈ E {\displaystyle e\in E} の長さ length(e) を入力として受け取る。 // 初期化 for each i ∈ {\displaystyle \in } {1,...,n} for each j ∈ {\displaystyle \in } {1,...,n} di,j ← i と j を結ぶ辺 e があれば length(e) なければ 無限大 // 本計算 for each k ∈ {\displaystyle \in } {1,...,n} for each i ∈ {\displaystyle \in } {1,...,n} for each j ∈ {\displaystyle \in } {1,...,n} if (di,j > di,k + dk,j) di,j ← di,k + dk,j i {\displaystyle i} から j {\displaystyle j} への最短経路を p i , j {\displaystyle p_{i,j}} とし、 u {\displaystyle u} と v {\displaystyle v} を p i , j {\displaystyle p_{i,j}} 上の頂点とすると、 u {\displaystyle u} から v {\displaystyle v} への最短経路(の一つ)は p i , j {\displaystyle p_{i,j}} を u {\displaystyle u} 、 v {\displaystyle v} 間に制限したものと一致する。 したがって p i , j {\displaystyle p_{i,j}} さえ知っていれば p u , v {\displaystyle p_{u,v}} を計算する必要もないし記憶する必要もない。 このことを利用すると、ワーシャル–フロイド法における計算量と記憶量を大幅に減らすことができる。 計算量が増えてしまうことを厭わなければ、さらに記憶量を減らすこともできる。 k {\displaystyle k} を一つ固定し、 K = 1 , . . . , k {\displaystyle K={1,...,k}} に対する最短経路 p i , j {\displaystyle p_{i,j}} が全ての i , j {\displaystyle i,j} に対して求まっているとする。 G = ( V , E ) {\displaystyle G=(V,E)} において p i , j {\displaystyle p_{i,j}} 上にある全ての辺を順に赤く塗っていく、という作業を全ての i , j {\displaystyle i,j} に対して繰り返し、最終的に赤くなった辺を集めることでできる G = ( V , E ) {\displaystyle G=(V,E)} の部分グラフを P {\displaystyle P} とする。 P {\displaystyle P} さえあれば、 p i , j {\displaystyle p_{i,j}} を全て復元できる。 したがってワーシャル-フロイド法では { p i , j } i , j ∪ { 1 , . . . , n } {\displaystyle \{p_{i,j}\}_{i,j\cup \{1,...,n\}}} を全て記憶しなくても P {\displaystyle P} のみを記憶しておけばよい。 (ただし P {\displaystyle P} から p i , j {\displaystyle p_{i,j}} を復元するのに計算量が必要であるため、計算量が増えてしまう。 なお適切に経路 p i , j {\displaystyle p_{i,j}} を選べば P {\displaystyle P} は木になるので、このことを利用すれば復元にかかる計算量もある程度押さえられる。) ワーシャル–フロイド法は以下のような問題を解くのに利用可能である: 有向グラフでの最短経路を求める（フロイドのアルゴリズム）。この場合、全エッジの重みを同じ正の値に設定する。通常、1 を設定するので、ある経路の重みはその経路上にあるエッジの数を表す。 有向グラフでの推移閉包を求める（ワーシャルのアルゴリズム）。スティーブン・ワーシャルの元々のアルゴリズムでは、重みなしのグラフであり、ブーリアンの隣接行列が使用されていた。そのため、加算の代わりに論理積(AND)が使われ、最小を求めるには論理和(OR)が使用されていた。 ある有限オートマトンにより受容される正規言語を記述する正規表現を探す（クリーネのアルゴリズム）。 実数の行列の逆行列を求める（Gauss-Jordan elimination）。 最適ルーティング。ネットワーク上の2つのノード間で通信量が最大な経路を求めるといった用途がある。そのためには上掲の擬似コードのように最小を求めるのではなく最大を求めるようにする。エッジの重みは通信量の上限を表す。経路の重みはボトルネックによって決まる。したがって上掲の擬似コードでの加算操作は最小を求める操作に置き換えられる。 JavaApplet による実装: Alex Le's Blog Python による実装: NetworkX package Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990年). Introduction to Algorithms (first edition ed.). MIT Press and McGraw-Hill. ISBN 0-262-03141-8  Section 26.2, "The Floyd-Warshall algorithm", pp. 558–565; Section 26.4, "A general framework for solving path problems in directed graphs", pp. 570–576. Floyd, Robert W. (1962年6月). “Algorithm 97: Shortest Path”. Communications of the ACM 5 (6): 345. doi:10.1145/367766.368168.  Kleene, S. C. (1956年). “Representation of events in nerve nets and finite automata”. In C. E. Shannon and J. McCarthy. Automata Studies. Princeton University Press. pp. pp. 3–42  Warshall, Stephen (1962年1月). “A theorem on Boolean matrices”. Journal of the ACM 9 (1): 11–12. doi:10.1145/321105.321107.  Interactive animation of Floyd-Warshall algorithm