Sunteți pe pagina 1din 10

FACULTATEA DE AUTOMATICA, CALCULATOARE SI ELECTRONICA CRAIOVA

PROIECT STRUCTURI DE DATE SI ALGORITMI

DISTANTE MINIME INTR-UN GRAF ALGORITMUL LUI DIJKSTRA

VLADU OCTAVIAN MIHAI

GRUPA 10203 D

Prezentare algoritm

Algoritmul lui Dijkstra este un algoritm care calculeaza drumurile minime de la un nod dat pana la toate celalalte noduri. Grafurile pe care se aplica acest algoritm sunt, in general, ponderate si orientate si au un anumit cost de care se va tine seama in calcularea drumului minim. Un graf orientat este acel graf care poate avea muchie intre doua noduri cu o singura directie: ori se merge de la nodul A in nodul B, ori se merge de la nodul B in nodul A (ambele variante in acelasi timp sunt imposibile, altfel am avea un graf neorientat). Un graf ponderat, este un graf in care avem asociat un cost fiecarei muchii. In cazul in care avem un graf neponderat, putem asocia ca drum de la un nod la altul minimul de muchii prin care se trece.

Algorimul lui Dijkstra, pentru a se putea rula, are nevoie ca date de intrare de un graf cu n noduri, de matricea de adiacenta a acestuia si de costul fieacrei muchii (toate acestea reprezentand un graf cu toate elementele sale) si nodul de start. Dupa rularea algoritmului, acesta obtine un vector in care pune distanta minima de la nodul de start pana la fiecare nod in parte astfel: D = [ dist A-A ; dist A-B ; dist A-C ; ; dist A-N ] si un vector in care salveaza parintele direct al nodului la care afiseaza distanta minima. Acesta este un vector T care are n elemente.

EXEMPLU DE DATE INTRARE IESIRE:

1 A B

2 C

Numarul de noduri: 3 Matrice de adiacenta: 0 0 0 1 0 0 0 1 0

Matrice de cost: 0 0 0 1 0 0 0 2 0

Nod de start: A Acestea sunt datele de intrare care definesc graful desenat mai sus.

Datele de iesire vor fi: D = [ 0 ; 1 ; 3 ] -> distanta A-A=0, distanta A-B=1 si distanta A-C=3; T = [ - ; A ; B ] -> din A plecam, punem -, in nodul B ajungem cu costul minim 1 direct din nodul de start, in nodul C ajungem cu costul minim 3 si parintele sau direct (ultimul parinte) este nodul B;

Modul de functionare al algoritmului:


Algoritmul lui Dijkstra are tot atatia pasi cate noduri are graful nostru. La fiecare pas se actualizeaza vectorul D si vectorul T cu noile

valori gasite (in cazul in care acestea convin). Pentru rularea algoritmului lui Dijkstra, mai avem nevoie de un vector in care ne vom nota daca s-a plecat dintr-un nod vreodata sau nu. Este necesar sa facem acest lucru pentru ca trebuie sa plecam cel mult odata din fiecare nod. Inainte sa plecam dintr-un nod si sa facem instructiunile necesare, vom nota acest nod ca extras / activ si nu vom mai putea pleca in alt pas tot din el.

Se initializeaza vectorul de distante cu valoarea 9999 reprezentand o valoare infinita, urmand ca pe parcursul programului aceasta sa fie ajustata.

La primul pas se va pleca din nodul de start, se va bifa acesta ca extras/ales si se va completa in vectorul D distanta pana la fiecare nod in parte (daca exista muchie), iar in vectorul T se va trece nodul de start pe aceeasi pozitie pe care s-a completat distanta in vectorul D. La urmatorul pas se alege, din vectorul D, nodul a carui cifra reprezinta cel mai mic drum cu conditia ca acel nod sa nu fi fost extras / ales, altfel se trece la urmatoarea valoare cea mai mica. In cazul in care are muchie cu alte noduri se aduna costul acelei muchii cu costul calculat pana la nodul din care am pornit si in cazul in care aceasta este mai mica decat valoarea inregistrata in vectorul D se inlocuieste cu aceasta, iar in vectorul T, pe aceeasi pozitie trecem nodul actual. Se repeta astfel cele spuse mai sus pana cand ajungem sa plecam din toate nodurile o singura data. In urma acestor n pasi, vom gasi parcurgerea grafului in functie de costul minim.

Exemplu practic

Avem urmatoarele orase si rutele posibile dintre acestea cu tot cu numarul de kilometrii (practic, acesta ar fi un graf neorientat, dar il vom considera orientat pentru aplicarea algoritmului lui Dijkstra)

Valcea
80 40 40

Craiova
100

Balcesti

60

70

30

Pitesti

Slatina

PASUL I : Consideram ca trebuie sa plecam din orasul Craiova. Observam pe figura urmatoare legaturile din Craiova (directe) catre celalate orase si schimbarile ce au loc in vectorul D si in vectorul T.

Consideram nodurile in ordine alfabetica: BALCESTI, CRAIOVA, PITESTI, SLATINA, VALCEA

Valcea
80 40 40

Craiova
100 70

Balcesti

60

30

Pitesti

Slatina

D = [ 40; 0; 100; 60; ] si T = [Craiova; Craiova; Craiova; Craiova; -]

PASUL II: Valoarea cea mai mica din vectorul D este 40 care ii corespunde orasului Balcesti. Verificam muchiile care pleaca din Balcesti si vedem ca avem drum spre Valcea cu costul 80. Adunam 80 la drumul obtinut pana in Balcesti si daca acesta este mai mic decat drumul pana in Valcea obtinut la pasii anteriori, il actualizam in vectorul D.

Valcea
80 40 40

Craiova
100 70

Balcesti

60

30

Pitesti

Slatina

D = [40; 0; 100; 60; 120] si T = [Craiova; Craiova; Craiova; Craiova; Balcesti]

PASUL III: Cautam cea mai mica valoare din vectorul D cu observatia sa nu se fi plecat din acel oras niciodata. Vedem ca cea mai mica valoare este 60 si este vorba de orasul Slatina. Asadar, la acest pas vom pleca din Slatina. Avem drum in Pitesti (30) si in Valcea (40). CRAIOVA SLATINA PITESTI = 60 + 30 = 90 (mai scurt decat Craiova Pitesti) CRAIOVA SLATINA VALCEA = 60 + 40 = 100 (mai scurt decat Craiova Balcesti Valcea)

Valcea
80 40 40

Craiova
100 70

Balcesti

60

30

Pitesti

Slatina

D = [40; 0; 90; 60; 100] si T = [Craiova; Craiova; Slatina; Craiova; Slatina]

PASUL IV: Cautam cea mai mica valoare din vectorul D cu observatia sa nu se fi plecat din acel oras niciodata. Vedem ca cea mai mica valoare este 90 si este vorba de orasul Pitesti. Asadar, la acest pas vom pleca din Pitesti. Nu avem drum catre nici un alt oras, asadar la acest pas valorile din D si din T vor ramane nemodificate.

Valcea
80 40 40

Craiova
100 70

Balcesti

60

30

Pitesti

Slatina

D = [40; 0; 90; 60; 100] si T = [Craiova; Craiova; Slatina; Craiova; Slatina]

PASUL V: Cautam cea mai mica valoare din vectorul D cu observatia sa nu se fi plecat din acel oras niciodata. Vedem ca cea mai mica valoare este 100 si este vorba de orasul Valcea. Asadar, la acest pas vom pleca din Valcea. Avem drum catre Pitesti si acest drum are 70 km: CRAIOVA SLATINA VALCEA PITESTI = 100 + 70 = 170, dar drumul actual pana in Pitesti este de 90 km, deci nu se va modifica aceasta valoare, deoarece drumul prin Valcea este mai lung.

Valcea
80 40 40

Craiova
100 70

Balcesti

60

30

Pitesti

Slatina

D = [40; 0; 90; 60; 100] si T = [Craiova; Craiova; Slatina; Craiova; Slatina]

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