Sunteți pe pagina 1din 19

Modulul 4.

Distanţe şi drumuri minime

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

Fie reţeaua orientată G = (N, A, b) cu n noduri şi m arce. Funcţia valoare


b: A→R asociază fiecărui arc a∈A un număr real b(a) numit valoarea acestuia,
care poate reprezenta lungime, cost etc.
Vom nota cu Dxy un drum în digraful G de la nodul x la nodul y şi cu Dxy
mulţimea acestor drumuri.

Valoarea unui drum Dxy, notată b(Dxy), este b(Dxy) = ∑ b(a ) .


a∈Dxy

Un drum Dxy cu valoarea b( Dxy ) = min{b(Dxy) | Dxy∈Dxy} se numeşte drum


* *

* *
de valoare minimă sau drum minim. Valoarea b( Dxy ) a drumului minim Dxy se

numeşte distanţă de la nodul x la nodul y şi se notează d(x, y).

Prin convenţie, dacă Dxy= Ø atunci d(x, y) = ∞.


Problemele de drum minim au sens doar în reţelele orientate care nu conţin
circuite de valoare negativă, deoarece existenţa unui astfel de circuit implică
existenţa drumurilor cu valoare arbitrar de mică. Deci, în continuare vom
considera reţeaua orientată G = (N, A, b) fără circuite de valoare negativă.
Principalele probleme de drum minim care apar în aplicaţii practice sau ca

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.

PDM1 se poate rezolva utilizând un algoritm de rezolvare a PDM2 la care se


adaugă un test suplimentar de oprire, de aceea în continuare se vor prezenta
algoritmi de rezolvare pentru PDM2 şi PDM3. Aceşti algoritmi se bazează pe
ecuaţiile lui Bellman.
Fie reţeaua orientată G = (N, A, b) fără circuite de valoare negativă. Pentru
reprezentarea reţelei G se va folosi matricea valoare-adiacenţă B=(bij)i,j∈N, unde

b(i, j ), daca i ≠ j , (i, j ) ∈ A




bij = 0, daca i = j

∞, daca⌣ i ≠ j , (i, j ) ∉ A

Distanţele trebuie să satisfacă ecuaţiile lui Bellman:

d ( s , s ) = 0
 pentru s∈N.
 d ( s , y ) = min{d ( s , x ) + b xy | x ≠ y}, y ≠ s

M4.U1.2. Obiectivele unităţii de învăţare


Această unitate de învăţare îşi propune ca obiectiv principal însuşirea de
către studenţi a noţiunilor de distănţă şi drum minim.
La sfârşitul acestei unităţi de învăţare studenţii vor fi capabili să:
 Determine drumurile minime de la un nod sursă dat către toate celelalte noduri
ale unei reţele;

95
 Determine drumurile minime între oricare două noduri ale unei reţele.

Durata medie de parcurgere a primei unităţi de învăţare este de 3 ore.

M4.U1.3. Algoritmul Dijkstra

Fie reţeaua orientată G = (N, A, b) cu b: A →R⁺. Algoritmul Dijkstra rezolvă PDM2 în


ipoteza că reţeaua nu conţine arce de valoare negativă.

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.

Teoremă Algoritmul Dijkstra are complexitatea O(n²).

96
Implementarea algoritmului Dijkstra cu heap-uri Fibonacci are complexitatea O(m + n
log n).

Drumul minim de la nodul sursă s la un nod oarecare y se determină, folosind vectorul


predecesor p, cu aceeaşi procedură ca la parcurgeri:

procedura drum(s, y, p);


begin
if y = s then se tipăreşte s;
else if p(y) = 0 then se tipăreşte "nu există drum de la " + s + " la " + y;
else
begin
drum(s, p(y), p);
se tipăreşte y;
end;
end;

Algoritmul Dijkstra poate să conducă la rezultate eronate dacă reţeaua G = (N, A, b)


conţine şi arce cu valoare negativă, chiar dacă nu conţine circuite cu valoare negativă.

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.

Exemplu Aplicăm algoritmul Dijkstra pentru a determina distanţele şi


drumurile minime de la nodul 1 la celelalte noduri în reţeaua din figura 4.1.

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ă.

La sfârşitul algoritmului Dijkstra am obţinut vectorul distanţelor d = (0, 2,


3, 8, 6) şi vectorul predecesor p = (0, 1, 2, 5, 2) cu ajutorul căruia determinăm
arborescenţa parţială din figura 4.2. Drumul unic din arborescenţă de la nodul 1
la orice alt nod este un drum minim în reţeaua din figura 4.1.

Fig. 4.2

Exemplu Aplicăm algoritmul Dijkstra pentru a determina distanţele şi


drumurile minime de la nodul 1 la celelalte noduri în reţeaua din figura 4.3.

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ă.

La sfârşitul execuţiei algoritmului Dijkstra am obţinut vectorul distanţelor


d = (0, 3, 2, 11, 6, 7) şi vectorul predecesor p = (0, 3, 1, 2, 2, 5) cu ajutorul căruia
determinăm arborescenţa parţială din figura 4.4. Drumul unic de la nodul 1 la
orice alt nod din arborescenţa din figura 4.4 este un drum minim în reţeaua din
figura 4.3.

Fig. 4.4

M4.U1.4. Algoritmul Bellman-Ford

Fie reţeaua orientată G = (N, A, b) fără circuite de valoare negativă, cu b: A →R.


Algoritmul Bellman-Ford rezolvă PDM2.

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.

Teoremă Algoritmul Bellman-Ford are complexitatea O(nm).

Observaţie Algoritmul Bellman-Ford poate fi modificat astfel încât să poată fi folosit la


testarea existenţei unui circuit de valoare negativă în modul următor: Dacă ciclul repeat until
se execută de mai mult de n ori atunci reţeaua conţine un circuit de valoare negativă, în caz
contrar reţeaua nu conţine circuite de valoare negativă.

Exemplu Aplicăm algoritmul Bellman-Ford pentru a determina distanţele


şi drumurile minime de la nodul 1 la celelalte noduri în reţeaua din figura 4.5.

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

Exemplu Aplicăm algoritmul Bellman-Ford pentru a determina distanţele


şi drumurile minime de la nodul 1 la celelalte noduri în reţeaua din figura 4.7.

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ă.

La sfârşitul execuţiei algoritmului Bellman-Ford am obţinut vectorul


distanţelor d = (0, 3, 2, 11, 6, 7) şi vectorul predecesor p = (0, 3, 1, 2, 2, 5).
Folosind vectorul p, determinăm arborescenţa parţială din figura 4.8 în care
drumul unic de la nodul 1 la orice alt nod este un drum minim în reţeaua din
figura 4.7.

Fig. 4.8

M4.U1.5.Algoritmul Floyd-Warshall

Fie reţeaua orientată G = (N, A, b) fără circuite de valoare negativă, cu b: A →R.


Algoritmul Floyd-Warshall rezolvă PDM3.
Considerăm că reţeaua este reprezentată prin matricea valoare-adiacenţă B=(bij)i,j∈N,
unde

b(i, j ), daca i ≠ j , (i, j ) ∈ A




bij = 0, daca i = j

∞, daca⌣ i ≠ j , (i, j ) ∉ A

Algoritmul Floyd-Warshall determină matricea distanţelor D=(dij)i,j∈N şi matricea


predecesor P=(pij)i,j∈N.

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.

Teoremă Algoritmul Floyd-Warshall are complexitatea O(n3).

*
Un drum minim Dxy de la nodul x la nodul y se determină cu ajutorul matricii

predecesor, cu următoarea procedură:

procedura drum(x, y, p);


begin
if y = x then se tipăreşte x;
else if pxy = 0 then se tipăreşte "nu există drum de la " + x + " la " + y;
else
begin
drum(x, pxy, p);
se tipăreşte y;
end;
end;

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

După iniţializări obţinem:

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 

Matricea D obţinută la sfârşitul algoritmului conţine distanţele, iar cu


ajutorul matricii P putem determina drumurile minime între oricare două noduri.
De exemplu, distanţa de la nodul 2 la nodul 3 este d23= 3, iar drumul minim D*23
= (2, 1, 3).

Exemplu Folosind algoritmul Floyd-Warshall, determinăm distanţele şi


drumurile minime între oricare două noduri din reţeaua din figura 4.10.

Fig. 4.10

După iniţializări obţinem:

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

Matricea D obţinută la sfârşitul algoritmului conţine distanţele, iar cu


ajutorul matricii P putem determina drumurile minime între oricare două noduri.
De exemplu, distanţa de la nodul 3 la nodul 4 este d34= -2, iar drumul minim D*34
= (3, 5, 2, 4). Avem d53 = ∞, deci nu există niciun drum de la nodul 5 la nodul 3.

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ă.

De asemenea, am arătat cum se poate modifica algoritmul Dijkstra, pentru a


determina doar distanţa şi drumul minim de la un nod sursă dat la un nod
destinaţie dat într-o reţea cu acele având valori pozitive.

M4.U1.8. Test de evaluare a cunoştinţelor

1. Folosind algoritmii Dijkstra şi Bellman-Ford determinaţi distanţele


şi drumurile minime de la nodul 1 la celelalte noduri în reţeaua de
mai jos:

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

1. Folosind algoritmul Dijkstra determinaţi distanţele şi drumurile


minime de la nodul 1 la celelalte noduri în reţeaua de mai jos:

2. Folosind algoritmul Bellman-Ford determinaţi distanţele şi


drumurile minime de la nodul 1 la celelalte noduri în reţeaua de mai
jos:

3. Folosind algoritmul Floyd-Warshall, determinaţi distanţele şi

110
drumurile minime între oricare 2 noduri în reţeaua de mai sus.

111

S-ar putea să vă placă și