Sunteți pe pagina 1din 62

Drumuri de cost minim

Drumuri de cost minim


Sumar
Drumuri punct – multipunct
◦ Algoritmul lui Dijkstra
◦ Algoritmul Bellman-Ford

Drumuri multipunct – multipunct


◦ Algoritmul Floyd-Warshall
Aplicații practice
❑ Rutare în cadrul unei rețele (telefonice, de calculatoare etc.)
❑ Găsirea drumului minim dintre două locații (Google Maps, GPS etc.)
❑ Stabilirea unei agende de zbor în vederea asigurării unor conexiuni optime
❑ Asignarea unui peer / server de fișiere în funcție de metricile definite pe fiecare linie de
comunicație
Drumuri de cost minim
Fie un graf G=(V,E) și o funcție w:E→W numită funcție de cost care asociază fiecărei muchii (u,v)
o valoare numerică, unde u,v ϵ V sunt noduri ale grafului G, iar (u,v) ϵ E muchie a grafului G între
nodurile u și v.
Se numește costul unui drum suma tuturor muchiilor care formează drumul dintre două noduri
ale unui graf.

1 2 Exemplu: Costul drumului de la nodul 1 la nodul 5


3 2 w(1,5)=w(1,2)+w(2,4)+w(4,5)=2+4+3=9
w(1,5)=w(1,6)+w(6,5)=3+1=4
6 5 3 w(1,5)=w(1,2)+w(2,3)+w(3,4)+w(4,5)=2+3+2+3=10
4
1
3
5
3 4 2
Drumuri de cost minim
Fie un graf G=(V,E) și o funcție w:E→W numită funcție de cost care asociază fiecărei muchii (u,v)
o valoare numerică, unde u,v ϵ V sunt noduri ale grafului G, iar (u,v) ϵ E muchie a grafului G între
nodurile u și v.
Se numește costul unui drum suma tuturor muchiilor care formează drumul dintre două noduri
ale unui graf.

1 2 Exemplu: Costul drumului de la nodul 1 la nodul 5


3 2 w(1,5)=w(1,2)+w(2,4)+w(4,5)=2+4+3=9
w(1,5)=w(1,6)+w(6,5)=3+1=4
6 5 3 w(1,5)=w(1,2)+w(2,3)+w(3,4)+w(4,5)=2+3+2+3=10
4
1 Drumul de cost minim dintre nodurile 1 și 5 este minimul dintre
3
5 cele 3 drumuri posibile, adică cel care trece prin nodul 6.
3 4 2
Drumuri de cost minim
Relaxarea unei muchii constă în a evalua dacă costul ei (drumul de la capetele muchiei) poate fi
redus trecând printr-un nod intermediar. Fie u și v două noduri ale unui graf și w(u,v) costul
muchiei (u,v). Dacă există un nod intermediar y pentru care w(u,y) + w(y,v) < w(u,v) atunci
muchia (drumul) directă (u,v) este înlocuit cu drumul (succesiunea de muchii) (u,y)->(y,u).

1 2 Exemplu: Costul drumului de la nodul 1 la nodul 5


3 2 Drumul w(1,5) = 6 poate fi relaxat prin nodul intermediar 6,
drumul relaxat fiind w(1,6)+2(5,6)=4.
6 6 5 3
4
1
3
5
3 4 2
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Algoritmul lui Dijkstra lucrează doar pentru costuri pozitive ale muchiilor (arcelor) grafului,, astfel că se
introduce restricția w(u,v)>0.
•Algoritmul lui Dijkstra este de tip Greedy, optimul local căutat este reprezentat de costul drumului dintre
nodul sursa s si un nod v și pentru fiecare nod se va reține un cost estimat d[v], inițializat la începutul
algorimului cu costul muchiei de la nodul sursă s sau cu +∞ dacă nu există muchie (arc) de la nodul sursă s.

Init(G,s) // nodul sursă


FOR u IN V DO // V – lista nodurilor din G
IF w(s,u) ≠ ∞ THEN
d[u] ← w(s,u)
ELSE d[u] ← +∞
ENDIF
ENDFOR
d[s] ← 0
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: Fie nodul sursă nodul 1. După inițializare vectorul costurilor estimate de la nodul sursă
la toate celelalte noduri se actualizează cu valorile muchiilor directe sau cu +∞ dacă nu există
muchie directă.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 +∞ +∞ +∞ 3
3
6 5 3
4
Aceste costuri estimate sunt îmbunătățite la fiecare pas, pe
7
3 ∞ baza celorlate costuri estimate. Astfel, se selectează, nodul
5 care are, la momentul respectiv, costul minim estimat (față de
3 4 2 nodul sursă). Pe baza procedurii de relaxare, se încearcă să se

∞ relaxeze restul costurilor d[V].
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: Pentru a ține evidența muchiilor care trebuie relaxate, se folosesc două structuri: S
(mulțimea de vârfuri deja vizitate) și Q (coadă de priorități în care nodurile se află ordonate după
distanța față de sursă) din care se extrage mereu nodul aflat la distanța minimă.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 +∞ +∞ +∞ 3
3 S 1
6 5 3
4 Q 2 6
7
3 ∞
5
3 4 2


Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La primul pas se selectează nodul 2 care are d[2]=2. Pe baza lui se modifică drumurile
spre nodul 3 și nodul 4 către care există drumuri directe din nodul 2, astfel:

0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 +∞ 3
3 S 1 2
6 5 3
4 Q 6 3 4
7
3 5
5
3 4 2

6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 6 care are d[6]=3. Pe baza lui se modifică drumul
spre nodul 5 către care există drum direct din nodul 6, astfel:

0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 10 3
3 S 1 2 6
6 5 3
4 Q 3 4 5
7
3 5
5
3 4 2
10
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 3 care are d[3]=5. Pe baza lui se verifică dacă
drumul spre nodul 4 poate fi relaxat, astfel d[3]+w(3,4)=7>d[4]=6, deci nu se modifică nimic, se
marchează nodul 3 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 10 3
3 S 1 2 6 3
6 5 3
4 Q 4 5
7
3 5
5
3 4 2
10
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 4 care are d[4]=6. Pe baza lui se verifică dacă
drumul spre nodul 5 poate fi relaxat, astfel d[4]+w(4,5)=9<d[5]=10, deci se modifică drumul
estimat pentru nodul 5 și se marchează nodul 4 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 9 3
3 S 1 2 6 3 4
6 5 3
4 Q 5
7
3 5
5
3 4 2
9
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 5 care are d[5]=9. Pe baza lui se verifică dacă
drumul spre nodul 2 poate fi relaxat, astfel d[5]+w(5,2)=14>d[2]=2, deci nu se modifică drumul
estimat pentru nodul 2 și se marchează nodul 5 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 9 3
3 S 1 2 6 3 4 5
6 5 3
4 Q
7 • Algoritmul se încheie pentru că în coada Q nu se mai găsește nici un
3 5 nod nevizitat.
5
4 2 • Pentru a putea determina și muchiile din care este alcătuit drumul
9 3
minim pentru fiecare nod, este necesar să reținem un vector de
6 părinți P, pentru nodurile care au muchie directă cu nodul sursă,
P[nod] se inițializează cu sursa, iar pentru restul cu 0.
Drumuri punct – multipunct
Algoritmul lui Dijkstra
DIJKSTRA(sursa, dest) // relaxari succesive // gasirea drumului efectiv
selectat(sursa) = true UNTIL Q nu e vida Initializeaza Drum = {}
FOREACH nod in V u = extrage_min (Q) nod = P[dest]
// V = multimea nodurilor selectat(u) = true UNTIL nod != null
IF exista muchie[sursa, nod] THEN FOREACH nod in vecini[u] // (*) insereaza nod la inceputul lui Drum
// initializam distanta pana la nodul respectiv /* daca drumul de la sursa la nod prin u este mai mic decat cel curent */ nod = P[nod]
d[nod] = w[sursa, nod] introdu nod in Q IF not selectat(nod) AND d[nod] > d[u] + w[u, nod] THEN
// parintele nodului devine sursa // actualizeaza distanta si parinte
P[nod] = sursa d[nod] = d[u] + w[u, nod]
ELSE d[nod] = +∞ // distanta infinita P[nod] = u
P[nod] = null // nu are parinte /* actualizeaza pozitia nodului in coada prioritara */
ENDIF actualizeaza (Q,nod)
ENDFOR ENDIF
ENDFOR
Drumuri punct – multipunct
Algoritmul Bellman-Ford
•Algoritmul Bellman Ford poate fi folosit si pentru grafuri ce conțin muchii de cost negative.
•Nu poate fi folosit pentru grafuri ce conțin cicluri de cost negativ.
•Algoritmul folosește același mecanism de relaxare ca si Dijkstra, dar, spre deosebire de acesta,
nu optimizează o soluție folosind un criteriu de optim local, ci parcurge fiecare muchie de un
număr de ori egal cu numărul de noduri si încearcă sa o relaxeze de fiecare data, pentru a
îmbunătăți distanta până la nodul destinație al muchiei curente.
•Motivul pentru care se face acest lucru este ca drumul minim dintre sursa si orice nod destinație
poate sa treacă prin maximum |V| noduri
•Relaxarea tuturor muchiilor de |V|- 1 ori este suficienta pentru a propaga până la toate nodurile
informația despre distanta minima de la sursa.
•Daca, la sfârșitul acestor relaxări, mai poate fi îmbunătățită o distanță, atunci graful are un ciclu
de cost negativ si problema nu are soluție.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
• Numărul de noduri: 6
2 -1 • Numărul de iterații de relaxare : 5
6 5 • Muchii în graf: (1,2), (1,3), (1,4), (2,5), (3,5), (4,3), (4,6), (5,6), (3,2)
-2 3
Pasul 1: Inițializarea. Se alege nodul sursă, pentru care avem d[s]=0,
1 4 3
iar pentru celelalte noduri se inițializează cu ∞.
3
5 -2 6

4 -1
Drumuri punct – multipunct
Algoritmul Bellman-Ford

• Numărul de noduri: 6
2 -1 ∞ • Numărul de iterații de relaxare: 5
6 5 • Muchii în graf: (1,2), (1,3), (1,4), (2,5), (3,5), (4,3), (4,6), (5,6), (3,2)
-2 3
Pasul 1: Inițializarea. Se alege nodul sursă, pentru care avem d[s]=0,
0 1 4 3
iar pentru celelalte noduri se inițializează cu ∞. Se alege nodul
3 sursă nodul 1.

5 -2 6
∞ Pasul 2. Prima iterație, se verifică pentru fiecare muchie dacă
4 -1 aceasta poate fi relaxată cu ajutorul regulii de relaxare:

if( d[u] + w(u,v) < d[v] )
d[v] = d[u] + w(u,v)
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (1,2) avem:
d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
2 -1 ∞ astfel avem d[2]=6.
6 5
-2 3
0 1 4 3
3

5 -2 6

4 -1

Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (1,2) avem:
d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
2 -1 ∞ astfel avem d[2]=6.
6 5
-2 3
0 1 4 3
3

5 -2 6

4 -1

Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4
5 -2 6

4 -1

Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4
5 -2 6

4 -1

Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,

astfel avem d[4]=5.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,

astfel avem d[4]=5.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞5 d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,

astfel avem d[4]=5.
4 -1
Pentru muchia (2,5) avem:
∞ 5 d[2]+w(2,5) = 6-1 = 5 < ∞ = d[5], deci muchia (2,5) poate fi relaxată,
astfel avem d[5]=5.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞5 d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,

astfel avem d[4]=5.
4 -1
Pentru muchia (2,5) avem:
∞ 5 d[2]+w(2,5) = 6-1 = 5 < ∞ = d[5], deci muchia (2,5) poate fi relaxată,
astfel avem d[5]=5.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 4 3
3
∞43
5 -2 6

4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 4 3
3
∞43
5 -2 6

4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.

Prima iterație a fost încheiată.


Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞5
6 5
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3
∞43
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 < 5 = d[5], deci muchia (2,5) poate fi relaxată,
5 -2 6 astfel avem d[5]=0.
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 < 5 = d[5], deci muchia (2,5) poate fi relaxată,
5 -2 6 astfel avem d[5]=0.
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 < 5 = d[5], deci muchia (2,5) poate fi relaxată,
5 -2 6 astfel avem d[5]=0.
∞ 4
Pentru muchia (3,5) avem:
4 -1
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 < 5 = d[5], deci muchia (2,5) poate fi relaxată,
5 -2 6 astfel avem d[5]=0.
∞ 4
Pentru muchia (3,5) avem:
4 -1
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
∞ 5 Pentru muchia (4,3) avem:
d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 < 5 = d[5], deci muchia (2,5) poate fi relaxată,
5 -2 6 astfel avem d[5]=0.
∞ 4
Pentru muchia (3,5) avem:
4 -1
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
∞ 5 Pentru muchia (4,3) avem:
d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Pentru muchia (4,6) avem:
d[4]+w(4,6)=5-1=4 = 4 = d[6], deci muchia (4,6) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 < 4 = d[6], deci muchia (5,6) poate fi relaxată,
2 -1 ∞ 50 astfel avem d[6]=3.
6 5
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 < 4 = d[6], deci muchia (5,6) poate fi relaxată,
2 -1 ∞ 50 astfel avem d[6]=3.
6 5
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 < 4 = d[6], deci muchia (5,6) poate fi relaxată,
2 -1 ∞ 50 astfel avem d[6]=3.
6 5 Pentru muchia (3,2) avem:
-2 3 d[3]+w(3,2)=3-2=1 = 1 = d[2], deci muchia (3,2) nu poate fi relaxată.
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 < 4 = d[6], deci muchia (5,6) poate fi relaxată,
2 -1 ∞ 50 astfel avem d[6]=3.
6 5 Pentru muchia (3,2) avem:
-2 3 d[3]+w(3,2)=3-2=1 = 1 = d[2], deci muchia (3,2) nu poate fi relaxată.
0 1 4 3
3 A doua iterație este încheiată.
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 A treia iterație.
2 -1 ∞ 50
6 5
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50
6 5
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3
0 1 4 3
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 6
-2 ∞ 4 3 Pentru muchia (3,5) avem:
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 6
-2 ∞ 4 3 Pentru muchia (3,5) avem:
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
4 -1
Pentru muchia (4,3) avem:
∞ 5 d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 6
-2 ∞ 4 3 Pentru muchia (3,5) avem:
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
4 -1
Pentru muchia (4,3) avem:
∞ 5 d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Pentru muchia (4,6) avem:
d[4]+w(4,6)=5-1=4 = 4 = d[6], deci muchia (4,6) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 6
-2 ∞ 4 3 Pentru muchia (3,5) avem:
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
4 -1
Pentru muchia (4,3) avem:
∞ 5 d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Pentru muchia (4,6) avem:
d[4]+w(4,6)=5-1=4 = 4 = d[6], deci muchia (4,6) nu poate fi relaxată.
Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 = 3 = d[6], deci muchia (5,6) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (1,2) avem:
d[1]+w(1,2)=0+6=6 > 1 = d[2], deci muchia (1,2) nu poate fi relaxată.
2 -1 ∞ 50 Pentru muchia (1,3) avem:
6 5 d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
-2 3 Pentru muchia (1,4) avem:
0 1 3 d[1]+w(1,4)=0+5=5 = 5 = d[4], deci muchia (1,4) nu poate fi relaxată.
4
3 Pentru muchia (2,5) avem:
∞43 d[2]+w(2,5)=1-1=0 = 0 = d[5], deci muchia (2,5) nu poate fi relaxată.
5 6
-2 ∞ 4 3 Pentru muchia (3,5) avem:
d[3]+w(3,5)=3+3=6 > 0 = d[5], deci muchia (3,5) nu poate fi relaxată.
4 -1
Pentru muchia (4,3) avem:
∞ 5 d[4]+w(4,3)=5-2=3 = 3 = d[3], deci muchia (4,3) nu poate fi relaxată.
Pentru muchia (4,6) avem:
d[4]+w(4,6)=5-1=4 = 4 = d[6], deci muchia (4,6) nu poate fi relaxată.
Pentru muchia (5,6) avem:
d[5]+w(5,6)=0+3=3 = 3 = d[6], deci muchia (5,6) nu poate fi relaxată.
Pentru muchia (1,3) avem:
d[1]+w(1,3)=0+4=4 > 1 = d[3], deci muchia (1,3) nu poate fi relaxată.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Orice iterație viitoare va arăta că relaxările sunt complet efectuate,
deci drumurile minime calculate pornind de la nodul sursă 1 sunt:
2 -1 ∞ 50
6 5 Nodul 2 – d[2] = 1
-2 3 Nodul 3 – d[2] = 3
0 1 3 Nodul 4 – d[2] = 5
4
3 Nodul 5 – d[2] = 0
∞43 Nodul 6 – d[2] = 3
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Complexitatea algoritmului Bellman-Ford
2 -1 ∞ 50 Dimensiunea grafului (numărul de noduri) : |V|
6 5 Numărul de relaxări / iterație = E
-2 3 Numărul de iterații : |V|-1
0 1 4 3
3 Complexitate: O(E∙(|V|-1)) sau O(n2).
∞43
5 -2 6
∞ 43
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
BellmanFord(sursa): (...)
// initializari // relaxari succesive
FOREACH nod IN V // V = multimea nodurilor FOR i = 1 TO |V|
IF muchie[sursa, nod] THEN FOREACH (u, v) IN E // E = multimea muchiilor
d[nod] = w[sursa, nod] IF d[v] > d[u] + w(u,v) THEN
P[nod] = sursa d[v] = d[u] + w(u,v)
ELSE p[v] = u;
d[nod] = +∞ ENDIF
P[nod] = null ENDFOREACH
ENDIF ENDFOR
ENDFOREACH
d[sursa] = 0 // daca se mai pot relaxa muchii
p[sursa] = null FOREACH (u, v) IN E
(...) IF d[v] > d[u] + w(u,v) THEN
WRITE (”exista cicluri negativ”)
ENDIF
ENDFOREACH
Drumuri multipunct – multipunct
Algoritmul Floyd-Warshall
• Rezolvă problema drumurilor optime multipunct – multipunct.
• Nu se aplică în cazul grafurilor care conțin cicluri cu cost negativ.
• Algoritmul se înscrie în categoria algoritmilor de programare dinamică.
• Drumul optim dintre două noduri u și v este construit iterativ, folosind drumuri din ce în ce mai bune
u..x și x..v unde x este orice nod pe o cale u..v în graf.

Fie G=(V,E) este un graf fără cicluri cu cost negativ. Mulțimea nodurilor este V={1,2,...,n}, iar w:VxV→R o
funcție de cost a arcelor grafului, astfel încât w(i,i)=0 și w(i,j)=∞ dacă (𝑖, 𝑗) ∉ 𝐸. Notăm cu dk(i,j) costul
drumului i..j curent construit, astfel încât drumul trece exclusiv prin noduri intermediare din mulțimea
{1,2,...,k}.

Formulele de calcul al valorilor dk(i,j) pentru k=0,n

d0(i,j)=w(i,j)
dk(i,j)=min{dk-1(i,j), dk-1(i,k)+dk-1(k,j)} pentru 0<k<=n.
Drumuri multipunct – multipunct
Algoritmul Floyd-Warshall
FloydWarshall(G):
n = |V|
int d[n, n]
FOREACH (i, j) IN (1..n,1..n) DO
d[i, j] = w[i,j] // costul muchiei, sau infinit
FOR k = 1 TO n DO
FOREACH (i,j) IN (1..n,1..n) DO
d[i, j] = min(d[i, j], d[i, k] + d[k, j])
Drumuri multipunct – multipunct
Algoritmul Floyd-Warshall
Pentru a determina drumul efectiv, nu doar costul acestuia, avem două variante:
1. Se retine o structura de părinți, similara cu cea de la Dijkstra, dar, bineînțeles, bidimensionala.
2. Se folosește divide et impera astfel:
- se caută un pivot k astfel încât cost[i][j] = cost[i][k] + cost[j][k]
- se apelează funcția recursiv pentru ambele drumuri → (i,k),(k,j)
- dacă pivotul nu poate fi găsit, afișăm i
- după terminarea funcției recursive afișăm configurația drumului

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