Documente Academic
Documente Profesional
Documente Cultură
Este un algoritm care calculeaza drumurile minime de la un nod al unui graf la toate celelalte noduri din graf Grafurile pe care poate lucra algoritmul lui Dijkstra sunt, in general, ponderate si orientate arcele sunt orientate de la un nod la alt nod (nu se poate merge si invers) si au un anumit cost de care se va tine seama in aflarea drumului minim
Calin Jebelean Algoritmul lui Dijkstra 1
Algoritmul porneste de la un graf orientat si ponderat cu N noduri De asemenea, e nevoie de un nod de start apartinand grafului acesta este nodul de la care se doreste aflarea drumurilor minime pana la celelalte noduri din graf Rezultatul algoritmului se prezinta sub forma unui tablou D cu N intrari, continand distantele minime de la nodul de start la toate celelalte noduri din graf De asemenea, tot ca rezultat se poate obtine si arborele drumurilor minime (in cazul in care ne intereseaza nu numai lungimile minime ale drumurilor, ci si drumurile propriu-zise) acesta este un arbore generalizat care se va obtine sub forma unui tablou T cu N intrari (implementarea cu indicatori spre parinte)
Iesire:
Calin Jebelean
Deci, dupa pasul k, au fost gasite numai drumurile minime alcatuite din maxim k arce abia la finalul algoritmului (dupa pasul N-1) drumurile minime obtinute sunt definitive, ele fiind drumuri minime alcatuite din maxim N-1 arce
Calin Jebelean Algoritmul lui Dijkstra 5
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
7 1 3 3 4 5
A E A A C E F A B C D E F G H
Tabloul D are cate o intrare pentru fiecare nod al grafului, corespunzand lungimii drumului minim de la nodul A pana la respectivul nod Astfel, drumul minim de la A la A nu intereseaza (-), drumul minim de la A la F are lungimea 4, drumul minim de la A la H nu exista (), etc.
Calin Jebelean Algoritmul lui Dijkstra 9
D[x] este lungimea arcului direct de la A la nodul x pentru fiecare nod x T[x] este nodul de start (sau indicele nodului de start in T daca se doreste un tablou de indicatori spre parinte clasic)
D:
E F
9 G
A 9 B 1 C 2 4 E
3
9
D T: A A A A A A A A
5 G 1 A B
C D
5
1
1
F
2 4
Nodurile marcate astfel sunt noduri vizitate in graf de algoritmul lui Dijkstra
10
Calin Jebelean
Calin Jebelean
11
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
12
Pentru toate nodurile nemarcate trebuie sa verificam daca nu exista un drum mai scurt care trece prin nodul C Exemplu pentru nodul B:
D[B] = 9 este drumul cel mai scurt de la A la B pe care-l aveam D[C] + Arc(C , B) = 1 + = este drumul alternativ care trece prin nodul C (nodul ales) Acest al doilea drum este mai lung decat drumul pe care-l aveam deci D[B] nu se modifica la acest pas
Calin Jebelean
13
D[E] = este drumul cel mai scurt de la A la E pe care-l aveam D[C] + Arc(C , E) = 1 + 2 = 3 este drumul alternativ care trece prin nodul C (nodul ales) Deoarece noul drum este mai scurt decat drumul pe care-l aveam rezulta ca D[E] se modifica din in 3 si T[E] se modifica in C (nodul ales) Se observa ca drumul alternativ trece prin nodul C (nodul ales) Drumul de la A la C de lungime D[C] fiind minim, daca adaugam arcul C->E obtinem obligatoriu drumul minim de la A la E care trece prin C
Calin Jebelean
14
A 9 B 1 C 2 4 E
3
9
D T: A A A A C C A A
5 G 1 A B C D E
5
1
1
F
2 4
Din nodul C au fost descoperite aceste 2 drumuri noi (mai scurte) catre E si F
15
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
16
Pentru toate nodurile nemarcate trebuie sa verificam daca nu exista un drum mai scurt care trece prin nodul D Exemplu pentru nodul F:
D[F] = 6 este drumul cel mai scurt de la A la F pe care-l aveam D[D] + Arc(D , F) = 3 + = este drumul alternativ care trece prin nodul D (nodul ales) Acest al doilea drum este mai lung decat drumul pe care-l aveam deci D[F] nu se modifica la acest pas
Calin Jebelean
17
D[G] = 9 este drumul cel mai scurt de la A la G pe care-l aveam D[D] + Arc(D , G) = 3 + 5 = 8 este drumul alternativ care trece prin nodul D (nodul ales) Deoarece noul drum este mai scurt decat drumul pe care-l aveam rezulta ca D[G] se modifica din 9 in 8 si T[G] se modifica in D (nodul ales) Se observa ca drumul alternativ trece prin nodul D (nodul ales) Drumul de la A la D de lungime D[D] fiind minim, daca adaugam arcul D->G obtinem obligatoriu drumul minim de la A la G care trece prin D
Calin Jebelean
18
A 9 B 1 C 2 4 E
3
9
D T: A A A A C C D A
5 G 1 A B C D E
5
1
1
F
2 4
Din nodul D a fost descoperit acest drum nou (mai scurt) catre G
19
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
20
Pentru toate nodurile nemarcate trebuie sa verificam daca nu exista un drum mai scurt care trece prin nodul E Exemplu pentru nodul G:
D[G] = 8 este drumul cel mai scurt de la A la G pe care-l aveam D[E] + Arc(E , G) = 3 + = este drumul alternativ care trece prin nodul E (nodul ales) Acest al doilea drum este mai lung decat drumul pe care-l aveam deci D[G] nu se modifica la acest pas
Calin Jebelean
21
D[B] = 9 este drumul cel mai scurt de la A la B pe care-l aveam D[E] + Arc(E , B) = 3 + 4 = 7 este drumul alternativ care trece prin nodul E (nodul ales) Deoarece noul drum este mai scurt decat drumul pe care-l aveam rezulta ca D[B] se modifica din 9 in 7 si T[B] se modifica in E (nodul ales) Se observa ca drumul alternativ trece prin nodul E (nodul ales) Drumul de la A la E de lungime D[E] fiind minim, daca adaugam arcul E->B obtinem obligatoriu drumul minim de la A la B care trece prin E
Calin Jebelean
22
A 9 B 1 C 2 4 E
3
9
D T: A
5 G
1 A B C D E
5
1
1
F
2 4
Din nodul E au fost descoperite aceste 2 drumuri noi (mai scurte) catre B si F
23
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
24
Pentru toate nodurile nemarcate trebuie sa verificam daca nu exista un drum mai scurt care trece prin nodul F Exemplu pentru nodul B:
D[B] = 7 este drumul cel mai scurt de la A la B pe care-l aveam D[F] + Arc(F , B) = 4 + = este drumul alternativ care trece prin nodul F (nodul ales) Acest al doilea drum este mai lung decat drumul pe care-l aveam deci D[B] nu se modifica la acest pas
Calin Jebelean
25
D[G] = 8 este drumul cel mai scurt de la A la G pe care-l aveam D[F] + Arc(F , G) = 4 + 1 = 5 este drumul alternativ care trece prin nodul F (nodul ales) Deoarece noul drum este mai scurt decat drumul pe care-l aveam rezulta ca D[G] se modifica din 8 in 5 si T[G] se modifica in F (nodul ales) Se observa ca drumul alternativ trece prin nodul F (nodul ales) Drumul de la A la F de lungime D[F] fiind minim, daca adaugam arcul F->G obtinem obligatoriu drumul minim de la A la G care trece prin F
Calin Jebelean
26
A 9 B 1 C 2 4 E
3
9
D T: A
5 G
1 A B C D E
5
1
1
F
2 4
Din nodul F a fost descoperit acest drum nou (mai scurt) catre G
27
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Nu exista drumuri mai scurte spre B sau H trecand prin G, deci tablourile D si T raman nemodificate
28
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Nu exista drum mai scurt spre H trecand prin B, deci tablourile D si T raman nemodificate
29
Calin Jebelean
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Nu mai exista noduri nemarcate care sa fie actualizate, deci tablourile D si T raman nemodificate
30
Calin Jebelean
Lungimile drumurilor minime de la A la celelalte noduri din graf sunt disponibile in tabloul D Tabloul T serveste la reconstituirea drumurilor
Calin Jebelean Algoritmul lui Dijkstra 31
intuitiv, urmarind arcele ingrosate de pe graf (de exemplu, drumul minim de la A la G este A -> C -> E -> F -> G) formal, utilizand tabloul T rezultat in urma aplicarii algoritmului
A 9 B 1 C 2 4 E
3
9
D
5 G 1
5
1
1
F
2 4
Calin Jebelean
32
Daca consideram ca acest tablou reprezinta un arbore generalizat in implementarea cu indicatori spre parinte, atunci drumul minim de la A la G poate fi reconstituit pornind de la G: T[G] = F T[F] = E T[E] = C T[C] = A Mergand invers, obtinem: A -> C -> E -> F -> G Arborele generalizat obtinut in tabloul T contine toate drumurile minime cu originea in A
Calin Jebelean Algoritmul lui Dijkstra 33