Metoda Forda-Fulkersona

Metoda Forda-Fulkersona jest stosowana do znajdowania maksymalnego przepływu w sieci przepływowej. Stanowi podstawę wielu algorytmów, między innymi algorytmu Edmondsa-Karpa czy algorytmu Dynica

Zasadę jej działania można streścić w następujący sposób: Należy zwiększać przepływ wzdłuż dowolnej ścieżki ze źródła do ujścia, dopóki jest to możliwe.

Pojęcia

Dla dowolnej sieci przepływowej G = ( V , E ) {\displaystyle G=(V,E)} o źródle s {\displaystyle s} i ujściu t , {\displaystyle t,} w której dowolna krawędź ( u , v ) {\displaystyle (u,v)} należąca do zbioru E {\displaystyle E} ma przepustowość c ( u , v ) {\displaystyle c(u,v)} oraz przepływ f {\displaystyle f} definiuje się następujące pojęcia:

Sieć rezydualna

Siecią rezydualną dla sieci przepływowej G {\displaystyle G} nazywamy sieć G f = ( V , E f ) , {\displaystyle G_{f}=(V,E_{f}),} gdzie E f {\displaystyle E_{f}} jest zdefiniowane następująco:

E f = { ( u , v ) V × V : c f ( u , v ) > 0 } {\displaystyle E_{f}=\left\{(u,v)\in V\times V:c_{f}(u,v)>0\right\}}

gdzie c f ( u , v ) {\displaystyle c_{f}(u,v)} oznacza tzw. przepustowość rezydualną dla krawędzi ( u , v ) . {\displaystyle (u,v).} Ta natomiast jest dana wzorem:

c f ( u , v ) = c ( u , v ) f ( u , v ) {\displaystyle c_{f}(u,v)=c(u,v)-f(u,v)}

Krawędzie należące do E f {\displaystyle E_{f}} nazywa się krawędziami rezydualnymi.

Bardziej intuicyjnie, przepustowość rezydualna dla pewnej krawędzi ( u , v ) {\displaystyle (u,v)} oznacza, o ile można zwiększyć przepływ przez nią, tak jednak, aby nie przekroczył on jej przepustowości. Do sieci rezydualnej natomiast należą te krawędzie, przez które przepływ można zwiększyć.

Należy zwrócić uwagę, że może zachodzić

c f ( u , v ) > c ( u , v ) . {\displaystyle c_{f}(u,v)>c(u,v).}

Ma to miejsce w przypadku, gdy f ( u , v ) < 0. {\displaystyle f(u,v)<0.} W szczególności, do E f {\displaystyle E_{f}} mogą należeć krawędzie nienależące do E . {\displaystyle E.}

Ścieżka powiększająca

Ścieżką powiększającą dla sieci G {\displaystyle G} nazywamy dowolną ścieżkę z s {\displaystyle s} do t {\displaystyle t} w sieci rezydualnej dla G . {\displaystyle G.} Przepustowość rezydualną dowolnej ścieżki powiększającej p {\displaystyle p} dla sieci G {\displaystyle G} określamy wzorem:

c f ( p ) = min { c f ( u , v ) : ( u , v ) p } {\displaystyle c_{f}(p)=\min \left\{c_{f}(u,v):(u,v)\in p\right\}}

Jest to wartość, o jaką maksymalnie można zwiększyć przepływ przez wszystkie krawędzie należące do ścieżki p . {\displaystyle p.}

Algorytm

Poniżej przedstawiono zapis metody Forda-Fulkersona w pseudokodzie:

while istnieje pewna ścieżka powiększająca 
  
    
      
        p
        
        
          G
          
            f
          
        
      
    
    {\displaystyle p\in G_{f}}
  
 do
    for each 
  
    
      
        (
        u
        ,
        v
        )
        
        p
      
    
    {\displaystyle (u,v)\in p}
  
 do
        
  
    
      
        f
        (
        u
        ,
        v
        )
        :=
        f
        (
        u
        ,
        v
        )
        +
        
          c
          
            f
          
        
        (
        p
        )
      
    
    {\displaystyle f(u,v):=f(u,v)+c_{f}(p)}
  

        
  
    
      
        f
        (
        v
        ,
        u
        )
        :=
        f
        (
        v
        ,
        u
        )
        
        
          c
          
            f
          
        
        (
        p
        )
      
    
    {\displaystyle f(v,u):=f(v,u)-c_{f}(p)}
  

Złożoność czasowa

Złożoność czasowa metody Forda-Fulkersona silnie zależy od sposobu wyszukiwania ścieżki powiększającej p . {\displaystyle p.} Można jednak znaleźć jej górne ograniczenie. Zauważmy, że za każdym razem, gdy taka ścieżka zostanie znaleziona, przepływ ze źródła do ujścia zostanie zwiększony co najmniej o 1. Niech f m a x {\displaystyle f_{max}} oznacza maksymalny przepływ w sieci G . {\displaystyle G.} Wtedy pętla while zostanie wykonana w co najwyżej | f m a x | {\displaystyle |f_{max}|} iteracjach. Ponieważ na ścieżce p {\displaystyle p} może leżeć co najwyżej | E | {\displaystyle |E|} krawędzi, dla każdej takiej ścieżki pętla for each zostanie zakończona po nie więcej, niż | E | {\displaystyle |E|} przebiegach. Ponieważ również wyszukiwanie ścieżki powiększającej można zrealizować w czasie O ( E ) , {\displaystyle O(E),} złożoność czasowa metody Forda-Fulkersona, to O ( E f m a x ) . {\displaystyle O\left(Ef_{max}\right).}

W rzeczywistości, jedna z popularniejszych implementacji tej metody, algorytm Edmondsa-Karpa ma złożoność O ( V E 2 ) . {\displaystyle O(VE^{2}).}

Przykład

Poniższy przykład przedstawia początkowe kroki metody Forda-Fulkersona w sieci z 4 wierzchołkami, źródłem A oraz ujściem D. Ścieżki powiększające są wyszukiwane za pomocą przeszukiwania w głąb, w którym sąsiadujące wierzchołki są odwiedzane w kolejności alfabetycznej. Jest to najgorszy możliwy przypadek, gdyż w każdej iteracji pętli głównej procedury przepływ jest powiększany tylko o 1.

Ścieżka Przepustowość Otrzymany przepływ
Sytuacja początkowa
A , B , C , D {\displaystyle A,B,C,D}

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 ) } = min { 1000 0 , 1 0 , 1000 0 } = 1 {\displaystyle {\begin{aligned}&\min \left\{c_{f}(A,B),c_{f}(B,C),c_{f}(C,D)\right\}\\={}&\min \left\{c(A,B)-f(A,B),c(B,C)-f(B,C),c(C,D)-f(C,D)\right\}\\={}&\min \left\{1000-0,1-0,1000-0\right\}=1\end{aligned}}}

A , C , B , D {\displaystyle A,C,B,D}

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 ) } = min { 1000 0 , 0 ( 1 ) , 1000 0 } = 1 {\displaystyle {\begin{aligned}&\min \left\{c_{f}(A,C),c_{f}(C,B),c_{f}(B,D)\right\}\\={}&\min \left\{c(A,C)-f(A,C),c(C,B)-f(C,B),c(B,D)-f(B,D)\right\}\\={}&\min \left\{1000-0,0-(-1),1000-0\right\}=1\end{aligned}}}

{\displaystyle \dots }
Sytuacja końcowa

Warto zwrócić uwagę, w jaki sposób przepływ „wraca” z wierzchołka C do B po wykorzystaniu ścieżki A,C,B,D.

Bibliografia

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Wprowadzenie do algorytmów, WNT 2004, ISBN 83-204-2879-3.


Zobacz multimedia związane z tematem: Metoda Forda-Fulkersona