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