Zaawansowane algorytmy i struktury danych/Wykład 5: Różnice pomiędzy wersjami
Linia 41: | Linia 41: | ||
<math>v</math>, której waga <math>w(p)</math> jest równa odległości | <math>v</math>, której waga <math>w(p)</math> jest równa odległości | ||
<math>\delta(u,v)</math> z <math>u</math> do <math>v</math>. | <math>\delta(u,v)</math> z <math>u</math> do <math>v</math>. | ||
'''W problemie najkrótszych ścieżek z jednego wierzchołka''' chcemy | |||
obliczyć odległości <math>\delta(s,v)</math> dla wszystkich | |||
wierzchołków <math>v\in V</math> wraz z drzewem najkrótszych ścieżek z <math>s</math>. | |||
'''Drzewem najkrótszych ścieżek''' o korzeniu w <math>s</math> | |||
nazywamy podgraf skierowany <math>G' = (V', E')</math>, w którym | |||
<math>V' \subseteq V</math>, <math>E' \subseteq E</math> taki, że: | |||
* V' jest zbiorem wierzchołków w <math>G</math> do których istnieje ścieżka | |||
z <math>s</math>, | |||
* <math>G'</math> jest drzewem którego korzeniem jest <math>s</math>, | |||
* dla każdego wierzchołka <math>v\in V'</math> jedyna ścieżka z <math>s</math> | |||
do <math>v</math> w grafie <math>G'</math> jest najkrótszą ścieżką z <math>s</math> | |||
do <math>v</math> w grafie <math>G</math>. | |||
W naszych algorytmach drzewo najkrótszych ścieżek będziemy | |||
reprezentować jako funkcję <math>\pi:V \to V</math> określającą | |||
poprzednika wierzchołka <math>v</math> w drzewie najkrótszych | |||
ścieżek. Drzewo najkrótszych ścieżek <math>G'=(V',E')</math> możemy | |||
uzyskać z <math>\pi</math> w następujący sposób: | |||
<center><math> V' = \{v \in V : \pi(v) \neq NIL} \cup {s}, | |||
</math></center> | |||
<center><math> | |||
E' = \{(\pi(v),v) \in E: v \in V_{\pi} - \{s\}\}. | |||
</math></center> | |||
== Historia Problemu == | == Historia Problemu == |
Wersja z 21:57, 20 lip 2006
Abstrakt
Pierwsza część tego wykładu poświęcona będzie problemowi obliczania najkrótszych ścieżek w grafie z jednego źródła w przypadku, w którym wagi krawędzi mogą być ujemne. Zaprezentujemy algorytm Bellmana-Forda, który rozwiązuje ten problem w czasie . W drugiej części zajmiemy się problemem obliczania odległości między wszystkimi parami wierzchołków. Pokażemy związki tego problemu z mnożeniem macierzy.
Definicja problemu
W wykładzie tym zajmiemy się problemem obliczania najkrótszych ścieżek w grafie wychodzących z jednego wierzchołka. Załóżmy, że mamy dany graf , funkcję przypisującą wagi krawędziom oraz jeden wybrany wierzchołek . Wagę ścieżki definiujemy jako wagę tworzących ją krawędzi:
Odległość z wierzchołka do wierzchołka
definiujemy jako
Najkrótszą ścieżką z wierzchołka do wierzchołka
jest każda ścieżka z do
, której waga jest równa odległości
z do .
W problemie najkrótszych ścieżek z jednego wierzchołka chcemy obliczyć odległości dla wszystkich wierzchołków wraz z drzewem najkrótszych ścieżek z .
Drzewem najkrótszych ścieżek o korzeniu w nazywamy podgraf skierowany , w którym , taki, że: * V' jest zbiorem wierzchołków w do których istnieje ścieżka z , * jest drzewem którego korzeniem jest , * dla każdego wierzchołka jedyna ścieżka z do w grafie jest najkrótszą ścieżką z do w grafie .
W naszych algorytmach drzewo najkrótszych ścieżek będziemy reprezentować jako funkcję określającą poprzednika wierzchołka w drzewie najkrótszych ścieżek. Drzewo najkrótszych ścieżek możemy uzyskać z w następujący sposób:
Historia Problemu
W dalszej części tego wykładu zajmiemy się przedstawieniem algorytm Bellmana-Forda, który jest jednym z kilku kilku rozwiązań dla problemu obliczania najkrótszych ścieżek z jednego wierzchołka w grafie. Metoda ta jest oparta na dwóch oddzielnych algorytmach podanych przez Bellmana oraz Forda Bellman opisał związek między problemem najkrótszych ścieżek a problemem ograniczeń liniowych (zobacz Zadania 1), natomiast Ford podał jak rozwiązać ten drugi problem. Algorytm Bellmana-Forda działa jest najszybszym znany algorytmem w pełni wielomianowych. Jest znane kilka algorytmów szybszych, które działają jednak tylko w przypadku całkowitoliczbowych wag krawędzi, a ich złożoność zależy od maksymalnej wagi krawędzi w grafie. Wszystkie te algorytmy przedstawione są w poniższej tabeli. Co ciekawe mimo, że jest to jeden z najbardziej klasycznych problemów algorytmiki, to jest on nadal żywy i najnowsze z tych algorytmów powstały w ostatnich latach.
Złożoność | Autor |
---|---|
Shimbel (1995) | |
Ford (1956), Bellman (1958) | |
Gabow (1983) | |
Gabow and Tarjan (1989) | |
Goldberg (1993) | |
Yuster and Zwick (2005), Sankowski (2005) |
Algorytm Bellmana-Forda
Algorytm Bellmana-Forda służy do rozwiązania problemu znalezienia najkrótszych ścieżek w grafie, w którym wagi krawędzi mogą być ujemne. W problemie tym mamy dany graf i funkcję wagową . Algorytm Bellmana-Forda wylicza dla zadanego wierzchołka , czy istnieje w grafie cykl o ujemnej wadze osiągalny z . Jeżeli taki cykl nie istniej to algorytm oblicza najkrótsze ścieżki z do wszystkich pozostałych wierzchołków wraz z ich wagami.
Relaksacja
Podobnie ja to było w Algorytmie Dijkstry użyjemy metody relaksacji. Metoda ta polega na tym, że w trakcie działania algorytmu dla każdego wierzchołka utrzymujemy wartość będącą górnym ograniczeniem wagi najkrótszej ścieżki ze do . W algorytmie utrzymywać będziemy także dla każdego wierzchołka wskaźnik wskazujący na poprzedni wierzchołek przez który prowadzi dotychczas znaleziona najkrótsza ścieżka. Na początku wielkości te inicjujemy przy pomocy następującej procedury:
Algorytm Inicjacja algorytmu najkrótszych ścieżek
INICJACJA for każdy wierzchołek do
Ustalone przez tą procedure wartości są dobrymi ograniczeniami
górnymi na odległości.
Relaksacja krawędzi polega na sprawdzeniu, czy przechodząc krawędzią z do , nie otrzymamy krótszej ścieżki z do niż ta dotychczas znaleziona. Jeżeli tak to aktualizowane są także wartości i . W celu relaksacji krawędzi używamy procedury RELAKSUJ.
Algorytm Relaksacja krawędzi
RELAKSUJ if then
Algorytm
Po przypomnieniu czym była relaksacja gotowi jesteśmy na zapisanie algorytm Bellmana-Forda, a następnie udowodnienie jego poprawności.
Algorytm Bellmana-Forda
BELLMAN-FORD 1 INICJUJ 2 for to do 3 for każda krawędź do 4 RELAKSUJ 5 for każda krawędź do 6 if ' then 7 return FALSE 8 return TRUE
Poniższa animacja przedstawia działanie algorytmu dla grafu o pięciu wierzchołkach.
Algorytm ten działa w czasie , co jest łatwo pokazać gdyż:
- proces inicjacji linia 1 zajmuje czas ,
- w każdym z przebiegów głównej pętli w lini 2 algorytmu przeglądane są wszystkie krawędzie grafu w linie 3 , co zajmuje czas ,
- końcowa pętla algorytmu linie 5-7 działa w czasie .
Poprawność
Dowód poprawności algorytmu Bellmana-Forda zaczniemy od pokazania, że algorytm działa poprawnie przy założeniu, że w grafie nie ma cykli o ujemnych wagach.
Lemat 1
Dowód
Zauważmy, że teza indukcyjna zachodzi po inicjacji algorytmu, gdyż Załóżmy, że teza indukcyjna zachodzi dla kroku 'tego. Ponieważ ścieżki dla są najkrótsze jako podścieżki ścieżki , to po wykonaniu pętli wartości dla się nie zmienią. Pozostaje nam więc do pokazania to, że wartość będzie dobrze policzona. W przebiegu wykonujemy między innymi relaksację krawędzi . Ponieważ jest dobrze policzone, to po tej relaksacji wyznaczona będzie także poprawnie wartość , bo założyliśmy, że najkrótsza ścieżka do przechodzi przez .
Pozostaje nam jedynie zastanowić się co się dzieje gdy wierzchołek nie jest osiągalny z . Musi wtedy zachodzić pod koniec działania algorytmu. Gdyby tak nie było to oznaczało by, z właściwości procedury RELAKSUJ, że istnieje ścieżka od do . Sprzeczność.
Dowód
Dowód ten można przeprowadzić w podobny sposób do dowodu lematu Lematu 1.

Twierdzenie 3
Dowód
Musimy teraz pokazać, że algorytm poprawnie wykrywa, czy w grafie istnieje cykl ujemnej długości osiągalny z . Jeżeli nie ma takiego cyklu to wtedy są poprawnie policzone przed wykonaniem testu w liniach 5-8 algorytmu Bellmana-Forda. W takim razie zachodzi:
Powyższa nierówność zachodzi ponieważ jest ścieżką w grafie, a więc jest nie krótsza niż najkrótsza ścieżka . Widzimy więc, że w tym przypadku żaden z testów w linijce 6 algorytmu nie będzie spełniony i algorytm zwróci TRUE.
Załóżmy teraz, że w grafie istnieje cykl o ujemnej wadze osiągalny z . Oznaczmy ten cykl jako , gdzie . Dla cyklu tego mamy:
(1)
Gdyby w tej sytuacji algorytm Bellmana-forda zwrócił wartość TRUE to dla każdej krawędzi musiałaby zachodzić nierówność . Sumując tą nierówność stronami po wszystkich otrzymujemy.
ponieważ to
Wiemy, że cykl jest osiągalny a zatem dla każdego mamy . Możemy więc skrócić po obydwu stronach równania i otrzymujemy:

-->