Documente Academic
Documente Profesional
Documente Cultură
Un exemplu de astfel de graf este o harta a unui oras unde sunt specificate distantele dintre diferitele intersectii 2. X=R muchiile au costuri reale si nu exista cicluri de cost negativ Un exemplu de astfel de graf poate sa apara in reprezentarea unor activitati economice unde pot sa apara muchii de cost negativ in cazul unor pierderi financiare
Prin ciclu de cost negativ intelegem un ciclu in care suma costurilor muchiilor ce fac parte din drum este negativa. In figura de mai sus drumul 1->3->4->1 are cost negativ. Se observa ca suma costurilor muchiilor de pe acest drum este negativa (2+5+(-2))=-1. Datorita acestui ciclu nu se poate obtine un cost minim pentru drumul (1,2) de exemplu deoarece la fiecare parcurgere a drumului de cost negativ costul drumului (1,2) mai scade cu o unitate. Astfel dupa n parcurgeri costul drumului (1,2) va fi n-2.
In figura 4, in momentul in care se analizeaza muchia (u,v) exista un cost estimat pentru drumul s..v d[v]=8 si un cost estimat pentru drumul s..u d[u]=5. Se observa usor ca drumul dintre s..u..v este mai bun din punct de vedere al costului decat drumul s..v al carui cost este calculat pana in prezent deoarece d[v]>d[u]+w(u,v). Relaxarea consta in actualizarea d[v] in conditiile in care inegalitatea de mai sus este adevarata deoarece s-a gasit un drum evident mai bun in momentul de fata (am obtinut un optim local mai bun decat cel estimat la un pas precedent) Pentru a tine evidenta muchiilor ce trebuie relaxate avem nevoie de 2 structuri S multimea de varfuri deja vizitate si Q o coada cu prioritati in sensul ca intotdeauna este extras elementul cu distanta fata de sursa cea mai mica 1 function Dijkstra(G, w, s) 2 for each vertex v in V[G] 3 d[v] := /* daca distanta intre s si un nod v nu este cunoscuta se initializeaza cu infinit. Astfel daca din s nu se poate ajunge in v distanta ramane infinit.*/ 4 p[v] := null /*p[v] reprezinta nodul din care se va ajunge in v pe drumul cel mai scurt */ 5 d[s] := 0 // distanta dintre s si s 6 S := // S reprezinta multimea de varfuri deja vizitate 7 Q := V[G] /*Q reprezinta o coada cu prioritati in care sunt introduse varfurile care nu au fost vizitate*/
8 while Q 9 u := Extract_Min(Q) /*se extrage din coada cu prioritati nodul a carui distanta fata de s este minima*/ 10 S := S union {u} //nodul se marcheaza ca fiind vizitat 11 for each (u,v) Adj(u) 12 if d[u] + w(u,v) < d[v] // se relaxeaza muchia (u,v) 13 d[v] := d[u] + w(u,v) 14 p[v] := u In cazul in care ne intereseaza doar drumul optim intre sursa s si o destinatie d putem opri cautarea la linia 9 daca s=d. Ulterior putem gasi cel mai scurt drum dintre s si d prin parcurgerea vectorului de parinti. 1 S := 2 u := t 3 while p[u] null 4 adauga u la inceputul lui S 5 u := p[u] Complexitatea algoritmului este O(|V|2+|E|) in cazul in care coada cu prioritati este implementata ca o cautare lineara si O(( | E | + | V | )log | V | ) in cazul in care implementam coada ca heap.
Algoritmul Bellman-Ford
(ptr muchii negative) Algoritmul BF poate fi folosit si pentru grafuri ce contin muchii de cost negativ dar nu poate fi folosit pentru grafuri ce contin cicluri de cost negativ (deci doar cazurile 1,2) Algoritmul foloseste acelasi mecanism de relaxare ca si Dijkstra dar spre deosebire de acesta nu optimizeaza o solutie folosind un criteriu de optim local ci parcurge fiecare muchie de un numar de ori egal cu numarul de noduri si incearca sa o relaxeze de fiecare data pentru a imbunatati distanta pana la nodul destinatie al muchiei curente Daca la sfarsitul acestor E*V relaxari mai poate fi imbunatatita o distanta atunci graful are un ciclu de cost negativ si nu poate fi aplicat algoritmul in acest caz. Cand este actualizata o distanta se actualizeaza automat si parintele nodului a carui distanta este actualizata 1. function BellmanFord(G,s) 2. for each v in V[G] 3. d[v]= ; 4. p[v]=null; 5. for i = 1 to |V| 6. for each (u,v) in E[G] 7. if d[v]>d[u]+w(u,v) 8. d[v]=d[u]+w(u,v); 9. p[v]=u; 10.for each (u,v) in E[G] //G=(V,E), s=sursa
11. 12.
Exemple
Graful generat mai jos este creat cu graphviz si va fi folosit in aplicatia de la laborator.
Resurse
http://en.wikipedia.org/wiki/Dijkstra's_algorithm http://en.wikipedia.org/wiki/Bellman-Ford_algorithm T. Cormen, C. Leiserson, R. Rivest, C. Stein Introducere in Algoritmi C. Giumale Introducere in analiza algoritmilor