Zaawansowane algorytmy i struktury danych/Wykład 5: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Sank (dyskusja | edycje)
Nie podano opisu zmian
Sank (dyskusja | edycje)
Nie podano opisu zmian
Linia 24: Linia 24:
wierzchołków wraz z ich wagami.
wierzchołków wraz z ich wagami.


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Relaksacja ===
=== Relaksacja ===  
 
<div class="mw-collapsible-content" style="display:none">
Podobnie ja to było w [[algorytm_dijkstry|Algorytmie Dijkstry]]
Podobnie ja to było w [[algorytm_dijkstry|Algorytmie Dijkstry]]
użyjemy metody relaksacji. Metoda ta polega na tym, że w trakcie
użyjemy metody relaksacji. Metoda ta polega na tym, że w trakcie
Linia 53: Linia 52:
górnymi na odległości.
górnymi na odległości.


relaksacja|Relaksacja]] krawędzi <math>(u,v)</math> polega na
[[relaksacja|Relaksacja]] krawędzi <math>(u,v)</math> polega na
sprawdzeniu, czy przechodząc krawędzią <math>(u,v)</math> z
sprawdzeniu, czy przechodząc krawędzią <math>(u,v)</math> z
<math>u</math> do <math>v</math>, nie otrzymamy krótszej ścieżki z
<math>u</math> do <math>v</math>, nie otrzymamy krótszej ścieżki z
Linia 67: Linia 66:
     \pi(v) = u
     \pi(v) = u
}}
}}
</div>
 
</div>
=== Algorytm ===
 
Po przypomnieniu czym była relaksacja gotowi jesteśmy na zapisanie algorytm
Bellmana-Forda, a następnie udowodnienie jego poprawności.

Wersja z 20:57, 19 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 O(|V||E|). 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.


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 G=(V,E) i funkcję wagową w:E. Algorytm Bellmana-Forda wylicza dla zadanego wierzchołka s, czy istnieje w grafie G cykl o ujemnej wadze osiągalny z s. Jeżeli taki cykl nie istniej to algorytm oblicza najkrótsze ścieżki z s 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 vV utrzymujemy wartość d(v) będącą górnym ograniczeniem wagi najkrótszej ścieżki ze s do v. W algorytmie utrzymywać będziemy także dla każdego wierzchołka v wskaźnik π(v) 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 Inicjalizacja algorytmu najkrótszych ścieżek


 INICJALIZUJ(G,s)
 for każdy wierzchołek vV do
   d(v)=
   π(v)=NIL
 d(s)=0


Ustalone przez tą procedure wartości d(v) są dobrymi ograniczeniami górnymi na odległości.

Relaksacja krawędzi (u,v) polega na sprawdzeniu, czy przechodząc krawędzią (u,v) z u do v, nie otrzymamy krótszej ścieżki z s do vniż ta dotychczas znaleziona. Jeżeli tak to aktualizowane są także wartości d(v) i π(v). W celu relaksacji krawędzi (u,v) używamy procedury RELAKSUJ.

Algorytm Relaksacja krawędzi


 {{{3}}}

Algorytm

Po przypomnieniu czym była relaksacja gotowi jesteśmy na zapisanie algorytm Bellmana-Forda, a następnie udowodnienie jego poprawności.