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

フォード・ファルカーソン法またはフォード・ファルカーソンアルゴリズムFFA)は、フローネットワーク最大フローを計算する貪欲アルゴリズムです。残差グラフにおける増加パスの探索手法が完全には規定されていないため[1]、あるいは実行時間が異なる複数の実装が規定されているため、 [2]「アルゴリズム」ではなく「手法」と呼ばれることもあります。この手法は1956年にLRフォード・ジュニアDRファルカーソンによって発表されました[3] 「フォード・ファルカーソン」という名称は、フォード・ファルカーソン法の完全に定義された実装であるエドモンズ・カープアルゴリズムにもしばしば使用されます。

このアルゴリズムの背後にある考え方は次のとおりです。ソース(開始ノード)からシンク(終了ノード)へのパスが存在し、パス上のすべてのエッジに利用可能な容量がある場合、フローをいずれかのパスに沿って送信します。次に、別のパスを見つけ、これを繰り返します。利用可能な容量を持つパスは、増加パスと呼ばれます。

アルゴリズム

グラフを u とし、 u から v への各辺について容量フローとする。ソースsからシンクtへの最大フローを求める。アルゴリズムの各ステップにおいて、以下の式が成り立つ。

容量制約エッジに沿ったフローはその容量を超えることはできません。
歪んだ対称性uからvへの純フローは、vからuへの純フローの反対である必要があります(例を参照)。
フローの保存フローを「生成」するソースと、フローを「消費」するシンクを除き、ノードへのネット フローはゼロになります。
値(f)sから出ていくフローはtに到着するフローと等しくなければなりません

これは、アルゴリズムの各ラウンドの後に、ネットワークを通過するフローが合法的なフローになることを意味します。残余ネットワークを 、容量がありフローがないネットワークと定義します。vからuへのフローが、元のネットワークでは許可されていないにもかかわらず、残余ネットワークでは許可される場合があることに注意ください

アルゴリズムフォード・フルカーソン
入力 フロー容量c、ソースノードs、シンクノードtを持つネットワーク が与えられている
出力 sからtへの最大値のフローfを計算する
  1. すべてのエッジについて
  2. にはsからtへのパスp がありすべてのエッジに対して次のようになります
    1. 探す
    2. 各エッジについて
      1. パスに沿ってフローを送信します
      2. フローは後で「返される」可能性があります
  • 「←」は代入を表します。例えば、「biggestitem 」は、 biggest の値がitemの値に変更されることを意味します
  • return」はアルゴリズムを終了し、次の値を出力します。

ステップ2のパスは、例えば幅優先探索BFS)や深さ優先探索によって見つけることができます。前者はエドモンズ・カープアルゴリズムとして知られています。

ステップ2でこれ以上の経路が見つからない場合、残余ネットワークにおいてs はtに到達できなくなります。残余ネットワークにおいてsが到達可能なノードの集合をSとすると、元のネットワークにおけるSからVの残りの部分へのエッジの総容量は、一方ではsからtへの総フローに等しく、他方ではそのようなフローすべての上限として機能します。これは、我々が発見したフローが最大であることを証明しています。最大フロー・最小カット定理も参照してください。

グラフに複数のソースとシンクがある場合、次のように動作します。 とと仮定します。からすべてのノード への辺を持つ新しいソースを追加します。容量は です。 また、すべてのノード からへの辺を持つ新しいシンクを追加します。容量は です。 次に、Ford–Fulkerson アルゴリズムを適用します。


また、ノードu に容量制約 がある場合、このノードを容量 を持つ2 つのノードと 1 つのエッジに置き換えます。その後、Ford–Fulkerson アルゴリズムを適用できます。

複雑

フロー増加パスをグラフ内にすでに確立されているフローに追加することで、グラフ内にそれ以上のフロー増加パスが見つからなくなったときに最大フローに到達します。 ただし、この状況に必ず到達するという保証はないため、アルゴリズムが終了した場合に答えが正しいことが保証されるのが最善です。 アルゴリズムが終了しない場合は、フローが最大フローに収束しない可能性があります。 ただし、この状況は無理数のフロー値でのみ発生します。[4] 容量が整数の場合、Ford–Fulkerson の実行時間は( big O 表記 を参照) で制限されます。ここで、はグラフ内のエッジ数、はグラフ内の最大フローです。 これは、各増加パスが時間内に見つかり、フローが少なくとも の整数量増加し、上限が であるためです

終了が保証され、実行時間が最大フロー値に依存しない Ford–Fulkerson アルゴリズムのバリエーションとして、時間内で実行されるEdmonds–Karp アルゴリズムがあります。

整数フローの例

以下の例は、4つのノード(ソースとシンク )を持つフローネットワークにおけるFord–Fulkerson法の最初のステップを示しています。この例は、アルゴリズムの最悪ケースの動作を示しています。各ステップでは、 のフローのみがネットワークを介して送信されます。代わりに幅優先探索を使用すれば、必要なステップは2つだけです。

ステップフローネットワーク
初期フローネットワーク。
フローは増加パスに沿って送られます。ここでボトルネックとなるのは-エッジなので、フローは1ユニットのみ可能です。
ここで、1単位のフローが増加経路 に沿って送られます。この場合、フローは から へ「押し戻され」ます元々 から へ流れ込んでいたフローは、今では からへ流れ込むため、 に直接フローを送ることができます。その結果、-エッジのフローはゼロになりますが、全体のフローは1増加します。
1998 年の中間ステップはここでは省略します。
合計フローが 2000 ユニットの最終フロー ネットワーク。

終了しない例

右に示すフローネットワークを考えてみましょう。ソース、シンク、エッジの容量はそれぞれおよび、であり、その他のエッジの容量は整数です。定数は、となるように選択されています。拡張パスは、次の表に従って使用します。ここで、、およびです

ステップ増強パス送信フロー残存容量
0
1
2
3
4
5

ステップ 1 の後だけでなくステップ 5 の後でも、エッジ、の残余容量は、それぞれ、ある に対して、 、 、 という形式なっていることに注意してください。これは、増加パスを無限回使用でき、これらのエッジの残余容量は常に同じ形式になることを意味します。ステップ 5 後のネットワークの合計フローは です。上記のように増加パスを使用し続けると、合計フローは に収束します。ただし、に沿って 単位のフロー、 に沿って 1 単位のフローに沿って 単位のフローを送信することにより、値 のフローが発生することに注意してください。したがって、アルゴリズムが終了することはなく、フローは最大フローに収束しません。[5]

ユークリッドアルゴリズムに基づくもう1つの非終了例は、 Backman & Huynh (2018) によって示されています。この例では、順序数ネットワーク上での Ford-Fulkerson アルゴリズムの最悪ケースの実行時間がであることも示されています

Edmonds-KarpアルゴリズムのPython実装

コレクションをインポートする クラスGraph :  「」 このクラスは有向グラフを表現する。 隣接行列表現。 「」 def __init__ ( self graph ):   self . graph  =  graph  # 残差グラフ self.row = len (グラフ)   def bfs ( self s t parent ):     「」 パスがある場合はtrueを返します 残差グラフのソース 's' からシンク 't' へ。 また、パスを保存するためにparent[]を入力します。 「」 # すべての頂点を未訪問としてマークする 訪問 =  [ False ]  * 自己. # BFS用のキューを作成する キュー = コレクションデク() # ソースノードを訪問済みとしてマークし、キューに追加します キュー.追加( s ) 訪問[ s ]  =  True # 標準BFSループ  キュー: u  = キュー. popleft () # キューから外された頂点 u の隣接する頂点をすべて取得する # 隣接した場所がまだ訪問されていない場合は、マークを付けます # 訪問してキューに追加  enumerate ( self . graph [ u ] )内のind  val について:   訪問[ ind ]  ==  Falseかつ val > 0 場合:   キュー.append ( ind ) 訪問済み[ ind ]  =  True [ ind ]  =  u # ソースからBFSのシンクに到達した場合は、戻ります # 真、そうでない場合は偽  訪問した戻る[ t ] # 与えられたグラフにおける s から t への最大フローを返します edmonds_karpの定義( self source sink ):    # この配列はBFSによって埋められ、パスを格納する  =  [ - 1 ]  * 自己. max_flow  =  0  # 最初はフローはありません # ソースからシンクへのパスがある間にフローを増強する  self.bfs ( source , sink , parent )場合:   # エッジの最小残余容量を求める # BFSで埋められたパス。あるいは最大フローを求めるとも言える。 # 見つかったパスを通過します。 path_flow  =  float ( "Inf" ) s  = シンク  s  != ソースの場合: path_flow  =  min ( path_flow ,  self . graph [ parent [ s ]][ s ]) s  = [ s ] # 全体のフローにパスフローを追加する 最大フロー += パスフロー # エッジとリバースエッジの残余容量を更新します # 道沿い v  = シンク  v  != ソースの場合: u  = [ v ] 自己.グラフ[ u ][ v ]  -= パスフロー 自己.グラフ[ v ][ u ]  += パスフロー v  = [ v ]  max_flowを返す

参照

注記

  1. ^ Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng (2009). 『電子設計自動化:合成、検証、テスト』 Morgan Kaufmann. pp. 204. ISBN 978-0080922003{{cite book}}: CS1 maint: multiple names: authors list (link)
  2. ^ トーマス・H・コーメン;チャールズ・E・ライザーソン。ロナルド・L・リベスト。クリフォード・スタイン (2009)。アルゴリズムの概要。 MITプレス。ページ714。ISBN 978-0262258104
  3. ^ Ford, LR ; Fulkerson, DR (1956). 「ネットワークを通じた最大フロー」(PDF) . Canadian Journal of Mathematics . 8 : 399–404 . doi :10.4153/CJM-1956-045-5. S2CID  16109790.
  4. ^ 「 Ford -Fulkerson最大フローラベリングアルゴリズム」1998年。CiteSeerX 10.1.1.295.9049 
  5. ^ Zwick, Uri (1995年8月21日). 「フォード・フルカーソン最大フロー法が停止しない可能性のある最小ネットワーク」.理論計算機科学. 148 (1): 165– 170. doi : 10.1016/0304-3975(95)00022-O .

参考文献

  • 最大フロー問題を解くためのフォード・フルカーソン法を説明するチュートリアル
  • もう1つのJavaアニメーション
  • Java Web Startアプリケーション

ウィキメディア・コモンズにおけるフォード・フルカーソンのアルゴリズムに関連するメディア

Retrieved from "https://en.wikipedia.org/w/index.php?title=Ford–Fulkerson_algorithm&oldid=1323732383"