Algorytm Dijkstry
Transkrypt
Algorytm Dijkstry
ZAGADNIENIE NAJKRÓTSZEJ DROGI RozwaŜamy sieć odzwierciedlającą mapę drogi, która zawiera węzły oraz bezpośrednie połączenie pomiędzy niektórymi parami węzłów. W matematyce podobne pojęcie nazywamy grafem. RozwaŜamy graf postaci G=(V,E), gdzie V – zbiór węzłów grafu, E – zbiór krawędzi (połączeń) między niektórymi parami węzłów z V. Rozpatrujemy przypadek, gdy połączenia węzłów są skierowane (określony jest początek i koniec połączenia). Mówimy wtedy o grafach skierowanych. Niech V={v1,...,vm}. Dla dowolnego połączenia (łuku) postaci (vi,vj) mamy ustaloną liczbę dij, którą nazywamy długością łuku. Długość w konkretnych zagadnieniach moŜe mieć inny sens niŜ odległość fizyczna (koszty przejazdu, wydatki na paliwo, itp.). W sposób naturalny na grafie moŜna zdefiniować: droga = ciąg wierzchołków postaci (v1,v2), (v2,v3), ... , (vk,vn). W takim ciągu koniec poprzedniego łuku jest początkiem następnego. MoŜna obliczyć jej długość jako sumę długości naleŜących do niej łuków d12+d23+...+dkn. Zagadnienie najkrótszej drogi polega na wyborze drogi, która na najmniejszą długość. Na duŜym grafie zawierającym kilkadziesiąt węzłów nie ma sensu rozwiązywać tego zagadnienia za pomocą przeglądu wszystkich dróg. Do rozwiązania tego problemu istnieje kilka algorytmów, np. algorytm Dijkstry. Dla danego grafu skierowanego będziemy budować najkrótszą drogę między węzłami v1,vm. Istota metody polega na ocechowaniu węzłów poczynając od v1. Od niego poruszamy się w kierunku łuków. Zatem ocechowane mogą być tylko węzły osiągalne drogami od v1. Tworzymy W ⊆ V, gdzie W zawiera węzły, dla których wartości cech nie będą się zmieniały w kolejnych krokach algorytmu. Początkowo W={v1}. Symbolem ui oznaczamy długość najkrótszej drogi od v1 do vi przechodzącej tylko przez węzły naleŜące do W. Wartości ui będą cechami węzłów. Na początku u1=0. Obliczamy ui=d1i dla i=2,...,m, przy czym, jeŜeli między węzłem v1 a vi nie istnieje bezpośredni łuk – przyjmujemy d1i=+ ∞ . W kaŜdym kroku wyznaczamy węzeł vr∈ V\W (jeszcze nie naleŜący do W) o najmniejszej cesze ur i dołączamy go do zbioru W. Dla kaŜdego innego węzła vi∈ V\W porównujemy wartości ui oraz ur+dri. JeŜeli ui > ur+dri to zamiast starej cechy ui wpisujemy nową ur+dri to znaczy ui:= ur+dri W taki sposób, krok po kroku, dodajemy do W nowe węzły i obliczamy nowe wartości cech nie naleŜących do W. Z chwilą kiedy W=V algorytm kończy działanie. Teraz pozostaje na podstawie tablicy obliczeniowej wyciągnąć wnioski. Wartość um (cechy węzła vm) daje bezpośrednią długość najkrótszej drogi od v1 do vm . Do rekonstrukcji budowy najkrótszej drogi korzystamy z tablicy poczynając od końca. Jeśli po raz pierwszy otrzymaliśmy um na kroku odpowiadającym r = r1 to oznacza to, Ŝe łuk (vr1,vm) naleŜy do tej drogi. Analizujemy dalej, kiedy po raz pierwszy otrzymaliśmy wartość ur1 . Niech to będzie w kroku r=r2. Oznacza to, Ŝe łuk (vr2,vr1) będzie naleŜał do najkrótszej ścieŜki. Dalej analizę powtarzamy, dopóki nie otrzymamy przejścia do u1. 1 Dla sieci czynności wyznaczyć ścieŜkę (ścieŜki) najkrótszą, np. przy pomocy algorytmu Dijkstry; P1 12 P4 7 24 18 P0 P3 12 4 7 P6 14 28 30 P2 P5 12 KROK 1 KROK 2 W={Po} W={Po,P2} W={PoP2P3} W={PoP2P3P4} W={PoP2P3P4P5} W={PoP2P3P4P5P6} r=2 U0=0 U1=24 U2=7 U3=12 U4=∞ U5=19 U6=∞ r=3 U0=0 U1=24 U2=7 U3=12 U4=19 U5=19 U6=∞ r=4 U0=0 U1=24 U2=7 U3=12 U4=19 U5=19 U6=23 U1 U3 U4 U5 U6 U1 U4 U5 U6 U1 u4+d41 U5 u4+d45 U6 u4+d46 r=0 U0=0 U1=24 U2=7 U3=12 U4=∞ U5=∞ U6=∞ u2+d21 u2+d23 u2+d24 u2+d25 u2+d26 KROK 3 u3+d31 u3+d34 u3+d35 u3+d36 KROK 4 KROK 5 KROK 5 r=5 r=6 U0=0 U1=24 U2=7 U3=12 U4=19 U5=19 U6=23 U0=0 U1=24 U2=7 U3=12 U4=19 U5=19 U6=23 U1 u5+d51 U6 u5+d56 U1 u6+d65 6 W=V Stop r=4 to (P4,P6) r=3 to (P3,P4) r=0 to (P0,P3) 2