Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze

Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Laboratorio di Algoritmi e Strutture Dati
Ingegneria e Scienze Informatiche - Cesena
A.A. 2013-2014
Pietro Di Lena
[email protected], [email protected]
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmo di Floyd-Warshall
Calcola il costo del cammino minimo tra tutte le coppie di vertici in un
grafo pesato e orientato.
Non restituisce gli effettivi cammini minimi.
I pesi degli archi posso essere negativi ma si assume che nel grafo non
esistano cicli il cui costo totale sia negativo.
Idea alla base dell’algoritmo
Inizializza la matrice delle distanze con i pesi degli archi per i vertici
adiacenti e con infinito per i vertici non adiacenti
Per ogni vertice v , e per ogni coppia di vertici u1 , u2 confronta il costo
attuale del cammino tra u1 → u2 con la somma del costo dei cammini
u1 → v e v → u2 .
Costo computazionale: O(|V |3 ).
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Inizializzazione della matrice delle distanze.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
∞
∞
1
∞
0
∞
1
∞
2
∞
∞
0
∞
4
3
∞
∞
∞
0
1
4
0
1
∞
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Aggiornamento della matrice delle distanze (valori rossi), considerando i
percorsi che passano attraverso il nodo a = 0.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
∞
∞
1
∞
0
∞
1
∞
2
∞
∞
0
∞
4
3
∞
∞
∞
0
1
4
0
1
3
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Aggiornamento della matrice delle distanze (valori rossi), considerando i
percorsi che passano attraverso il nodo b = 1.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
3
∞
1
∞
0
∞
1
∞
2
∞
∞
0
∞
4
3
∞
∞
∞
0
1
4
0
1
3
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Aggiornamento della matrice delle distanze (valori rossi), considerando i
percorsi che passano attraverso il nodo c = 2.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
3
7
1
∞
0
∞
1
∞
2
∞
∞
0
∞
4
3
∞
∞
∞
0
1
4
0
1
3
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Aggiornamento della matrice delle distanze (valori rossi), considerando i
percorsi che passano attraverso il nodo d = 3.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
3
4
1
∞
0
∞
1
2
2
∞
∞
0
∞
4
3
∞
∞
∞
0
1
4
0
1
3
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Floyd-Warshall: esempio
Aggiornamento della matrice delle distanze (valori rossi), considerando i
percorsi che passano attraverso il nodo e = 4.
b
1
d
2
1
a
2
1
3
c
4
e
0
1
2
3
4
0
0
2
3
3
4
1
2
0
5
1
2
2
4
5
0
6
4
3
1
2
4
0
1
4
0
1
3
2
0
0
a=0, b=1, c=2, d=3, e=4
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo Floyd-Warshall
Algoritmo di Floyd-Warshall: esempio
Algoritmo di Floyd-Warshall: pseudocodice
Algoritmo di Floyd-Warshall: pseudocodice
1: function FloydWarshall(G )
2:
n ← VertexSize(G )
3:
D ← matrix of size n × n
4:
for i ← 1 to n do
5:
for j ← 1 to n do
6:
D[i][j] ← Weight(i, j)
7:
end for
8:
end for
9:
for k ← 1 to n do
10:
for i ← 1 to n do
11:
for j ← 1 to n do
12:
if D[i][j] > D[i][k] + D[k][j] then
13:
D[i][j] ← D[i][k] + D[k][j]
14:
end if
15:
end for
16:
end for
17:
end for
18:
return D
19: end function
1: function Weight(i, j)
2:
if i=j then
3:
return 0
4:
else if i and j not adjcent then
5:
return ∞
6:
else
7:
return w (i, j)
8:
end if
9: end function
Nota. w (i, j) rappresenta il peso dell’arco tra i vertici i e j.
Quale implementazione è maggiormente efficiente: con liste o matrici di adiacenza?
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra
Calcola il costo del cammino minimo da un vertice sorgente s a tutti i
restanti vertici nel grafo.
Calcola un albero di copertura di cammini minimi (shortest path tree) con
radice s.
Assume che i pesi degli archi siano positivi.
Idea: ad ogni iterazione considera il vertice (non ancora visitato) a distanza
minima dal nodo sorgente e aggiorna le distanze dei suoi vertici adiacenti.
Costo computazionale:
Senza coda di priorità: O(|V |2 )
Con coda di priorità (Fibonacci Heap): O(|E | + |V | log |V |)
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra: esempio
Inizializzazione con sorgente c.
d[b]=∞
p[b]=NIL
Q={a,b,c,d,e}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=∞
p[a]=NIL
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=∞
p[e]=NIL
Laboratorio di Algoritmi e Strutture Dati
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra: esempio
d[b]=∞
p[b]=NIL
Q={a,b,d,e}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=∞
p[a]=NIL
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=∞
p[e]=NIL
Laboratorio di Algoritmi e Strutture Dati
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra: esempio
d[b]=∞
p[b]=NIL
Q={a,b,d,e}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=∞
p[a]=NIL
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=∞
p[b]=NIL
Q={a,b,d}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=∞
p[a]=NIL
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=∞
p[b]=NIL
Q={a,b,d}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={a,b,d}
b
d[d]=∞
p[d]=NIL
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={a,b,d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={b,d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={b,d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={b,d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={d}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: esempio
d[b]=5
p[b]=e
Q={}
b
d[d]=6
p[d]=e
1
d
2
d[a]=4
p[a]=e
1
a
2
1
3
c
d[c]=0
p[c]=NIL
0
Pietro Di Lena
4
e
d[e]=4
p[e]=c
Laboratorio di Algoritmi e Strutture Dati
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra: esempio
Shortest path tree da sorgente c.
d[c]=0
p[c]=NIL
c
4
0
d[a]=4
p[a]=e
d[e]=c
p[e]=4
e
2
a
1
d[b]=e
p[b]=5
Pietro Di Lena
d
d[d]=e
p[d]=6
b
Laboratorio di Algoritmi e Strutture Dati
Algoritmi avanzati su grafi: cammini minimi tra tutte le coppie
Algoritmi avanzati su grafi: cammini minimi da sorgente singola
Algoritmo di Dijkstra
Algoritmo di Dijkstra: esempio
Algoritmo di Dijkstra: pseudocodice
Algoritmo di Dijkstra: pseudocodice
1: procedure Dijkstra(G , s)
2:
InitSingleSource(G , s)
3:
Q ← {all the vertices in G }
4:
while Q =
6 ∅ do
5:
u ← ExtractMin(Q)
6:
for each edge (u, v ) in G do
7:
Relax(u, v )
8:
end for
9:
end while
10: end procedure
1: function ExtractMin(Q)
2:
return vertice v in Q con d[v ] minimo
3: end function
1: procedure InitSingleSource(G , s)
2:
for each vertex v in G do
3:
d[v ] ← ∞
4:
p[v ] ← NIL
5:
end for
6:
d[s] ← 0
7: end procedure
1: procedure Relax(u, v )
2:
if d[v ] > d[u] + w (u, v ) then
3:
d[v ] ← d[u] + w (u, v )
4:
p[v ] ← u
5:
end if
6: end procedure
Quale implementazione è maggiormente efficiente: con liste o matrici di adiacenza?
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati