Zaawansowane algorytmy i struktury danych/Wykład 9: Różnice pomiędzy wersjami
Linia 213: | Linia 213: | ||
Działanie tego algorytmu przestawione jest na następującej animacji. | Działanie tego algorytmu przestawione jest na następującej animacji. | ||
<flash>file= | <flash>file=Zasd_ilustr_r.swf |width=600|height=500</flash> | ||
Czas działania metody Forda-Fuklersona zależy od wyboru ścieżki powiększającej. Jeżeli będziemy ją wybierać, źle to algorytm wręcz może się nie zakończyć. W przypadku gdy przepustowości krawędzi są całkowito liczbowe to łatwo możemy pokazać, że czas działania tego algorytmu wynosi <math>O(E|f^*|)</math>, gdzie <math>f^*</math> jest przepływem maksymalnym w sieci. Jeżeli przepływ <math>f^*</math> jest mały to algorytm ten działa szybko, jednak może się zdarzyć nawet dla prostego przykładu, że algorytm będzie musiał wykonać <math>f^*</math> iteracji. Taki przykład pokazany jest na poniższej animacji. | Czas działania metody Forda-Fuklersona zależy od wyboru ścieżki powiększającej. Jeżeli będziemy ją wybierać, źle to algorytm wręcz może się nie zakończyć. W przypadku gdy przepustowości krawędzi są całkowito liczbowe to łatwo możemy pokazać, że czas działania tego algorytmu wynosi <math>O(E|f^*|)</math>, gdzie <math>f^*</math> jest przepływem maksymalnym w sieci. Jeżeli przepływ <math>f^*</math> jest mały to algorytm ten działa szybko, jednak może się zdarzyć nawet dla prostego przykładu, że algorytm będzie musiał wykonać <math>f^*</math> iteracji. Taki przykład pokazany jest na poniższej animacji. | ||
<flash>file=zasd_ilustr_c.swf |width=600|height=500</flash> | <flash>file=zasd_ilustr_c.swf |width=600|height=500</flash> |
Wersja z 11:01, 22 wrz 2006
Abstrakt
Wykład ten poświęcony będzie problemowi znajdowania maksymalnego przepływu w grafie. Zaczniemy od wprowadzenia potrzebnych pojęć, a następnie przestawimy metodę Forda-Fulkersona znajdowania maksymalnego przepływu w grafie.
Podstawowe pojęcia
Siecią przepływową, bądź krótko siecią, nazywamy skierowany graf , w którym z każdą krawędzią wiążemy jej nieujemną przepustowość . W sieci przepływowej wyróżniamy dwa wierzchołki źródło oznaczane jako oraz ujście oznaczane jako .
Niech będzie siecią oraz niech będzie dla niej funkcją przypisującą przepustowości. Przepływem w nazwiemy funkcję spełniającą następujące właściwości:
- Dla wszystkich zachodzi - warunek ten nazywamy warunekiem ograniczenia przepustowości.
- Dla wszystkich zachodzi - jest to warunek skośnej symetrii.
- Dla wszystkich żądamy aby zachodził warunek zachowania przepływu:
O wartości mówimy, że jest to wielkość przepływu z do . Wartość przepływu , oznaczamy i definiujemy jako sumaryczną wielkość przepływu wypływającego z wszystkimi krawędziami, tzn:
W problemie maksymalnego przepływu dla danej sieci chcemy znaleźć przepływ o największej wartości.
W dalszej części wykładu używać będziemy następującej notacji sumacyjnej, w której argument funkcji może być podzbiorem dziedziny . W takim wypadku przyjmujemy, że wartością funkcji jest suma jej wartości dla zbioru , tzn.:
Używając tej notacji możemy zapisać warunek zachowania przepływu dla wierzchołka jako . W poniższym lemacie używamy tej notacji do zapisania podstawowych właściwości przepływu.
Lemat 1
- Dla wszystkich mamy .
- Dla wszystkich mamy .
- Dla wszystkich zachodzi:
- .
Dowód tego lematu pozostawiony jest jako Zadanie 1 do tego wykładu.
Sieć rezydualna
Intuicyjnie, dla danej sieci przepływowej i przepływu , siec rezydualna składa się z krawędzi, którymi można przesłać większy przepływ. Bardziej formalnie, przypuśćmy, że mamy sieć przepływów ze źródłem i ujściem oraz niech będzie przepływem w . Rozważmy teraz parę wierzchołków . Ilość dodatkowego przepływu którą możamy przesłać z do zanim przekroczymy przepustowość wynosi ,
Na przykład, jeśli i , wtedy zwiększamy o jednostek zanim przekroczymy ograniczenie w przepustowości krawędzi .
Dla danej sieci i przepływu , sieć rezydualna zaindukowana przez to f), gdzie:
To znaczy, tak jak napisaliśmy powyżej, że każdą krawędzią sieci rezydualnej, lub krawędzią rezydualną, może przepuścić przepływ, który jest większy niż 0.
Krawędzie w są albo krawędziami w albo krawędziami o odwróconym kierunku. Jeśli mamy dla krawędzi , to wtedy i . Jeśli dla krawędzi , to wtedy . W tym przypadku, , i dlatego . Jeśli ani ani nie pojawiają się w pierwotnej sieci, to wówczas i , a zatem też . Podsumowując, krawędź może się pojawić w sieci rezydualnej tylko wtedy, kiedy co najmniej jedna z krawędzi i jest w pierwotnej sieci. Dlatego też . Należy zauważyć, że sieć rezydualna jest także siecią przepływową o przepustowości zadanej przez . Następujący lemat pokazuje jak przepływ w rezydualnej sieci powiązany jest z przepływem w pierwotnej sieci przepływów.
Lemat 1
Dowód
W przypadku ograniczenia przepustowości zauważmy, ze dla wszystkich i dlatego:
W przypadku warunku zachowania przepływu, należy zauważyć, że dla wszystkich , mamy:
Ostatecznie otrzymujemy, że wartość wynosi:

Ścieżki powiększające
Jeśli dana jest sieć przepływowa i przepływ , wówczas ścieżka powiększająca jest prostą ścieżką z do w rezydualnej sieci . Z definicji sieci rezydualnej, każda krawędź na ścieżce powiększającej pozwala na przesłanie pewnego dodatkowego przepływu z do bez naruszenia ograniczenia przepustowości krawędzi. Znajdowanie ścieżki powiększającej w sieci rezydualnej a następnie powiększenie przy jej pomocy przepływu zobrazowane jest na następującej animacji.
<flash>file=Zasd_ilustr_l.swf |width=600|height=500</flash>
Najwyższą wartość o jaką można zwiększyć przepływ przy użyciu ścieżki nazywamy rezydualną przepustowością . Wielkość ta jest dana przez:
Zdefiniujmy tą zmianę przepływu związany ze ścieżką jako funkcję Parser nie mógł rozpoznać (błąd składni): {\displaystyle f_p : V × V \to R} równą:
(1)
Wówczas, jest przepływem w o wartości .
Dodając do , otrzymamy kolejny przepływ w , którego wartość jest bliższa maksimum, co sformułowane jest w tym wniosku.
Wniosek 2
Przekroje w sieci
Twierdzenie max-flow min-cut, które za chwile udowodnimy, pokazuje ze przepływ jest maksymalny wtedy i tylko wtedy, kiedy jego siec rezydualna nie zawiera żadnej ścieżki powiększającej. Jednak, aby udowodnić to twierdzenie, musimy wpierw wprowadzić pojęcie przekroju sieci przepływów. Przekrój sieci przepływowej jest podziałem na i tak, że i . Jeśli jest przepływem wtedy przepływ netto poprzez przekrój jest zdefiniowany jako . Przepustowość przekroju definiujemy jako . Minimalnym przekrojem sieci jest przekrój którego przepustowość jest minimalna dla wszystkich krawędzi sieci.
Poniższa ilustracja pokazuje przekrój w sieci przepływów. Przepływ netto poprzez ten przekrój wynosi: , a jego przepustowość wynosi .
<flash>file=Zasd_ilustr_b.swf |width=600|height=500</flash>
Należy zaobserwować, że przepływ netto w przekroju może zawierać negatywne przepływy pomiędzy wierzchołkami, jednakże przepustowość przekroju składa się wyłącznie z nie ujemnych wartości. Innymi słowy, przepływ netto poprzez przekrój składa się z dodatnich przepływów płynących w dwa kierunki; dodatni przepływ z do jest dodawany, podczas gdy dodatni przepływ z do jest odejmowany. Z drugiej strony, przepustowość przekroju jest obliczana tylko od krawędzi odchodzących z do . Krawędzie biegnące z do nie są włączone do obliczeń . Powyższy lemat pokazuje ze przepływ netto przez jakikolwiek przekrój jest taki sam i równy jest wartości przepływu.
Lemat 3
{{dowod|||3=Zauważmy, że z warunku zachowania przepływu, dlatego
{{wzor2|1=
Jako w wniosek z tego lematu otrzymujemy, że przepustowość przekroju jest graniczeniem na wartość przepływu.
Wniosek 4
{{dowod|||3 Niech będzie dowolnym przekrojem w i niech będzie dowolnym przepływem. Z lematu 3 i warunku ograniczenia przepustowości otrzymujemy:
W szczególności maksymalny przepływ w sieci jest ograniczony odgórnie przez przepustowość najmniejszego przekroju w sieci. Twierdzenie o maksymalnym przepływie i minimalnym przekroju, które teraz postawomy i udowadniamy, mówi że wartość maksymalnego przepływu jest w rzeczywistości równa przepustowości najmniejszego przekroju.
{{twierdzenie|5 [O maksymalnym przepływie i minimalnym przekroju]|twierdzenie_5|3=Jeśli jest przepływem w sieci przepływowej ze źródłem i ujściem , wówczas następujące warunki są spełnione:
- jest maksymalnym przepływem w .
- Sieć rezydualna nie zawiera żadnych ścieżek powiększających.
- dla pewnego przekroju w .
Dowód
(2)(3): Przypuśćmy, że nie posiada żadnej ścieżki powiększającej, to znaczy że nie posiada żadnej ścieżki z do . Zdefiniujmy
oraz, . Podział jest przekrojem: oczywiście i , ponieważ nie ma żadnej ścieżki z do w . Dla każdej pary wierzchołków i , mamy , gdyż w przeciwnym wypadku , co umiejscowiłoby w zbiorze . Dlatego też, z lematu 3, mamy .
(3)\(1): Z wniosku 4 wiemy, że dla wszystkich przekrojów . Czyli warunek, że co oznacza, że jest ścieżką maksymalną.
Algorytm Forda – Fulkersona
W każdej iteracji metody Forda–Fulkersona odnajdujemy dowolną ścieżkę powiększające i zwiększamy przepływ na każdej krawędzi o przepustowość rezydualną . Poniżej zamieszczamy implementacje tej metody.
Algorytm [Forda-Fulkersona] znajduje przepływ maksymalny w grafie
FORD-FULKERSON() 1 for każda krawędź do 2 begin 3 4 5 end 6 while istnieje ścieżka z do w sieci rezydualnej do 7 begin 8 9 for każda krawędź do 10 begin 11 12
Działanie tego algorytmu przestawione jest na następującej animacji. <flash>file=Zasd_ilustr_r.swf |width=600|height=500</flash>
Czas działania metody Forda-Fuklersona zależy od wyboru ścieżki powiększającej. Jeżeli będziemy ją wybierać, źle to algorytm wręcz może się nie zakończyć. W przypadku gdy przepustowości krawędzi są całkowito liczbowe to łatwo możemy pokazać, że czas działania tego algorytmu wynosi , gdzie jest przepływem maksymalnym w sieci. Jeżeli przepływ jest mały to algorytm ten działa szybko, jednak może się zdarzyć nawet dla prostego przykładu, że algorytm będzie musiał wykonać iteracji. Taki przykład pokazany jest na poniższej animacji.
<flash>file=zasd_ilustr_c.swf |width=600|height=500</flash>