Sunteți pe pagina 1din 21

Algoritmul Roy-Floyd

Lect. univ. dr. George-Valentin Cîrlig

1
Introducere

Teoria grafurilor îşi are originea în


lucrările lui Euler din 1736, în care el a
rezolvat problema podurilor de la
Königsberg și a prezentat metode pentru
rezolvarea altor probleme de același tip.

Termenul graf a fost folosit pentru


prima dată în sensul său actual în 1878 de
matematicianul Sylvester.
2
Introducere

Astăzi teoria grafurilor este


folosită în domenii variate: de la chimie la
economie, de la studiul rețelelor electrice
la probleme de transport, fiind strâns
legată de multe ramuri ale matematicii
(cercetări operaţionale, teoria grupurilor,
teoria numerelor, etc.).

3
Introducere

Materialul care urmează are ca temă un


algoritm din cei prezentați în cadrul
materiei de Algoritmica grafurilor la
specializarea Informatică, anul 2.

Mai precis vom aborda în continuare


algoritmul Roy-Floyd, un algoritm ce permite
determinarea drumurile minime într-un graf.

4
Algoritmul Roy-Floyd
Din punct de vedere istoric,
algoritmul a fost publicat în forma
curentă de Robert Floyd în 1962. Trebuie
menționat că în esență este același
algoritm cu cel publicat în 1959 de
Bernard Roy. În literatura de specialitate
se regăsește deci sub diverse nume:
Algoritmul Roy-Floyd, Algoritmul lui Floyd
sau uneori Algoritmul Floyd-Warshall.
5
Algoritmul Roy-Floyd
Din punct de vedere al programării,
algoritmul este unul de programare
dinamică (poate fi descompus în
subprobleme astfel încât fiecare
subproblema este rezolvată o singură
dată iar soluția este stocată pentru a fi
folosită ulterior la rezolvarea problemei
inițiale). Marele avantaj al acestui
algoritm este simplitatea sa!
6
Algoritmul Roy-Floyd
În cele ce urmeză considerăm
cunoscute din cursurile anterioare
noțiunile de
•graf; graf orientat;
•drum intr-un graf;
•matrice de adiacență;
•matricea drumurilor directe, etc.

7
Algoritmul Roy-Floyd

8
Prezentarea algoritmului
Ideea de bază a algoritmului este
următoarea: dacă drumul minim între două
vîrfuri oarecare i și j trece printr-un vârf k,
atunci drumurile de la i la k și de la k la j sunt la
rândul lor minime.

Putem deci să-i dăm lui k, pe rând, valorile


1, 2,..., n și să comparăm apoi: dij cu dik + dkj.

Dacă suma este mai mică, drumul inițial de


la i la j se poate înlocui cu cel indirect i - k – j.
Prezentarea algoritmului

Cu alte cuvinte, pentru graful inițial dat,


pornind de la matricea distanțelor directe:
D = dij(0)
putem obține, într-un număr de n pași, o
matrice a tuturor distanțelor minime
dij(k) = min {dij(k-1), dik(k-1) + dkj(k-1)}

10
Procedura principală a algoritmului

În aceste condiții, procedura principală a


algoritmului este următoarea:
for k = 1 to n do
for i = 1 to n do
for j = 1 to n do
dij(k) = min{dij(k-1) , dik(k-1) + dkj(k-1)};

iar algoritmul este deci de complexitate O(n3).

11
Determinarea drumurilor minime

Determinarea drumurilor minime se poate realiza și


ea în cadrul algoritmului dacă se utilizează în paralel
o matrice ∆ inițializată cu:
- xi dacă dij < ∞
-  dacă dij = ∞

La sfârșitul algoritmului obținem matricea ∆n unde


δij este mulțimea de vîrfuri vecine cu xj ce se gasesc
pe drumurile de lungime minimă de la xi la xj.
Exemplu de aplicare Roy-Floyd
În continuare ne propunem să determinăm drumurile minime pentru graful de mai jos (pornind
de la matricea distanțelor directe).

x3 3
x4 0 4    
D=
2 4 2  0  5 6 
1 3 2 1 0 3 4 
x1 x6
5    0  2
4
8    3 0 8
x2 x5
6      0
În slide-ul precedent am scris matricea distanțelor directe asociate grafului dat (fără folosirea de noduri intermediare). Să căutăm acum drumuri
mai scurte între oricare două noduri permițând pe rând utilizarea câte unui alt nod. În paralel vom scrie și matricea ∆ pentru a identifica la final
drumurile minime.

0 4     x1 x1    
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D=    0  2 ∆=
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6
0 4     x1 x1    
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D=    0  2 ∆=
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6
0 4     x1 x1    
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D1 =    0  2 ∆1 =
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6 15
0 4     x1 x1    
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D1 = ∆1 =
   0  2
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6
0 4  9 10  x1 x1  x2 x2 
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D2 =    0  2 ∆2 =
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6 16
0 4  9 10  x1 x1  x2 x2 
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D2 = ∆2 =
   0  2
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6
0 4  9 10  x1 x1  x2 x2 
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D3 =    0  2 ∆3 =
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6 17
0 4  9 10  x1 x1  x2 x2 
 0  5 6   x2  x2 x2 
2 1 0 3 4  x3 x3 x3 x3 x3 
D3 = ∆3 =
   0  2
   x4  x4
   3 0 8
   x5 x5 x5
     0
     x6
0 4  9 10 11 x1 x1  x2 x2 x4
 0  5 6 7  x2  x2 x2 x4
2 1 0 3 4 5 x3 x3 x3 x3 x3 x4
D4 =    0  2 ∆4 =
   x4  x4
   3 0 5
   x5 x5 x4
     0
     x6 18
0 4  9 10 11 x1 x1  x2 x2 x4
 0  5 6 7  x2  x2 x2 x4
2 1 0 3 4 5 x 3 x 3 x 3 x 3 x3 x 4
D4 = ∆4 =
   0  2
   x4  x4
   3 0 5
   x5 x5 x5
     0
     x6
0 4  9 10 11 x1 x1  x2 x2 x4
 0  5 6 7  x2  x2 x2 x4
2 1 0 3 4 5 x3 x3 x3 x3 x3 x4
D5 =    0  2 ∆5 =
   x4  x4
   3 0 5
   x5 x5 x5
     0
     x6 19
0 4  9 10 11 x1 x1  x2 x2 x4
 0  5 6 7  x2  x2 x2 x4
2 1 0 3 4 5 x 3 x 3 x 3 x 3 x3 x 4
D5 = ∆5 =
   0  2
   x4  x4
   3 0 5
   x5 x5 x5
     0
     x6
0 4  9 10 11 x1 x1  x2 x2 x4
 0  5 6 7  x2  x2 x2 x4
2 1 0 3 4 5 x3 x3 x3 x3 x3 x4
D6 =    0  2 ∆6 =
   x4  x4
   3 0 5
   x5 x5 x5
     0
     x6 20
Concluzie

Fiind folosit în diverse domenii (de la


controlul avioanelor de pe un anumit
aeroport până la jocuri informatice) și
beneficiind de o implementare facilă
algoritmul Roy-Floyd este una dintre
primele alegeri atunci când se urmărește
găsire drumului minim între un obiect
principal și o țintă anume.

21

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