Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Introducere .................................................................................................................... 93
Obiectivele modului ...................................................................................................... 93
U1. Distanţe şi drumuri minime ................................................................................... 94
Introducere
În acest modul ne vom ocupa de două dintre problemele de drum minim: de
problema drumului minim de la un nod sursă dat către toate celelalte noduri şi de
problema drumurilor minime între oricare două noduri. Ambele apar foarte des în
practică.
Competenţe
La sfârşitul acestui modul studenţii vor fi capabili să:
Determine drumurile minime de la un nod sursă dat către toate celelalte noduri
ale unei reţele;
Determine drumurile minime între oricare două noduri ale unei reţele.
93
Unitatea de învăţare M4.U1. Distanţe şi drumuri minime
Cuprins
M4.U1.1. Introducere .................................................................................................... 94
M4.U1.2. Obiectivele unităţii de învăţare ..................................................................... 95
M4.U1.3. Algoritmul Dijkstra ...................................................................................... 96
M4.U1.4. Algoritmul Bellman-Ford ............................................................................. 99
M4.U1.5. Algoritmul Floyd-Warshall ........................................................................ 104
M4.U1.6. Rezumat ...................................................................................................... 109
M4.U1.7. Test de evaluare a cunoştinţelor ................................................................. 109
M4.U1.1. Introducere
* *
de valoare minimă sau drum minim. Valoarea b( Dxy ) a drumului minim Dxy se
94
subprobleme în rezolvarea altor probleme de optimizare în reţele sunt următoarele:
*
(PDM1) Determinarea unui drum minim Dst de la un nod precizat s la un alt
*
nod precizat t şi a valorii b( Dst ).
*
(PDM2) Determinarea unui drum minim Dsy de la un nod precizat s la
*
nodul y şi a valorii b( Dsy ), pentru toate nodurile y∈N.
*
(PDM3) Determinarea unui drum minim Dxy de la nodul x la nodul y şi a
*
valorii b( Dxy ), pentru toate nodurile x, y∈N.
d ( s , s ) = 0
pentru s∈N.
d ( s , y ) = min{d ( s , x ) + b xy | x ≠ y}, y ≠ s
95
Determine drumurile minime între oricare două noduri ale unei reţele.
algoritm Dijkstra;
begin
W = N; d(s) = 0; p(s) = 0;
for y∈N - {s} do
begin
d(y) = ∞; p(y) = 0;
end;
while W ≠ Ø do
begin
se selectează un nod x∈W astfel încât d(x) este minimă;
W = W - {x};
for y∈W ∩ V+(x) do
if d(x) + b(x, y) < d(y) then
begin
d(y) = d(x) + b(x, y); p(y) = x;
end;
end;
end.
96
Implementarea algoritmului Dijkstra cu heap-uri Fibonacci are complexitatea O(m + n
log n).
Pentru a rezolva PDM1 într-o reţea cu arce cu lungimi nenegative, se poate modifica
algoritmul lui Dijkstra astfel încât să se termine în momentul în care t∈W.
Fig. 4.1
97
După iniţializări avem: W = {1, 2, 3, 4, 5}, d = (0, ∞, ∞, ∞, ∞), p = (0, 0, 0,
0, 0).
Iteraţia 1: Se selectează x = 1. Se efectuează W = {2, 3, 4, 5}, d = (0, 2, 4,
∞, ∞), p = (0, 1, 1, 0, 0).
Iteraţia 2: x = 2, W = {3, 4, 5}, d = (0, 2, 3, 10, 6), p = (0, 1, 2, 2, 2).
Iteraţia 3: x = 3, W = {4, 5}, d şi p nu se modifică.
Iteraţia 4: x = 5, W = {4}, d = (0, 2, 3, 8, 6), p = (0, 1, 2, 5, 2).
Iteraţia 5: x = 4, W = Ø şi algoritmul se termină.
Fig. 4.2
Fig. 4.3
98
După iniţializări avem: W = {1, 2, 3, 4, 5, 6}, d = (0, ∞, ∞, ∞, ∞, ∞), p = (0,
0, 0, 0, 0, 0).
Iteraţia 1: x = 1, W = {2, 3, 4, 5, 6}, d = (0, 6, 2, ∞, ∞, ∞), p = (0, 1, 1, 0, 0,
0).
Iteraţia 2: x = 3, W = {2, 4, 5, 6}, d = (0, 3, 2, ∞, 9, ∞), p = (0, 3, 1, 0, 3, 0).
Iteraţia 3: x = 2, W = {4, 5, 6}, d = (0, 3, 2, 11, 6, ∞), p = (0, 3, 1, 2, 2, 0).
Iteraţia 4: x = 5, W = {4, 6}, d = (0, 3, 2, 11, 6, 7), p = (0, 3, 1, 2, 2, 5).
Iteraţia 5: x = 6, W = {4}, d şi p nu se modifică.
Iteraţia 6: x = 4, W = Ø şi algoritmul se termină.
Fig. 4.4
algoritm Bellman-Ford;
begin
d(s) = 0; p(s) = 0;
for y∈N - {s} do
begin
d(y) = ∞; p(y) = 0;
99
end;
repeat
for y∈N do
d′(y) = d(y);
for y∈N do
−
if V (y) ≠ Ø then
begin
−
se selectează x∈ V (y) astfel încât d′(x) + b(x, y) este minimă;
if d′(x) + b(x, y)< d′(y) then
begin
d(y) = d′(x) + b(x, y); p(y) = x;
end;
end;
until d′(y) = d(y) pentru toate nodurile y∈N;
end.
Fig. 4.5
100
− − − − −
Avem: V (1) = Ø, V (2) = {1}, V (3) = {1, 2}, V (4) = {2, 3}, V (5)
= {2, 3, 4}.
După iniţializări obţinem: d = (0, ∞, ∞, ∞, ∞), p = (0, 0, 0, 0, 0).
Iteraţia 1: d′ = (0, ∞, ∞, ∞, ∞)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 1, d(2) = 2, p(2) = 1
y = 3, x = 1, d(3) = 4, p(3) = 1
y = 4, x = 2, d(4) şi p(4) nu se modifică
y = 5, x = 2, d(5) şi p(5) nu se modifică
Am obţinut d = (0, 2, 4, ∞, ∞) şi p = (0, 1, 1, 0, 0).
Iteraţia 2: d′ = (0, 2, 4, ∞, ∞)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 1, d(2) şi p(2) nu se modifică
y = 3, x = 2, d(3) = 3, p(3) = 2
y = 4, x = 2, d(4) = -1, p(4) = 2
y = 5, x = 2, d(5) = 3, p(5) = 2
Am obţinut d = (0, 2, 3, -1, 3) şi p = (0, 1, 2, 2, 2).
Iteraţia 3: d′ = (0, 2, 3, -1, 3)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 1, d(2) şi p(2) nu se modifică
y = 3, x = 2, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) şi p(4) nu se modifică
y = 5, x = 3, d(5) = 2, p(5) = 3
Am obţinut d = (0, 2, 3, -1, 2) şi p = (0, 1, 2, 2, 3).
Iteraţia 4: d′ = (0, 2, 3, -1, 2)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 1, d(2) şi p(2) nu se modifică
y = 3, x = 2, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) şi p(4) nu se modifică
y = 5, x = 3, d(5) şi p(5) nu se modifică
Am obţinut d′ = d şi algoritmul se termină.
101
La sfârşitul execuţiei algoritmului Bellman-Ford am obţinut vectorul
distanţelor d = (0, 2, 3, -1, 2) şi vectorul predecesor p = (0, 1, 2, 2, 3) cu ajutorul
căruia determinăm arborescenţa parţială din figura 4.6. Drumul unic de la nodul 1
la orice alt nod în arborescenţa din figura 4.6 este un drum minim în reţeaua din
figura 4.5.
Fig. 4.6
Fig. 4.7
− − − − −
Avem: V (1) = Ø, V (2) = {1, 3}, V (3) = {1, 4}, V (4) = {2}, V (5)
−
= {2, 3, 4}, V (6) = {4, 5}.
După iniţializări obţinem: d = (0, ∞, ∞, ∞, ∞, ∞), p = (0, 0, 0, 0, 0, 0).
Iteraţia 1: d′ = (0, ∞, ∞, ∞, ∞, ∞)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 1, d(2) = 4, p(2) = 1
y = 3, x = 1, d(3) = 2, p(3) = 1
102
y = 4, x = 2, d(4) şi p(4) nu se modifică
y = 5, x = 2, d(5) şi p(5) nu se modifică
y = 6, x = 4, d(6) şi p(6) nu se modifică
Am obţinut d = (0, 4, 2, ∞, ∞, ∞) şi p = (0, 1, 1, 0, 0, 0).
Iteraţia 2: d′ = (0, 4, 2, ∞, ∞, ∞)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 3, d(2) = 3, p(2) = 3
y = 3, x = 1, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) = 12, p(4) = 2
y = 5, x = 2, d(5) = 7, p(5) = 2
y = 6, x = 4, d(6) şi p(6) nu se modifică
Am obţinut d = (0, 3, 2, 12, 7, ∞) şi p = (0, 3, 1, 2, 2, 0).
Iteraţia 3: d′ = (0, 3, 2, 12, 7, ∞)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 3, d(2) şi p(2) nu se modifică
y = 3, x = 1, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) = 11, p(4) = 2
y = 5, x = 2, d(5) = 6, p(5) = 2
y = 6, x = 5, d(6) = 8, p(6) =5
Am obţinut d = (0, 3, 2, 11, 6, 8) şi p = (0, 3, 1, 2, 2, 5).
Iteraţia 4: d′ = (0, 3, 2, 11, 6, 8)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 3, d(2) şi p(2) nu se modifică
y = 3, x = 1, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) şi p(4) nu se modifică
y = 5, x = 2, d(5) şi p(5) nu se modifică
y = 6, x = 5, d(6) = 7, p(6) =5
Am obţinut d = (0, 3, 2, 11, 6, 7) şi p = (0, 3, 1, 2, 2, 5).
Iteraţia 5: d′ = (0, 3, 2, 11, 6, 7)
−
y = 1, V (1) = Ø, d(1) şi p(1) nu se modifică
y = 2, x = 3, d(2) şi p(2) nu se modifică
y = 3, x = 1, d(3) şi p(3) nu se modifică
y = 4, x = 2, d(4) şi p(4) nu se modifică
103
y = 5, x = 2, d(5) şi p(5) nu se modifică
y = 6, x = 5, d(6) şi p(6) nu se modifică
Am obţinut d′ = d şi algoritmul se termină.
Fig. 4.8
M4.U1.5.Algoritmul Floyd-Warshall
algoritm Floyd-Warshall;
begin
104
for i = 1 to n do
for j = 1 to n do
begin
dij = bij;
if i ≠ j şi dij < ∞ then pij = i;
else pij = 0;
end;
for k = 1 to n do
for i = 1 to n do
for j = 1 to n do
if dik + dkj < dij then
begin
dij = dik + dkj;
pij = pkj;
end;
end.
*
Un drum minim Dxy de la nodul x la nodul y se determină cu ajutorul matricii
105
Exemplu Folosind algoritmul Floyd-Warshall, determinăm distanţele şi
drumurile minime între oricare două noduri din reţeaua din figura 4.9.
Fig. 4.9
0 ∞ 2 3 0 0 1 1
1 0 4 3 2 0 2 2
D= P=
∞ −1 0 − 2 0 3 0 3
∞ 5 ∞ 0 0 4 0 0
Iteraţia 1: k = 1
0 ∞ 2 3 0 0 1 1
1 0 3 3 2 0 1 2
D= P=
∞ −1 0 − 2 0 3 0 3
∞ 5 ∞ 0 0 4 0 0
Iteraţia 2: k = 2
0 ∞ 2 3 0 0 1 1
1 0 3 3 2 0 1 2
D = P=
0 −1 0 − 2 2 3 0 3
6 5 8 0 2 4 1 0
Iteraţia 3: k = 3
106
0 1 2 0 0 3 1 3
1 0 3 1 2 0 1 3
D = P=
0 −1 0 − 2 2 3 0 3
6 5 8 0 2 4 1 0
Iteraţia 4: k = 4
0 1 2 0 0 3 1 3
1 0 3 1 2 0 1 3
D = P=
0 −1 0 − 2 2 3 0 3
6 5 8 0 2 4 1 0
Fig. 4.10
107
0 2 4 ∞ ∞ 0 1 1 0 0
∞ 0 ∞ − 3 1 0 0 0 2 2
D = 1 5 0 3 − 1
P = 3 3 0 3 3
∞ ∞ ∞ 0 2 0 0 0 0 4
∞ 2 ∞ ∞ 0 0 0
5 0 0
Iteraţia 1: k = 1
0 2 4 ∞ ∞ 0 1 1 0 0
∞ 0 ∞ − 3 1 0 0 0 2 2
D = 1 3 0 3 − 1 P = 3 1 0 3 3
∞ ∞ ∞ 0 2 0 0 0 0 4
∞ 2 ∞ ∞ 0 0 0
5 0 0
Iteraţia 2: k = 2
0 2 4 −1 3 0 1 1 2 2
∞ 0 ∞ − 3 1 0 0 0 2 2
D = 1 3 0 0 − 1 P = 3 1 0 2 3
∞ ∞ ∞ 0 2 0 0 0 0 4
∞ 2 ∞ −1 0 0 0
5 0 2
Iteraţia 3: k = 3
D şi P nu se modifică.
Iteraţia 4: k = 4
0 2 4 −1 1 0 1 1 2 4
∞ 0 ∞ − 3 − 1 0 0 0 2 4
D = 1 3 0 0 − 1 P = 3 1 0 2 3
∞ ∞ ∞ 0 2 0 0 0 0 4
∞ 2 ∞ −1 0 0 0
5 0 2
Iteraţia 5: k = 5
108
0 2 4 −1 1 0 1 1 2 4
∞ 0 ∞ − 3 − 1 0 0 0 2 4
D=1 1 0 − 2 − 1 P = 3 5 0 2 3
∞ 4 ∞ 0 2 0 5 0 0 4
∞ 2 ∞ − 1 0 0 0
5 0 2
M4.U1.7. Rezumat
În acestă unitate de învăţare am prezentat 3 algoritmi de drum minim:
1. Algoritmul Dijkstra, care determină distanţele şi drumurile minime de
la un nod sursă dat la toate celelalte noduri într-o reţea cu acele având
valori pozitive,
2. Algoritmul Bellman-Ford, care determină distanţele şi drumurile
minime de la un nod sursă dat la toate celelalte noduri într-o reţea cu
valori oarecare ale arcelor, dar fără circuite de valoare negativă,
3. Algoritmul Floyd-Warshall, care determină distanţele şi drumurile
minime între oricare două noduri într-o reţea cu valori oarecare ale
arcelor, dar fără circuite de valoare negativă.
109
2. Folosind algoritmul Floyd-Warshall, determinaţi distanţele şi
drumurile minime între oricare 2 noduri în reţeaua de mai sus.
Temă de control
110
drumurile minime între oricare 2 noduri în reţeaua de mai sus.
111