. Cammini ottimi E. Amaldi Fondamenti di R.O. Politecnico di Milano
.. Cammini minimi e algoritmo di Dijkstra Dato un grafo orientato G = (N, A) con una funzione di costo c : A c ij R e due nodi s e t, determinare un cammino di costo minimo da s a t. s èl origine s 6 8 t èla destinazione c ij rappresenta il costo (lunghezza, tempo di percorrenza, ) dell arco (i, j) A 9 5 E. Amaldi Fondamenti di R.O. Politecnico di Milano 6 t
I problemi di cammini ottimi (minimi o massimi) hanno innumerevoli applicazioni: pianificazione e gestione di reti di trasporto, elettriche, idrauliche, di comunicazione,.. pianificazione di progetti complessi (relazioni logiche tra entità)... N.B.: Se grafo G non orientato j i lati sono considerati come coppie di archi i i j E. Amaldi Fondamenti di R.O. Politecnico di Milano
Un approccio di tipo greedy rispetto agli archi del taglio corrente ( simile a quello di Prim per gli alberi di supporto di costo minimo ) non è esatto! Esempio S s δ + ( S ) t s S δ + ( S ) t E. Amaldi Fondamenti di R.O. Politecnico di Milano
S s t s t = 6 = 5 il cammino ottenuto con il procedimento greedy non è di costo minimo. E. Amaldi Fondamenti di R.O. Politecnico di Milano 5
Algoritmo di Dijkstra ipotesi c ij, (i, j) A con c ij = + se (i, j) A input G = (N, A) con n = N e m = A, un nodo s N, c ij (i, j) A output Cammini minimi da s a tutti gli altri nodi 6 8 s 9 5 6 t E. Amaldi Fondamenti di R.O. Politecnico di Milano 6
Idea: Esplorare i nodi in ordine crescente del costo di un cammino minimo da s a ciascuno di essi. Ad ogni nodo j N si associa una etichetta L[j] che al termine dell algoritmo rappresenta il costo di un cammino minimo da s a j. Greedy sui cammini da s a j! # s # # 6 8 # # E. Amaldi Fondamenti di R.O. Politecnico di Milano 7 9 5 8 6 6 t # 5
Esempio s 6 8 Etichette associate ad ogni nodo j: [ L[j], pred[j] ] 9 dove pred[j] è il predecessore di j nel cammino minimo da s a j 5 6 t [, ] δ + ( S ) S * + < + [, ] s S E. Amaldi Fondamenti di R.O. Politecnico di Milano 8
S * [, ] [, ] [, ] + < + δ + ( S ) 8 5 S [, ] [, ] δ + ( S ) [, ] + < + * 5 [ 6, ] [, ] S δ + ( S ) [, ] [, ] 5 E. Amaldi Fondamenti di R.O. Politecnico di Milano 9 [ 6, ] * [ 8, 5 ] 6 + < +
[, ] [, ] δ + ( S ) * [ 8, 5 ] S [, ] [ 6, ] 5 S [, ] [ 8, 5 ] δ + ( S ) [, ] * 6 [, ] [ 6, ] [, ] E. Amaldi Fondamenti di R.O. Politecnico di Milano 5
Cammino minimo da s a j: pred[j], pred[ pred [j] ],..., s [, ] s [, ] 6 8 [, ] 9 5 [ 8, 5 ] 6 [ 6, ] t [, ] j= t Cammino di costo minimo da s a t Cammino di costo minimo da s al nodo E. Amaldi Fondamenti di R.O. Politecnico di Milano
Algoritmo di Dijkstra Struttura dati S N sottoinsieme di nodi di cui le etichette sono definitive L[ j] = costo di un cammino minimo da s a j, j S min { L[i] + c ij : (i, j) δ + (S) }, j S... E. Amaldi Fondamenti di R.O. Politecnico di Milano
s v L[v]= h c vh = L[h] δ + ( S ) i S c ij = L[i]=5 L[j] j Dato grafo G orientato e il sottoinsieme corrente di nodi S N, si considera il taglio orientato δ + (S) e si individua (v,h) δ + (S) tale che: L[v] + c vh = min { L[i] + c ij : (i, j) δ + (S) } cioè L[v] + c vh L[i] + c ij (i,j) δ + (S) E. Amaldi Fondamenti di R.O. Politecnico di Milano
pred[j] = v t.c. L[ v]+ c min L[i] + i c ij vj = { c : S} con = + se (i,j) A j S predecessore di j nel cammino minimo da s a j j S s L[i]=5 ij i c ij = j v c vj = L[v]= L[ j]=5 pred[ j]=v S δ + (S) E. Amaldi Fondamenti di R.O. Politecnico di Milano
Algoritmo di Dijkstra input output G = (N, A), n = N, m = A, s N, c ij (i, j) A Cammini minimi da s a tutti gli altri nodi BEGIN END S := {s}; L[s] := ; pred[s] := s; WHILE S n DO individuare (v,h) δ + (S) ={ (i,j) : (i,j) A, i S, j S} t.c. L[v] + c vh = min { L[i] + c ij : (i,j) δ + (S) }; L[h] := L[v] + c vh ; pred[h] := v; S := S {h}; END-WHILE taglio uscente NB: Se δ + (S)=, l algoritmo finisce: nessun h N \ S è raggiungibile da s E. Amaldi Fondamenti di R.O. Politecnico di Milano 5
Complessità Dipende da come, ad ogni iterazione, viene individuato l arco (v,h) del taglio uscente δ + (S). Se scansione esplicita di tutti m archi scartando quelli che non appartengono a δ + (S), complessità totale sarebbe O(nm), ossia O(n ) per i grafi densi. Determinando le etichette (qui L[j]) per aggiornamento ( algoritmo di Prim) basta considerare un solo arco di δ + (S) per ogni nodo j S complessità totale O(n ). E. Amaldi Fondamenti di R.O. Politecnico di Milano 6
Proprietà L algoritmo di Dijkstra è esatto. Dim. Al p-esimo passo: S = {s, i,..., i p } e L[ j ] = costo di un cammino minimo da s a j, j S costo di un cammino minimo con tutti i nodi intermedi in S j S Per induzione sul numero p di passi : base induttiva : è vero per p = : S = {s}, L[s] = e L[ j] = c sj j s passo induttivo : se è vero al p-esimo passo, lo è anche al (p+)-esimo E. Amaldi Fondamenti di R.O. Politecnico di Milano 7
(p+)-esimo passo: Sia h S il nodo che viene inserito in S e ϕ il cammino da s a h tale che: L[v] + c vh L[i] + c ij (i, j) δ + (S) Verifichiamo che per qualsiasi cammino π da s a h si ha c(π) c(ϕ) esistono i S e j S tali che S v h π = π (i, j) π dove ϕ (i, j) è il primo arco π δ + (S) s π L[v] i π π j per scelta di (v,h) costo c(ϕ) c(π) = c(π ) + c ij + c(π ) L[i] + c ij L[v] + c vh c(π ) L[ i ]: per ipotesi induttiva c(π ) perché c ij E. Amaldi Fondamenti di R.O. Politecnico di Milano 8
I cammini minimi da s a tutti i nodi j sono memorizzati mediante il vettore dei predecessori [, ] [ 8, 5 ] [, ] s 5 t [, ] j=t [, ] [ 6, ] I cammini minimi da s a tutti gli altri nodi formano un albero (albero dei cammini minimi). E. Amaldi Fondamenti di R.O. Politecnico di Milano 9
L algoritmo di Dijkstra non è applicabile se esistono archi di costo c ij < Esempio - In questo caso, otteniamo il cammino di costo mentre esiste il cammino di costo Il costo da a non è più modificato dopo il primo passo. Tramite una scelta greedy sui cammini uscenti dal nodo viene preso pari a c che è localmente migliore (c < c ) anche se il cammino ha un costo totale inferiore causa la presenza di c <. E. Amaldi Fondamenti di R.O. Politecnico di Milano
Esercizio Determinare i cammini minimi dal nodo a tutti gli altri nodi del seguente grafo: 5 6 7 E. Amaldi Fondamenti di R.O. Politecnico di Milano
.. Algoritmo di Floyd-Warshall Permette di determinare i cammini minimi tra tutte le coppie di nodi s, t anche in presenza di archi di costo negativo. N.B.: Se il grafo contiene circuiti di costo totale negativo, il problema non è ben definito! Esempio s -6 costo: - t L algoritmo di Floyd-Warshall permette di individuare l esistenza di circuiti di costo negativo E. Amaldi Fondamenti di R.O. Politecnico di Milano
Algoritmo di Floyd-Warshall input output Grafo orientato G = (N, A) descritto mediante la matrice n x n dei costi c ij. Per ogni coppia di nodi i, j N, il costo d ij di un cammino minimo da i a j. Struttura dati: due matrici n x n De P di cui gli elementi rappresentano al termine dell algoritmo d ij = costo di un cammino minimo da i a j p ij = predecessore di j nel cammino minimo da i a j E. Amaldi Fondamenti di R.O. Politecnico di Milano
E. Amaldi Fondamenti di R.O. Politecnico di Milano 6 8-9 Esempio D 9 8-6 P Algoritmo di Floyd-Warshall Per (i, j) A si pone d ij = c ij, per gli auto-anelli d ii = e per (i, j) A si pone d ij = La matrice dei predecessori viene inizializzata con p ij = i n.b.: da a e da a.
Ciclo h= : Per ogni coppia di nodi i, j (compreso casi i=j) si controlla se per andare da i a j conviene passare per h (=): d i + d j < d ij = c ij Operazione triangolare relativa al nodo h: Poiché non esistono tali archi, le matrici D e P rimangono invariate - 6 8 9 E. Amaldi Fondamenti di R.O. Politecnico di Milano 5 i d ih h d ij d hj j
E. Amaldi Fondamenti di R.O. Politecnico di Milano 6 D P 9 8-6 -7 - Per andare da a conviene passare per : d = mentre il cammino (,) (,) è di costo d + d = = -7 Il costo d viene rimpiazzato col costo del nuovo cammino d +d Poiché il predecessore di nel nuovo cammino è si pone p = Ciclo h= :
E. Amaldi Fondamenti di R.O. Politecnico di Milano 7 D P 9-8 - 6-7 - Per andare da a conviene passare per : d = mentre il cammino (,) (,) è di costo d + d = 8 = - Poiché il predecessore di nel nuovo cammino è si pone p = Il costo d viene rimpiazzato col costo del nuovo cammino d +d
- Per andare da a conviene passare per : d = 9 mentre il cammino (,) (,) è di costo d + d = + 6 = 7 Riguardo gli auto-anelli, si nota che passando per il cammino da a se stesso risulta di costo - = - 9 < d = Esiste quindi un circuito ( ) di costo negativo! Alla fine del ciclo h = le matrici dei costi e dei predecessori sono: D 8 6 7-7 - - -9 P E. Amaldi Fondamenti di R.O. Politecnico di Milano 8
Algoritmo di Floyd-Warshall BEGINg FOR i:= TO n DO FOR j:= TO n DO p ij := i; END-FOR END-FOR FOR h:= TO n DO /* operazione triangolare su h */ FOR i:= TO n WITH i h DO FOR j:= TO n WITH j h DO IF (d ih + d hj < d ij ) THEN d ij = d ih + d hj ; Operazione triangolare: p ij := p hj ; Si aggiorna d ij se dal punto di END-IF vista del costo risulta più END-FOR conveniente raggiungere j da i passando per h END-FOR FOR i:= TO n DO IF d ii < THEN STOP; END-IF /* un circuito negativo */ END-FOR END-FOR END E. Amaldi Fondamenti di R.O. Politecnico di Milano 9
Si può verificare (per induzione su h) che l algoritmo di Floyd-Warshall è esatto Complessità Nel caso peggiore l operazione triangolare viene eseguita su tutti i nodi h ( che sono n ) e per ogni coppia di nodi i e j ( che sono n ) Complessità totale: O(n ) E. Amaldi Fondamenti di R.O. Politecnico di Milano
Esercizio Determinare i cammini minimi tra tutte le coppie di nodi del seguente grafo: - 5-7 8 E. Amaldi Fondamenti di R.O. Politecnico di Milano