Algoritmo di Dijkstra
Esempio e confronto con Bellman-Ford
Versione distribuita dell’algoritmo di Bellman
-Ford (Vector Distance)
31.2
L’algoritmo di Bellman-Ford itera sul numero
di archi attraversati da un percorso.
L’algoritmo di Dijkstra itera sulla lunghezza
del percorso.
31.3
1 Bellman-
D2 = 1 2
3
3 Ford
1 2
1 1 1 6
4 4 5 4
1
D4 = 4 1
Dijkstra
D2 = 1 2
3
3 D3 = 4
1 2
P = {1, 2}
1 1 1 6
4 4 5 4
D4 = 4 1 D5 = 2
31.6
2 2 Bellman-
D2 = 1 2
3
3 D3 = 4 Ford
1 2
1 1 1 6
4 4 5 4
2 2
D4 = 4 1 D5 = 2
Dijkstra
D2 = 1 2
3
3 D3 = 3
1 2
P = {1, 2, 5}
1 1 1 6 D6 = 6
4 4 5 4
D4 = 3 1 D5 = 2
31.7
3 3 Bellman-
D2 = 1 2
3
3 D3 = 3 Ford
1 2
3
1 1 1 6 D6 = 6
4 4 5 4
3 3
D4 = 3 1 D5 = 2
Dijkstra
D2 = 1 2
3
3 D3 = 3
1 2
P = {1, 2, 3,
4, 5} 1 1 1 6 D6 = 5
4 4 5 4
D4 = 3 1 D5 = 2
31.8
4 4 Bellman-
D2 = 1 2
3
3 D3 = 3 Ford
1 2
4
1 1 1 6 D6 = 5
4 4 5 4
4 4
D4 = 3 1 D5 = 2
Dijkstra
D2 = 1 2
3
3 D3 = 3
1 2
P = {1, 2, 3,
4, 5, 6} 1 1 1 6 D6 = 5
4 4 5 4
D4 = 3 1 D5 = 2
31.9
[Data una funzione qualsiasi f(n) e una φ(n)>0, f=O(φ) significa che
f<cφ, con c indipendente da n per i valori di n in questione.]
31.10
L’iterazione dell’algoritmo di Bellman-Ford può
essere eseguita ad ogni nodo i in parallelo con gli
altri.
Se le iterazioni fossero eseguite in modo sincrono
(simultaneamente ad ogni nodo), scambiando ad
ogni iterazione i risultati con i vicini, partendo dalle
condizioni iniziali Di0 = ∞ per tutti gli i ≠ 1 e D10 = 0,
l’algoritmo convergerebbe in al più N-1 passi.
31.11
31.12
Nella versione asincrona, ogni nodo i esegue
l’iterazione
Di ← minj ∈N (i) {dij + Dj }
(dove N(i) è l’insieme dei nodi adiacenti ad i), usando le
stime Dj più recenti ricevute dai vicini e trasmettendo Di
ai propri vicini.
31.13
31.14