Algorytmy i Struktury Danych.

advertisement
Algorytmy i Struktury Danych.
Grafy
dr hab. Bożena Woźna-Szcześniak
[email protected]
Jan Długosz University, Poland
Wykład 9
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
1 / 53
Plan wykładu
Ścieżka Eulera
Cykle Eulera
Algorytm Bellmana-Forda
Algorytm Dijkstry
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
2 / 53
Ścieżka Eulera
Ścieżka Eulera w grafie (skierowanym), to ścieżka (droga) prosta,
która zawiera każda˛ krawedź
˛ grafu dokładnie jeden raz.
Warunkiem istnienia ścieżki sa:
˛
1
2
3
spójność grafu.
dla grafu skierowanego należy sprawdzić, czy dla każdego
wierzchołka, za wyjatkiem
˛
dwóch, stopień wyjściowy jest równy
stopniu wejściowemu.
dla grafu nieskierowanego z każdego wierzchołka, za wyjatkiem
˛
dwóch, musi wychodzić parzysta liczba krawedzi.
˛
Graf, który posiada ścieżk˛e Eulera nazywamy grafem
półeulerowskim
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
3 / 53
Ścieżka Eulera - przykład
Graf bez ścieżki Eulera:
Graf ze ścieżka˛ Eulera:
Ścieżka: 1-> ABCDE -> 3
Bożena Woźna-Szcześniak (AJD)
Nie spełniony warunek 3 istnienia
ścieżki Eulera
Algorytmy i Struktury Danych.
Wykład 9
4 / 53
Cykl Eulera
Cykl Eulera to taki cykl w grafie, który zawiera każda˛ krawedź
˛
grafu dokładnie jeden raz.
Warunkiem istnienia cyklu sa:
˛
spójność grafu.
dla grafu skierowanego należy sprawdzić, czy dla każdego
wierzchołka stopień wyjściowy jest równy stopniu wejściowemu.
dla grafu nieskierowanego z każdego wierzchołka musi wychodzić
parzysta liczba krawedzi.
˛
Graf, który posiada cykl Eulera nazywamy grafem eulerowskim
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
5 / 53
Ścieżka Eulera - przykład
Graf bez cyklu Eulera:
Graf z cyklem Eulera:
Cykl 1:
Cykl 2:
Cykl 3:
Cykl 4:
1-> ABCDEF -> 1
1-> ABEDCF -> 1
1-> FCDEBA -> 1
1-> FEDCBA -> 1
Nie spełniony warunek 3 istnienia
cyklu Eulera
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
6 / 53
Zagadki
Sprawdź, w którym z poniższych grafów istnieje cykl lub droga
Eulera. Jeśli w grafie istnieje cykl lub droga Eulera, to można ja˛
narysować nie odrywajac
˛ ołówka od papieru.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
7 / 53
Twierdzenie Eulera, 1736
Twierdzenie
Spójny graf G (nieskierowany) ma cykl Eulera wtedy i tylko wtedy, gdy
stopień każdego wierzchołka w G jest parzysty.
Leonhard Euler (1707 – 1783)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
8 / 53
Most
Mostem nazywamy taka˛ krawedź
˛ grafu, której usuniecie
˛
zwieksza
˛
liczbe˛ spójnych składowych tego grafu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
9 / 53
Wyznaczanie cyklu Eulera
Do wyznaczania syklu Eulera słuzy algorytm Fleury’ego
Algorytm działa zarówno dla grafów skierowanych jak i
nieskierowanych.
Algorytm jest rekurencyjny
Algorytm zakłada, że graf jest eulerowski.
Algorytm Fleury’ego opiera sie˛ na prostej zasadzie: aby znaleźć
cykl Eulera lub ścieżk˛e Eulera, mosty sa˛ ostatnimi krawedziemi,
˛
które nalezy przejść.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
10 / 53
Algorytm Fleury’ego
Warunek wstepny:
˛
Wejściowy graf jest grafem eulerowskim, czyli:
jest spójny
w przypadku poszukiwania ścież Eulera - posiada co najwyżej dwa
wierzchołki o nieparzystym stopniu
w przypadku poszukiwania cyklu Eulera - wszytkie wierzchołki musza˛
mieć parzysty stopień
Warunek startowy:
W przypadku cyklu: wybierz dowolny wierzchołek
W przypadku ścieżki: wybierz jeden z wierzchołków nieparzystych
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
11 / 53
Algorytm Fleury’ego
Kroki pośrednie: Na każdym kroku, jeśli jest wybór, nie wybieraj
mostu wystepujacego
˛
w cz˛eści grafu, która nie została jeszcze
odwiedzona. Jednakże, jeśli jest tylko jeden wybór, to weź go.
Warunek Końcowy: Kiedy nie można przechodzić już dalej, cykl
(ścieżka) jest kompletna. [W przypadku cyklu, wracamy do
wierzchołka wyjściowego; w przypadku ścieżki dochodzimy do
drugiego wierzchołka o nieparzystym stopniu.]
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
12 / 53
Algorytm Fleury’ego
Graf eulerowski:
Bożena Woźna-Szcześniak (AJD)
Wybieramy wierzchołek F jak
startowy
Algorytmy i Struktury Danych.
Wykład 9
13 / 53
Algorytm Fleury’ego
Idziemy z F do C
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
14 / 53
Algorytm Fleury’ego
Idziemy z C do D
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
15 / 53
Algorytm Fleury’ego
Idziemy z D do A. (Można również iść z D do B, ale nie można z D do
F, bo DF jest mostem)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
16 / 53
Algorytm Fleury’ego
Idziemy z A do C. (Można również iść z A do E, ale nie można z A do
B, bo AB jest mostem)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
17 / 53
Algorytm Fleury’ego
Idziemy z C do E. Nie ma wyboru.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
18 / 53
Algorytm Fleury’ego
Idziemy z E do A. Nie ma wyboru.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
19 / 53
Algorytm Fleury’ego
Idziemy z A do B, potem z B do D i na koniec z D do F. Jednoznaczna
ściezka.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
20 / 53
Algorytm Fleury’ego
Kolejne kroki algorytmu - podsumowanie.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
21 / 53
Algorytm Fleury’ego
Dany jest graf półeulerowski. Znaleźć ścieżk˛e Eulera.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
22 / 53
Algorytm Fleury’ego
Możemy wystartować z wierzchołka J lub wierzcholka E.
Startujemy z wierzchołka J.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
23 / 53
Algorytm Fleury’ego
Z wierzchołka J mamy 5 możliwych dróg. Wszystkie sa OK.
Wybieramy droge˛ do wierzchołka K
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
24 / 53
Algorytm Fleury’ego
Z wierzchołka K mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy
droge˛ do wierzchołka B.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
25 / 53
Algorytm Fleury’ego
Z wierzchołka B mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy
droge˛ do wierzchołka C.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
26 / 53
Algorytm Fleury’ego
Z wierzchołka C mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy
droge˛ do wierzchołka L.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
27 / 53
Algorytm Fleury’ego
Z wierzchołka L mamy 3 możliwe drogi. Wszystkie sa OK. Wybieramy
droge˛ do wierzchołka K.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
28 / 53
Algorytm Fleury’ego
Z wierzchołka K mamy tylko 1 droge,
˛ droge˛ do wierzchołka H.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
29 / 53
Algorytm Fleury’ego
Z wierzchołka H mamy 3 możliwe drogi: do G, I oraz J. Nie możemy
wybrać drogi z H do G, bo jest mostem. Pozostałe dwie sa˛ Ok.
Wybieramy droge˛ do wierzchołka J.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
30 / 53
Algorytm Fleury’ego
Z wierzchołka J mamy 3 możliwe drogi: do A, B oraz I. Nie możemy
wybrać drogi z J do I, bo jest mostem. Pozostałe dwie sa˛ Ok.
Wybieramy droge˛ do wierzchołka B.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
31 / 53
Algorytm Fleury’ego
Z wierzchołka B do wierzcholka G prowadzi jednoznaczna droga
poprzez wierzcholki A, J, I oraz H.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
32 / 53
Algorytm Fleury’ego
Z wierzchołka G do wierzcholka E prowadzi wiele dróg. Oto jedna z
nich: z G do F, potem do E, potem do D, potem do C, potem do E,
potem do G, potem do L i na końcu do E.
INNA DROGE˛ PROSZE˛ odnaleźć jako ćwiczenie !!!
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
33 / 53
Cykl Eulera - Zastosowania
Rysowanie/wycinanie figur przy pomocy plotera
Problem chińskiego listonosza – W roku 1962 chiński matematyk
Mei-Ko Kwan sformułował nastepuj
˛ acy
˛ problem:
Listonosz roznoszac
˛ listy musi przejść przez wszystkie
ulice w swojej dzielnicy co najmniej jeden raz i wrócić na
poczte.
˛ Ponieważ jest człowiekiem leniwym, chciałby
mieć jak najkrótsza˛ do przejścia trase.
˛ Znalezienie takiej
trasy jest problemem, który nazwano problemem
chińskiego listonosza (ang. Chinese postman problem CPP).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
34 / 53
Etykietowany graf skierowany
Definicja
Etykietowanym grafem skierowanym nazywamy strukture˛
G = (V , E, w : E → Z ) gdzie
V to zbiór wierzchołków,
E ⊆ {(u, v ) : u, v ∈ V } to zbiór uporzadkowanych
˛
par
wierzchołków ze zbioru V , zwanych krawedziami.
˛
w : E → Z jest funkcja˛ wagi; wagi reprezentuja˛ pewne wielkości
(np. długość drogi).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
35 / 53
Etykietowany graf skierowany - przykład
u
3
Pytanie: Czy
najkrótsza ścieżka
pomiedzy
˛
wierzchołkami u i v
może zawierać cykl?
2
2
1
1
3
-3
1
1
v
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
36 / 53
Etykietowany graf skierowany - przykład
u
3
Pytanie: Czy
najkrótsza ścieżka
pomiedzy
˛
wierzchołkami u i v
może zawierać cykl?
2
2
1
1
3
-3
1
1
v
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Odpowiedź: Jeśli w
graf istnieje najkrótsza
ścieżka z u do v , to w
grafie tym również
istnieje najkrótsza
ścieżka z u do v , która
nie zawiera cykli.
Wykład 9
36 / 53
Drzewo najkrótszych ścieżek
Sformułowanie problemu
Wejście:
Etykietowany graf skierowany G = (V , E, w : E → Z )
Wierzchołek r ∈ V .
Wyjście:
Drzewo T o korzeniu r takie, że ścieżka z r do każdego
wierzchołka u w T jest najkrótsza˛ sieżka˛ z r do u w grafie G.
Założenie: Rozważane grafy maja˛ wierzchołki osiagalne
˛
z
wybranego wierzchołka (korzenia) r a .
a
Dlaczego? Wierzchołki nieosiagalne
˛
moga˛ być usuniete
˛ w czasie
liniowym
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
37 / 53
Czy najkrótsza ścieżka zawsze istnieje ?
Raczej nie ...
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
38 / 53
Drzewo najkrótszych ścieżek
Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy,
gdy G nie zawiera ujemnych cykli.
Dla każdego wierzchołka u grafu G istnieje najkrótsza ścieżka z
korzenia r do wierzchołka u, która nie zawiera cykli.
Suma wszystkich najkrótszych ścieżek jest drzewem najkrótszych
ścieżek grafu G ukorzenionego w wierzchołku r .
1
Przez odległość od wierzchołka r do wierzchołka u w grafie G rozumiemy długość
najkrótszej ścieżki w grafie G prowadzacej
˛ z r do u.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
39 / 53
Drzewo najkrótszych ścieżek
Graf G posiada drzewo najkrótszych ścieżek wtedy i tylko wtedy,
gdy G nie zawiera ujemnych cykli.
Dla każdego wierzchołka u grafu G istnieje najkrótsza ścieżka z
korzenia r do wierzchołka u, która nie zawiera cykli.
Suma wszystkich najkrótszych ścieżek jest drzewem najkrótszych
ścieżek grafu G ukorzenionego w wierzchołku r .
Problem znalezienia drzewa najkrótszych ścieżek jest
równoważny problemowi znalezienia odległości każdego z
wierzchołków u grafu G od korzenia r 1 .
1
Przez odległość od wierzchołka r do wierzchołka u w grafie G rozumiemy długość
najkrótszej ścieżki w grafie G prowadzacej
˛ z r do u.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
39 / 53
Richard Ernest Bellman - (26.08.1920-19.03.1984)
Twórca programowania
dynamicznego (Dynamic
Programming 1957)
W 1979 roku otrzymał IEEE
Medal of Honor za ”wkład w
teorie sterowania i procesów
decyzyjnych, szczególnie za
stworzenie i zastosowanie
programowania
dynamicznego”.
1975 - Członek amerykańskiej
Źródło: http://logistyka.math.
akademii Nauki i Sztuki.
Wiecej
˛
na http://en.
wikipedia.org/wiki/
Richard_E._Bellman
Bożena Woźna-Szcześniak (AJD)
uni.lodz.pl/Bellman.jpeg
Algorytmy i Struktury Danych.
Wykład 9
40 / 53
Lester Randolph Ford, junior (ur. 23.09.1927)
Syn matematyka Lester R.
Forda, seniora
Amerykański matematyk
specjalizujacy
˛ sie˛ w
algorytmach przepływu w sieci
Autor algorytmu
Bellmana-Forda do
znajdowania najkrótszej
ścieżki w grafach, które
posiadaja˛ krawedzie
˛
z
ujemnymi wagami.
Bożena Woźna-Szcześniak (AJD)
Źródło:http:
//arodrigu.webs.upv.es/
Algorytmy i Struktury Danych.
Wykład 9
41 / 53
Algorytm Forda-Bellmana
Algorytm służy do wyznaczania najmniejszej odległości od
ustalonego wierzchołka s do wszystkich pozostałych w grafie
skierowanym bez cykli o ujemnej długości.
Warunek nieujemności cyklu jest spowodowany faktem, że w
grafie o ujemnych cyklach najmniejsza odległość miedzy
˛
niektórymi wierzchołkami jest nieokreślona, ponieważ zależy od
liczby przejść w cyklu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
42 / 53
Algorytm Forda-Bellman
Dany jest graf G = (V , E, w → N) i macierz A, która dla każdej
pary wierzchołków u i v zawiera wage˛ krawedzi
˛
(u, v ) (ozn.
w((u, v ))). Jeśli krawedź
˛ (u, v ) nie istnieje, to przyjmujemy, że jej
waga wynosi nieskończoność i wpisujemy ∗.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
43 / 53
Algorytm Forda-Bellman
Dany jest graf G = (V , E, w → N) i macierz A, która dla każdej
pary wierzchołków u i v zawiera wage˛ krawedzi
˛
(u, v ) (ozn.
w((u, v ))). Jeśli krawedź
˛ (u, v ) nie istnieje, to przyjmujemy, że jej
waga wynosi nieskończoność i wpisujemy ∗.
Algorytm Forda-Bellmana w każdym kroku oblicza górne
oszacowanie odległości od wierzchołka r do wszystkich
pozostałych wierzchołków v (ozn. d(v )).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
43 / 53
Algorytm Forda-Bellman
Dany jest graf G = (V , E, w → N) i macierz A, która dla każdej
pary wierzchołków u i v zawiera wage˛ krawedzi
˛
(u, v ) (ozn.
w((u, v ))). Jeśli krawedź
˛ (u, v ) nie istnieje, to przyjmujemy, że jej
waga wynosi nieskończoność i wpisujemy ∗.
Algorytm Forda-Bellmana w każdym kroku oblicza górne
oszacowanie odległości od wierzchołka r do wszystkich
pozostałych wierzchołków v (ozn. d(v )).
W pierwszym kroku przyjmujemy d(v ) = w((r , v )).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
43 / 53
Algorytm Forda-Bellman
Dany jest graf G = (V , E, w → N) i macierz A, która dla każdej
pary wierzchołków u i v zawiera wage˛ krawedzi
˛
(u, v ) (ozn.
w((u, v ))). Jeśli krawedź
˛ (u, v ) nie istnieje, to przyjmujemy, że jej
waga wynosi nieskończoność i wpisujemy ∗.
Algorytm Forda-Bellmana w każdym kroku oblicza górne
oszacowanie odległości od wierzchołka r do wszystkich
pozostałych wierzchołków v (ozn. d(v )).
W pierwszym kroku przyjmujemy d(v ) = w((r , v )).
Gdy stwierdzimy, że d(v ) > d(u) + w((u, v )), to każdorazowo
polepszamy aktualne oszacowanie i podstawiamy
d(v ) := d(u) + w((u, v )).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
43 / 53
Algorytm Forda-Bellman
Dany jest graf G = (V , E, w → N) i macierz A, która dla każdej
pary wierzchołków u i v zawiera wage˛ krawedzi
˛
(u, v ) (ozn.
w((u, v ))). Jeśli krawedź
˛ (u, v ) nie istnieje, to przyjmujemy, że jej
waga wynosi nieskończoność i wpisujemy ∗.
Algorytm Forda-Bellmana w każdym kroku oblicza górne
oszacowanie odległości od wierzchołka r do wszystkich
pozostałych wierzchołków v (ozn. d(v )).
W pierwszym kroku przyjmujemy d(v ) = w((r , v )).
Gdy stwierdzimy, że d(v ) > d(u) + w((u, v )), to każdorazowo
polepszamy aktualne oszacowanie i podstawiamy
d(v ) := d(u) + w((u, v )).
Algorytm kończy sie,
˛ gdy żadnego oszacowania nie można już
poprawić. Wówczas macierz d(v ) zawiera najkrótsze odległości
od wierzchołka r do wszystkich pozostałych.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
43 / 53
Algorytm Forda-Bellman
Require: Macierz A dla grafu G = (V , E, w : E → N), wierzchołek r
1: for each v ∈ V do
2:
d(v ) = w((r , v ));
3: end for
4: for k := 1 to |V | − 2 do
5:
for each v ∈ V \ {r } do
6:
for each u ∈ V do
7:
d(v ) := min{d(v ), d(u) + w((u, v ))}
8:
end for
9:
end for
10: end for
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
44 / 53
Algorytm Forda-Bellman - przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
6
*
*
*
2
*
0
k
0
1
2
3
d(1)
0
0
0
0
d(2)
2
2
2
2
d(3)
4
4
4
4
d(4)
*
2a
2
2
d(5)
*
6b
5d
5
d(6)
*
4c
4
4
k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
45 / 53
Algorytm Forda-Bellman - przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
6
*
*
*
2
*
0
k
0
1
2
3
d(1)
0
0
0
0
d(2)
2
2
2
2
d(3)
4
4
4
4
d(4)
*
2a
2
2
d(5)
*
6b
5d
5
d(6)
*
4c
4
4
k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi.
˛
a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź
˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1
do 3 wynosi 4) a nastepnie
˛
do 4 (waga krawedzi
˛
[3, 4] = −2), długość drogi od 1 do 4 wynosi wiec
˛ 4 − 2 = 2.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
45 / 53
Algorytm Forda-Bellman - przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
6
*
*
*
2
*
0
k
0
1
2
3
d(1)
0
0
0
0
d(2)
2
2
2
2
d(3)
4
4
4
4
d(4)
*
2a
2
2
d(5)
*
6b
5d
5
d(6)
*
4c
4
4
k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi.
˛
a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź
˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1
do 3 wynosi 4) a nastepnie
˛
do 4 (waga krawedzi
˛
[3, 4] = −2), długość drogi od 1 do 4 wynosi wiec
˛ 4 − 2 = 2.
b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ o najmniejszej długości:
d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = ∗ + 1. Wybieramy opcje˛ z wierzchołkiem
nr. 2.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
45 / 53
Algorytm Forda-Bellman - przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
6
*
*
*
2
*
0
k
0
1
2
3
d(1)
0
0
0
0
d(2)
2
2
2
2
d(3)
4
4
4
4
d(4)
*
2a
2
2
d(5)
*
6b
5d
5
d(6)
*
4c
4
4
k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi.
˛
a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź
˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1
do 3 wynosi 4) a nastepnie
˛
do 4 (waga krawedzi
˛
[3, 4] = −2), długość drogi od 1 do 4 wynosi wiec
˛ 4 − 2 = 2.
b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ o najmniejszej długości:
d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = ∗ + 1. Wybieramy opcje˛ z wierzchołkiem
nr. 2.
c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest wiec
˛ nastepuj
˛ aca:
˛
1, 3, 4, 6 a jej
długość wynosi d(4) + w(4, 6) = 2 + 2 = 4.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
45 / 53
Algorytm Forda-Bellman - przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
6
*
*
*
2
*
0
k
0
1
2
3
d(1)
0
0
0
0
d(2)
2
2
2
2
d(3)
4
4
4
4
d(4)
*
2a
2
2
d(5)
*
6b
5d
5
d(6)
*
4c
4
4
k=0 d(v ) = w((1, v )). Przepisujemy pierwszy wiersz macierzy wag krawedzi.
˛
a. W kroku k = 0, d(4) = ∗, gdyż nie istnieje krawedź
˛ (1,4). Możemy jednak przejść przez wierzchołek 3 (odległość od 1
do 3 wynosi 4) a nastepnie
˛
do 4 (waga krawedzi
˛
[3, 4] = −2), długość drogi od 1 do 4 wynosi wiec
˛ 4 − 2 = 2.
b. Do wierzchołka 5 możemy dojść przez 2, 3, lub 6. Wybieramy droge˛ o najmniejszej długości:
d(2) + w(2, 5) = 2 + 4 = 6, d(3) + w(3, 5) = 4 + 3 = 7, d(6) + w(6, 5) = ∗ + 1. Wybieramy opcje˛ z wierzchołkiem
nr. 2.
c. Do wierzchołka 6 możemy dojść przez 4 (do którego dochodzimy przez 3) droga jest wiec
˛ nastepuj
˛ aca:
˛
1, 3, 4, 6 a jej
długość wynosi d(4) + w(4, 6) = 2 + 2 = 4.
d. Z punktu (b.) wynika, że do wierzchołka 5 możemy dojść także poprzez wierzchołek 6. W poprzednim kroku poznaliśmy
odległość do wierzchołka 6 i nie wynosi ona już nieskończoność. Zatem długość drogi do wierzchołka 5 poprzez 6:
d(6)+w(6,5)=4+1=5. Jest to wartość mniejsza niż aktualna (6), wiec
˛ znaleźliśmy krótsza˛ droge.
˛
k=3 Nic sie˛ nie zmieniło od kroku k=2. Kończymy obliczenia i mamy wektor najkrótszych dróg od wierzchołka r = 1 do
wszystkich pozostałych.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
45 / 53
Algorytm Dijkstry
Algorytm Dijkstry służy do wyznaczania najmniejszej odległości
od ustalonego wierzchołka r do wszystkich pozostałych w grafie
skierowanym.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
46 / 53
Algorytm Dijkstry
Algorytm Dijkstry służy do wyznaczania najmniejszej odległości
od ustalonego wierzchołka r do wszystkich pozostałych w grafie
skierowanym.
W odróżnieniu jednak od Algorytmu Forda-Bellmana, graf
wejściowy nie może zawierać krawedzi
˛
o ujemnych wagach.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
46 / 53
Algorytm Dijkstry
Algorytm Dijkstry służy do wyznaczania najmniejszej odległości
od ustalonego wierzchołka r do wszystkich pozostałych w grafie
skierowanym.
W odróżnieniu jednak od Algorytmu Forda-Bellmana, graf
wejściowy nie może zawierać krawedzi
˛
o ujemnych wagach.
W algorytmie tym pamietany
˛
jest zbiór Q wierzchołków, dla
których nie obliczono jeszcze najkrótszych ścieżek, oraz wektor
d[v ] odległości od wierzchołka r do v . Poczatkowo
˛
zbiór Q
zawiera wszystkie wierzchołki, a wektor d jest pierwszym
wierszem macierzy zawierajacym
˛
wagi krawedzi.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
46 / 53
Algorytm Dijkstry - pseudokod
Dopóki zbiór Q nie jest pusty wykonuj:
Pobierz ze zbioru Q wierzchołek v o najmniejszej wartości d[v ] i
usuń go ze zbioru.
Dla każdego nastepnika
˛
i wierzchołka v sprawdź czy
d[i] > d[v ] + w((v , i)), tzn. czy aktualne oszacowanie odległości do
wierzchołka i jest wieksze
˛
od oszacowania odległości do
wierzchołka v plus waga krawedzi
˛
(v , i).
Jak widać z powyższego pseudokodu algorytm wybiera z kolejki Q
“najlżejszy” wierzchołek, tzn. jest oparty o strategie˛ zachłanna.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
47 / 53
Algorytm Dijkstry - przykład
a
b
c
d
e
a
0
*
*
7
*
b
10
0
*
*
3
c
*
1
0
6
9
d
*
*
4
0
2
e
5
2
*
*
*
Q
{b,c,d,e}
{b,c,d}
{b,c}
{c}
{}
d(a)
0
0
0
0
0
d(b)
10
8
8
8
8
d(c)
*
14
13
9
9
d(d)
*
7
7
7
7
d(e)
5
5
5
5
5
Najlżejszy wierzchołek jest podkreślony. Wierzchołki, dla których
wyznaczono już najkrótsze ścieżki sa˛ pogrubione
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
48 / 53
Wyznaczanie najkrótszej drogi w grafie dla znanej
odległości
Algorytm służy do wyznaczania w grafie ciagu
˛ wierzchołków
us , us+1 . . . ut tworzacych
˛
droge˛ miedzy
˛
wierzchołkami us i ut o
długości d(us , ut ) i jest on najcz˛eściej używany razem z
algorytmem Forda-Bellmana lub Dijkstry.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
49 / 53
Wyznaczanie najkrótszej drogi w grafie dla znanej
odległości
Algorytm służy do wyznaczania w grafie ciagu
˛ wierzchołków
us , us+1 . . . ut tworzacych
˛
droge˛ miedzy
˛
wierzchołkami us i ut o
długości d(us , ut ) i jest on najcz˛eściej używany razem z
algorytmem Forda-Bellmana lub Dijkstry.
Po wyznaczeniu najkrótszej odległości d(us , ut ) miedzy
˛
para˛
wierzchołków w grafie, można skonstruować droge˛ miedzy
˛
tymi
wierzchołkami taka,
˛ że suma wag jej krawedzi
˛
jest równa
d(us , ut ), tzn. możemy wyznaczyć droge˛ miedzy
˛
wierzchołkami us
i ut o najkrótszej długości.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
49 / 53
Wyznaczanie najkrótszej drogi w grafie dla znanej
odległości
Algorytm służy do wyznaczania w grafie ciagu
˛ wierzchołków
us , us+1 . . . ut tworzacych
˛
droge˛ miedzy
˛
wierzchołkami us i ut o
długości d(us , ut ) i jest on najcz˛eściej używany razem z
algorytmem Forda-Bellmana lub Dijkstry.
Po wyznaczeniu najkrótszej odległości d(us , ut ) miedzy
˛
para˛
wierzchołków w grafie, można skonstruować droge˛ miedzy
˛
tymi
wierzchołkami taka,
˛ że suma wag jej krawedzi
˛
jest równa
d(us , ut ), tzn. możemy wyznaczyć droge˛ miedzy
˛
wierzchołkami us
i ut o najkrótszej długości.
Załóżmy wiec,
˛ że dla danego grafu opisanego za pomoca˛
macierzy wag krawedzi
˛
wywołaliśmy algorytm wyznaczania
najkrótszej odległości od ustalonego wierzchołka (us ) do
wszystkich pozostałych i w jego wyniku otrzymaliśmy wektor
odległości D.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
49 / 53
Wyznaczanie najkrótszej drogi w grafie dla znanej
odległości
Z wektora D odczytujemy najmniejsza˛ odległość miedzy
˛
wierzchołkami us i ut : D[ut ] = d(us , ut ).
Po wykonaniu poniższego algorytmu na stosie otrzymamy ciag
˛
wierzchołków us , . . . , ut bed
˛ acych
˛
droga˛ miedzy
˛
wierzchołkiem us
i ut o długości d(us , ut ).
Algorytm
Require: Stos S, wierzchołki poczatkowy
˛
us i końcowy ut
1: push(S, ut );
2: v := ut ;
3: while v ! = us do
4:
znajdź wierzchołek u taki, że D(v ) = D(u) + w((u, v ));
5:
push(S, u);
6:
v := u;
7: end while
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
50 / 53
Przykład
1
2
3
4
5
6
1
0
*
*
1
*
*
2
2
0
*
*
*
2
3
4
*
0
*
*
*
4
*
*
-2
0
*
*
5
*
4
3
*
0
1
Bożena Woźna-Szcześniak (AJD)
6
*
*
*
2
*
0
Jak widać z macierzy wag graf ten ma
krawedzie
˛
o ujemnych wagach, musimy wiec
˛
zastosować algorytm Forda-Bellmana. W
wyniku jego działania otrzymamy wektor d
postaci:
D[1] = 0, D[2] = 2, D[3] = 4, D[4] = 2,
D[5] = 5, D[6] = 4.
Załóżmy że wierzchołkiem, wzgledem
˛
którego
wyznaczać bedziemy
˛
najkrótsza˛ droge˛ jest
wierzchołek o indeksie 1. Dlatego też
D[1] = 0. Musimy też wybrać wierzchołek
końcowy – niech bedzie
˛
to wierzchołek nr. 5.
Z wektora D odczytujemy najmniejsza˛
odległość miedzy
˛
wierzchołkami 1 i 5, tj.
D[5] = d(1, 5) = 5. Wyznaczamy droge˛
łacz
˛ ac
˛ a˛ wierzchołek 1 i 5 o długości równej 5.
Algorytmy i Struktury Danych.
Wykład 9
51 / 53
Przykład, cd.
Po wykonaniu pierwszej linii algorytmu otrzymamy anstepuj
˛ ace
˛
parametry: Stos = {5}, v = 5, D[v ] = 5, u =?,
D[u] + w((u, v )) =?.
Poszukujemy teraz wierzchołka u. Sprawdzamy wartości
D[u] + w((u, v )) tylko dla tych wierzchołków u, które sa˛
poprzednikami wierzchołka v . W naszym przypadku
poprzednikami wierzchołka 5 sa˛ wierzchołki 2, 3 i 6. Sprawdzamy
wiec:
˛ D[2] + w((2, 5)) = 2 + 4 = 6! = D[5],
D[3] + w((3, 5)) = 4 + 3 = 7! = D[5], oraz
D[6] + w((6, 5)) = 4 + 1 = 5 = D[5].
Znaleźliśmy wierzchołek u = 6, wykonujemy zatem instrukcje 5 i 6
algorytmu: Stos = {5, 6}, v = 6, D[v ] = 4, u =?,
D[u] + w((u, v )) =?.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
52 / 53
Przykład, cd.
Tym razem nie mamy zbyt dużego wyboru, gdyż jedynym
poprzednikiem wierzchołka nr. 6 jest 4. A wiec
˛
D[4] + w((4, 6)) = 2 + 2 = 4 = d[6], zatem m = 4. Dalej algorytm
przebiega podobnie:
Stos = {5, 6, 4}, v = 4, D[v ] = 2, u = 3,
D[u] + w((u, v )) = 4 + (−2) = 4.
Stos = {5, 6, 4, 3}, v = 3, D[v ] = 4, u = 1,
D[u] + w((u, v )) = 0 + 4 = 4.
Tu algorytm sie˛ kończy, gdyż w nastepnej
˛
iteracji v = 1. A zatem
droga miedzy
˛
wierzchołkiem 1 i 5 o długości 5 jest nastepuj
˛ aca:
˛
(1, 3, 4, 6, 5).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 9
53 / 53
Download