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