フォード・ファルカーソンのアルゴリズム

フォード・ファルカーソンのアルゴリズム: Ford-Fulkerson algorithm)とは、フローネットワークにおける最大フローを求めるアルゴリズムである[1]レスター・フォード Jr.(英語版、ドイツ語版、フランス語版、ロシア語版)デルバート・ファルカーソン(英語版、ドイツ語版、スペイン語版、フランス語版) にちなんで命名されたもので、1956年に発表された。フォード・ファルカーソンのアルゴリズムの特殊版であるエドモンズ-カープアルゴリズムも「フォード・ファルカーソン」と呼ばれることがある。

このアルゴリズムの背景にある考え方は非常に単純である。始点から終点への経路があって、経路上の各辺に容量の空きがあるとき、その経路を使って流れを作ることができる。これを経路が見つかるたびにくりかえす。容量に空きがある経路を「増加道; augmenting path」と呼ぶ。

アルゴリズム

グラフ G ( V , E ) {\displaystyle G(V,E)} にて、 u {\displaystyle u} から v {\displaystyle v} への容量 c ( u , v ) {\displaystyle c(u,v)} でフロー f ( u , v ) = 0 {\displaystyle f(u,v)=0} とする。ここで、始点 s {\displaystyle s} から終点 t {\displaystyle t} への最大フローを求める。最終的に、次のような状態となる。

  •   f ( u , v ) c ( u , v ) {\displaystyle \ f(u,v)\leq c(u,v)}  : u {\displaystyle u} から v {\displaystyle v} へのフローは容量を超えない。
  •   f ( u , v ) = f ( v , u ) {\displaystyle \ f(u,v)=-f(v,u)}  : u {\displaystyle u} v {\displaystyle v} の間の総フローの性質。 u {\displaystyle u} から v {\displaystyle v} へのフローが a {\displaystyle a} v {\displaystyle v} から u {\displaystyle u} へのフローが b {\displaystyle b} であるとき、 f ( u , v ) = a b {\displaystyle f(u,v)=a-b} であり、かつ f ( v , u ) = b a {\displaystyle f(v,u)=b-a} となる。
  •   v f ( u , v ) = 0 f i n ( u ) = f o u t ( u ) {\displaystyle \ \sum _{v}f(u,v)=0\Longleftrightarrow f_{in}(u)=f_{out}(u)}  : s {\displaystyle s} t {\displaystyle t} を除く全てのノード u {\displaystyle u} で成り立つ。あるノードに流れ込むフローとそこから出て行くフローは常に等しい。

すなわち、ネットワーク上のフローは、アルゴリズムの毎回の適用後に常に正当なものとなる。ここで、残余ネットワーク G f ( V , E f ) {\displaystyle G_{f}(V,E_{f})} を容量が c f ( u , v ) = c ( u , v ) f ( u , v ) {\displaystyle c_{f}(u,v)=c(u,v)-f(u,v)} で、フローのないネットワークと定義する。ただし、 u , v {\displaystyle u,v} のフローによって u , v {\displaystyle u,v} がクローズ(満杯)となっても v , u {\displaystyle v,u} は残余ネットワークに残る可能性があるため、 E = E f {\displaystyle E=E_{f}} となるかどうかは定かではない。

アルゴリズム フォード・ファルカーソン

入力 フロー容量 c {\displaystyle \,c} 、始点 s {\displaystyle \,s} 、終点 t {\displaystyle \,t} のグラフ G {\displaystyle \,G}
出力 s {\displaystyle \,s} から t {\displaystyle \,t} へのフロー f {\displaystyle \,f} の最大値
  1. 全ての枝 ( u , v ) {\displaystyle \,(u,v)} について f ( u , v ) 0 {\displaystyle f(u,v)\leftarrow 0} とする。
  2. G f {\displaystyle \,G_{f}} 内で s {\displaystyle \,s} から t {\displaystyle \,t} への経路 p {\displaystyle \,p} があり、経路上の全ての枝 ( u , v ) p {\displaystyle (u,v)\in p} について c f ( u , v ) > 0 {\displaystyle \,c_{f}(u,v)>0} であるとき:
    1. c f ( p ) = min { c f ( u , v ) | ( u , v ) p } {\displaystyle \,c_{f}(p)=\min\{c_{f}(u,v)\;|\;(u,v)\in p\}} を求める。
    2. ( u , v ) p {\displaystyle (u,v)\in p} であるような各枝について
      1. f ( u , v ) f ( u , v ) + c f ( p ) {\displaystyle f(u,v)\leftarrow f(u,v)+c_{f}(p)} (この枝にそってフローを送る)
      2. f ( v , u ) f ( v , u ) c f ( p ) {\displaystyle f(v,u)\leftarrow f(v,u)-c_{f}(p)} (フローは後で返される)

経路は、 G f ( V , E f ) {\displaystyle G_{f}(V,E_{f})} について、例えば幅優先探索深さ優先探索を行うことで得られる。前者の場合を特にエドモンズ-カープアルゴリズムと呼ぶ。

複雑性

フロー増加道をグラフ上で既に確立されているフローに追加していくと、最終的にフロー増加道が見つからなくなり、最大フローが得られる。しかし、そのような状態に到達するかどうかは不確実であり、単にアルゴリズムが完了した場合は解が正しいということしか保証できない。アルゴリズムが無限に実行される場合、そのフローは最大フローに近づいているかどうかも不明である。ただし、そのような状態はフローの値が無理数の場合でしか発生しない。容量が整数の場合、フォード・ファルカーソンの実行時間の上限は O(Ef) であり、E はグラフ内の枝数、f はグラフの最大フローである。これは、増加道が O(E) 回まで見つけることができ、毎回少なくともフローが 1 増加するためである。

フォード・ファルカーソンのアルゴリズムの派生として、エドモンズ-カープアルゴリズムがある。これは、終了することが保証されており、最大フローと実行時間が独立で、実行時間は O(VE2) となる。

以下の例は、4ノードのフローネットワークでフォード・ファルカーソンのアルゴリズムを適用する様子を最初の数ステップだけ図示したものである。始点は A で終点は D。増加道は深さ優先探索で探し、隣接ノードは辞書順で調べる。この例では、アルゴリズムの最悪ケースを示している。各ステップではフローは1ずつしか増えない。この場合、幅優先探索で経路を求めると、2ステップで完了する。

経路 容量 フローネットワーク
初期状態のフローネットワーク
A , B , C , D {\displaystyle A,B,C,D} min ( c f ( A , B ) , c f ( B , C ) , c f ( C , D ) ) {\displaystyle \min(c_{f}(A,B),c_{f}(B,C),c_{f}(C,D))}

= min ( c ( A , B ) f ( A , B ) , c ( B , C ) f ( B , C ) , c ( C , D ) f ( C , D ) ) {\displaystyle =\min(c(A,B)-f(A,B),c(B,C)-f(B,C),c(C,D)-f(C,D))}
= min ( 1000 0 , 1 0 , 1000 0 ) {\displaystyle =\min(1000-0,1-0,1000-0)}
= 1 {\displaystyle =1}

A , C , B , D {\displaystyle A,C,B,D} min ( c f ( A , C ) , c f ( C , B ) , c f ( B , D ) ) {\displaystyle \min(c_{f}(A,C),c_{f}(C,B),c_{f}(B,D))}

= min ( c ( A , C ) f ( A , C ) , c ( C , B ) f ( C , B ) , c ( B , D ) f ( B , D ) ) {\displaystyle =\min(c(A,C)-f(A,C),c(C,B)-f(C,B),c(B,D)-f(B,D))}
= min ( 1000 0 , 0 ( 1 ) , 1000 0 ) {\displaystyle =\min(1000-0,0-(-1),1000-0)}
= 1 {\displaystyle =1}

1998ステップ後…
最終的なフローネットワーク

経路 A,C,B,D を見つけたとき、C から B へフローが押し戻される点に注意されたい。

参考文献

  1. ^ T. コルメン、R. リベスト、C. シュタイン、C. ライザーソン『アルゴリズムイントロダクション』(第3版)近代科学社、2013年12月17日(原著2009-7-31)。ISBN 476490408X。 

外部リンク

  • Ford-Fulkerson's algorithm アニメーション解説あり

ウィキメディア・コモンズには、フォード・ファルカーソンのアルゴリズムに関するカテゴリがあります。

ソート
比較ソート
線形時間ソート
並行ソート
非効率的
グラフ
探索
リスト
木・グラフ
文字列
最短経路問題
最小全域木
最大フロー問題
最小カット問題
線型計画問題
順序統計量
計算幾何学
種類
その他
カテゴリ
非線形(無制約)
… 関数 
勾配法
収束性
準ニュートン法
その他の求解法
ヘッセ行列
  • 最適化におけるニュートン法(英語版)
The graph of a strictly concave quadratic function is shown in blue, with its unique maximum shown as a red dot. Below the graph appears the contours of the function: The level sets are nested ellipses.
Optimization computes maxima and minima.
非線形(制約付き)
一般
微分可能
凸最適化
凸縮小化
  • 切除平面法(英語版、デンマーク語版、ドイツ語版、スペイン語版)
  • 簡約勾配法
  • 劣勾配法(英語版)
線型 および
二次
内点法
ベイズ-交換
  • 単体法
  • 改訂シンプレックス法(英語版)
  • 十字法(英語版)
  • レムケの主ピボット操作法(英語版)
組合せ最適化
系列範例
(Paradigms)
グラフ理論
最小全域木
最大フロー問題
  • Dinic法(英語版)
  • エドモンズ・カープ
  • フォード・ファルカーソン
  • プッシュリラベル最大流アルゴリズム(英語版)
メタヒューリスティクス
  • カテゴリ(最適化 • アルゴリズム) • ソフトウェア(英語版)