170 likes | 433 Views
Algoritmul lui Bellman Ford. Cuprins. I ntroducere Modul de funcţionare E xemplu Algoritmul în limbaj C ++. I ntroducere.
E N D
Cuprins • Introducere • Modul de funcţionare • Exemplu • Algoritmul în limbaj C++
Introducere Algoritmul este valabil atât in cazul grafurilor orientate cât şi în cazul celor neorientate. Pentru cele orientate obţinem lista nodurilor accesibile prin drum din vârful de plecare, iar pentru grafurile neorientate obţinem lanţurile de cost minim de la un nod ales la celelalte noduri. Cuprins
Modul de funcţionare • Se consideră că există soluţie doar în cazul în care din vârful de start nu se ajunge la un circuit de cost negatv, deoarece acesta ar duce la minimizarea drumului la infinit. • Algoritmul încearcă să minimizeze succesiv costul drumului de la vârful ales la orice vârf din graf până la obţinerea costului minim. • Operaţia de minimizare a distanţelor se repetă de n ori. • În final muchille ce aparţin drumurilor de cost minim vor fi colorate diferit . Cuprins
Exemplu Cuprins
Pentru graful prezentat se va calcula drumurile de cost minim din nodul 1: • Se construieşte un vector viz de dimensiuneegala cu numarulnodurilor : viz: • În acest caz nodul 1 cum este nod de plecare se marchează în viz cu valoarea 0. • Pasul următor constă în iniţializarea restului valorilor din viz cu valori foarte mari. 1 2 3 4 5 6 Cuprins
Se construieşte o coadă cu numele c. • Pentru că s-a ales nodul 1 ca nod de plecare se notează în coadă. c: 1 • Se alege nodul adiacent , în acest caz 5. • Se marcheză in viz pe poziţia 5 cu 1 pentru a evidenţia costul. • Următorul nod adiacent al lui 1 care este 3; astfel se marcheză în viz pe poziţia 3 cu 4 si se adaugă în coadă nodul 3. c:1,5,3 • Se ia în continuare următorul nod adiacent al lui 1, care este 2 şi se marchează în viz pe poziţia 2 cu 5, iar in coadă se aduagă 2. c:1,5,3,2 Cuprins
Următorul nod adiacent al lui 1 este 6 şi astfel se marchează în viz pe poziţia 6 cu 6, iar în coadă se adaugă nodul 6. c:1,5,3,2,6 • Pentrucă nodul 1 nu mai are adiacenţi se trece la nodul următor, 5 şi se marchează în coadă cu roşu pentru a evidenţia. c:1,5,3,2,6 • Se ia primul adiacent al lui 5,1. • Pentru că în vectorul viz costul până la nodul 5 este 1,iar costul de la 5 la nodul 1 este 1,în vector nu se va face nici o modificare deoarece valoarea costului obţinut prin însumarea lor nu este o valoare mai mică decat în viz. • Următorul nod adiacent al lui 5 este 4. • Costul până la nodul 5 este 1,iar de la 5 la 4 este 2.În vectoul viz se trece pe poziţia 4 3 doarece acesta este costul obţinut prin însumare. Astfel se adaugă şi în coadă nodul 4. c:1,5,3,2,6,4 Cuprins
Următorul nod adiacent al lui 5. Însă nu sunt modificări în viz deoarece costul lui 5 până la 1 este 1 şi de la 5 la 6 este 9 şi astfel, prin însumare costul de la 5 la 6 devine 10 si este mai mare decat era iniţial. • Nodul următor din coadă, 3.Se evidenţiază cu roşu in coadă. c:5,3,2,6,4 • Primul adiacent al lui 3.Acesta fiind 1, nu există modificări. • Următorul adiacent al lui 3 este 2. Însă nici de data aceasta nu sunt modificări deoarece prin însumare(4+7=11) noul cost ar fi mai mare decat cel iniţial,5. • Următor adiacent al lui 3 este 4. Noul cost ar deveni 7 prin însumare(4+3=7) şi astfel nu sunt modificări. • Pentru că nu mai sunt adiacenţi ai lui 3 se trece la nodul următor,2 şi se în evidenţă cu roşu în coadă. c:1,5,3,2,6,4 • Primul adiacent al lui 1.Nu sunt modificări în acest caz. • Următorul adiacent al lui 2 este 3. Prin însumare noul cost al lui 3 ar deveni 12 şi astfel nu sunt modificări. • Următorul adiacent al lui 2 fiind 4 se află cât ar deveni noul cost al lui 4. Prin însumare ar deveni şi deci nu sunt modificări. Cuprins
Următorul adiacent al lui 2 6, cu noul cost 9, care este mai mare decât 6 şi deci nici de data aceasta nu sunt modificări. • Se trece la următorul nod din coadă pentru că nu mai sunt adiacenţi ai lui 2. c:1,5,3,2,6,4 • Modificări nu sunt pentru acest nod. • Se trece la următorul din coadă,4. c:1,5,3,2,6,4 • Nu esteniciomodificare. • Vectorul la fel ca șicoada se vaîncheia cu ultimul nod din vectordeoarece s-a realizatîntreagaparcurgere a cozii. c:1,5,3,2,6,4 Cuprins
Algoritmul în limbaj C++ void BF(int x) {int c[50], p=u=1; c[i]=x; viz[x]=1; while(p<=u) { x=c[p++]; for(i=1;i<=n;i++) if(a[x][i]!=inf && viz[x]+a[x][i]<viz[i]) viz[i]=viz[x]+a[x][i]; {c[u++]=i; viz[i]=1; } } for(i=1;i<=n;i++) cout<<c[i]<<“ “; } Cuprins