Zaawansowane algorytmy i struktury danych/Wykład 5
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 .
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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{O(|V||E|)}} , 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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{O(|V||E|)}} ,
- końcowa pętla algorytmu linie 5-7 działa w czasie .
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
do w grafie . Niech będzie wierzchołkiem osiągalnym ze źródła i niech oznacza najkrótszą ścieżkę z do , gdzie oraz . Ścieżka ta jest ścieżką prostą, bo najkrótsze ścieżki muszą być proste, więc . Pokażemy teraz indukcyjnie, że poczynając od -tego przebiegu zachodzi dla . W algorytmie wykonujemy obrotów pętli oraz , co oznacza, że z tej tezy indukcyjnej wynika poprawność algorytmu.
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 RELAKS,
ż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
grafem skierowanym i niech funkcja zadaje wagi krawędzi. Załóżmy, że algorytm Bellmana-Forda został wykonany dla wierzchołka . Jeżeli graf nie zawiera cyklu o ujemnej wadze osiągalnego ze źródła to algorytm zwraca wartość TRUE, jest odległością z do , a wyznacza drzewo najkrótszych ścieżek o korzeniu w . Jeżeli natomiast zawiera cykl o ujemnej wadze osiągalny ze
źródła to algorytm zwraca wartość FALSE.
Dowód
wadze, które byłyby osiągalne z . Wtedy z Lematu 1 wiemy, że są poprawnie policzonymi odległościami. Jeżeli odległości zostały poprawnie policzone przez funkcję RELAKS to koduje najkrótsze ścieżki w grafie. Wynika to z właściwości funkcji RELAKS relaks, która wyliczając odległość wyznaczą jednocześnie przez jaki wierzchołek prowadzi ta najkrótsza ścieżka.
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 Parser nie mógł rozpoznać (nieznana funkcja „\rightdquidarrow”): {\displaystyle s \rightdquidarrow v}
.
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:
co stoi w sprzeczności z nierównością (1). Jeżeli więc w grafie
