Problema del cammino minimo

Documenti analoghi
Cammini Minimi. Algoritmo di Dijkstra

Algoritmi e strutture dati

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Grafi diretti. Un grafo diretto (o grafo orientato) G è una coppia (V,E) dove. V è u n i n s i e m e d i nodi (o vertici);

Grafi (orientati): cammini minimi

Cammini minimi in grafi:

Algoritmi e Strutture Dati

Grafi (orientati): cammini minimi

Cammini minimi. Definizioni. Distanza fra vertici. Proprietà dei cammini minimi. Algoritmi e Strutture Dati

Esempi. non. orientato. orientato

Algoritmi e Strutture Dati

Problemi, istanze, soluzioni

Visite in Grafi BFS e DFS

Grafi: visita generica

COMPLEMENTI DI SHORTEST-PATH. ASD Fabrizio d'amore

Sommario. Rappresentazione dei grafi. Ordinamento topologico. Visita in ampiezza Visita in profondità

Progettazione di algoritmi

Minimo albero di copertura

Cammini minimi fra tutte le coppie

Algoritmo basato su cancellazione di cicli

Problema dell albero di cammini minimi (SPT, Shortest Path Tree) o problema dei cammini minimi :

Progettazione di Algoritmi

2.2 Alberi di supporto di costo ottimo

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Grafi e reti di flusso

Algoritmi e Strutture Dati Grafi. Daniele Loiacono

Il problema del commesso viaggiatore

2.3 Cammini ottimi. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

2.2 Alberi di supporto di costo ottimo

Grafi: definizioni e visite

Grafi: ordinamento topologico

Progettazione di Algoritmi

Algoritmi e Strutture Dati

Ottimizzazione nella Gestione dei Progetti - Esercitazione 1: calcolo degli schedule ottimi

Grafi: visite. Una breve presentazione. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Appunti del corso di Informatica 1 (IN110 Fondamenti) 7 Grafi e alberi: introduzione

Introduzione ai grafi

Grafi pesati Minimo albero ricoprente

Algoritmi e Strutture Dati

Progettazione di Algoritmi

Strutture dati per insiemi disgiunti

Alberi di copertura. Mauro Passacantando. Dipartimento di Informatica Largo B. Pontecorvo 3, Pisa

UNIVERSITÀ DEGLI STUDI ROMA TRE Corso di Studi in Ingegneria Informatica Ricerca Operativa 1 Seconda prova intermedia 20 giugno 2014

Problemi di ordinamento

Algoritmi e Strutture Dati

Gestione della produzione e della supply chain Logistica distributiva

Algoritmi e Strutture di Dati (3 a Ed.) Algoritmo dei tre indiani. Alan Bertossi, Alberto Montresor

Algoritmi e Strutture Dati (Mod. B) Algoritmi su grafi Ricerca in profondità (Depth-First Search) Parte III

UNIVERSITÀ DEGLI STUDI ROMA TRE Corso di Studi in Ingegneria Informatica Ricerca Operativa 1 Seconda prova intermedia 17 giugno 2013

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Algoritmi e Strutture Dati

Quarto allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

11.4 Chiusura transitiva

AMPL Problemi su Reti

Introduzione. Il routing permette la comunicazione tra due nodi differenti anche se non sono collegati direttamente

Routing IP. IP routing

Esercizi su alberi binari

GRAFI. Cosa sono Grafi non orientati Grafi orientati Grafi pesati Alberi Automi!

Progettazione di algoritmi

4c. Esercizi sul livello di Rete Instradamento in Internet

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Dati e Algoritmi 1: A. Pietracaprina. Grafi (II parte)

Esame di Ricerca Operativa del 03/09/2015

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Capitolo 5. Algoritmi di ricerca su grafo. 5.1 Algoritmi di ricerca su grafo

Minimo sottografo ricoprente. Minimo sottografo ricoprente. Minimo albero ricoprente. Minimo albero ricoprente

Esame di Ricerca Operativa del 11/07/2016

Dai ponti di Königsberg al postino cinese

Fondamenti di Internet e Reti

Esercizi di Algoritmi e Strutture Dati

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

IL PROBLEMA DEL FLUSSO DI COSTO MINIMO. DANIEL BUCCARELLA

Terzo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Depth-first search. Visita in profondità di un grafo Algoritmo Esempio Complessità dell algoritmo Proprietà Ordinamento topologico

Ricerca Operativa Cammini minimi: algoritmi di Bellman-Ford e di Dijkstra

Introduzione ai grafi. Introduzione ai grafi p. 1/2

Esame di Ricerca Operativa del 15/01/2015

Esame di Ricerca Operativa del 15/01/2015

Transcript:

Algoritmi e Strutture di Dati II Problema del cammino minimo Un viaggiatore vuole trovare la via più corta per andare da una città ad un altra. Possiamo rappresentare ogni città con un nodo e ogni collegamento tra due città con un arco etichettato con la distanza che separa le due città. Tra tutti i cammini che collegano le due città interessate, scegliamo quello più corto.

Algoritmi e Strutture di Dati II 3 Problema del cammino minimo Un grafo diretto pesato è u n a t r i p l a G =(V,E,w) ove(v,e) èun grafo diretto e w : E! R è una funzione peso che associa ad ogni arco un peso (o costo) reale. Il peso di un cammino è la somma dei pesi dei propri archi; la lunghezza di un cammino è il numero di archi del cammino; collega i due nodi. Dati due nodi u e v, uncammino minimo tra due nodi è, se esiste, un cammino di peso minimo che li collega. La distanza tra due nodi è il peso del cammino minimo che collega i due nodi.

Algoritmi e Strutture di Dati II 4 Varianti del problema Cammino minimo tra due nodi: dati due nodi u e v, trovare un cammino minimo da u e v; Cammino minimo con una sorgente: dato un nodo sorgente s, trovare, per ogni nodo del grafo v, un cammino minimo da s a v; Cammino minimo con una destinazione: dato un nodo destinazione d, trovare, per ogni nodo del grafo v, un cammino minimo da v a d; Cammino minimo per tutte le coppie di nodi: per ogni coppia di nodi u, v del grafo trovare un cammino minimo da u a v.

Algoritmi e Strutture di Dati II 0 3 3 4 4 6 3 3 8 4 6

Algoritmi e Strutture di Dati II 6 4 3 3 4 6 8 0 3 3 6

Algoritmi e Strutture di Dati II Proprietà del cammino minimo La proprietà della sottostruttura ottimale afferma che un cammino minimo contiene altri cammini minimi al suo interno. Teorema Sia p = hv 0,v,...,v k i un cammimo minimo da v 0 a v k e p i,j il sottocammino di p da v i a v j. Allora p i,j è un cammino minimo da v i a v j. Osservazione Un cammino minimo è un cammino semplice, cioè non contiene cicli.

Algoritmi e Strutture di Dati II 8 Rappresentazione del cammino minimo Sia G =(V,E,w) un grafo pesato e s una sorgente di G. Per ogni nodo v raggiungibile dalla sorgente s, rappresentiamo un solo cammino minimo da s a v. Scriviamo nella variabile º[v] il predecessore di v lungo il cammino minimo rappresentato dalla sorgente s a v. º[v] è nil se v = s oppure se non esiste alcun cammino minimo da s a v. Inoltre scriviamo nella variabile d[v] una stima (per eccesso) del peso del cammino minimo che va da s a v.

Algoritmi e Strutture di Dati II 9 Rappresentazione del cammino minimo Il sottografo G º =(V º,E º ) tale che: V º = {v V : º[v] 6= nil}[{s} e E º = {(º[v],v) E : º[v] 6= nil} è d e t t o albero dei cammini minimi con radice s. Per ogni nodo v V º, l unico cammino in G º da s a v corrisponde ad un cammino minimo in G da s a v.

Algoritmi e Strutture di Dati II 0 Inizializza Initialize(G,s) : for all v V [G] do : d[v] 3: º[v] nil 4: end for : d[s] 0 Il costo è Θ(n), con n = V.

Algoritmi e Strutture di Dati II Rilassa Relax(G,u,v) : if d[u]+w(u, v) <d[v] then : d[v] d[u] +w(u, v) 3: º[v] u 4: end if d[u] u s w(u,v) d[v] v

Algoritmi e Strutture di Dati II Algoritmo di Bellman-Ford L algoritmo risolve il problema del cammino minimo con una sorgente e pesi reali (possibilmente negativi). L algoritmo ritorna false se esiste un ciclo di peso negativo raggiungibile dalla sorgente. In questo caso, non tutti i cammini minimi dalla sorgente esistono. Altrimenti, l algoritmo ritorna true e, per ogni nodo v, calcola un cammino minimo dalla sorgente s a v e il suo peso.

Algoritmi e Strutture di Dati II 3 Algoritmo di Bellman-Ford L idea dell algoritmo è la seguente:. inizializzo i predecessori e le stime per ogni nodo;. ripeto, per n volte, il rilassamento di tutti gli archi; 3. se esiste qualche stima che può essere ulteriormente migliorata, allora il grafo contiene un ciclo di peso negativo raggiungibile da s, e quindi ritorno false; altrimenti ritorno true.

Algoritmi e Strutture di Dati II 4 Algoritmo di Bellman-Ford Bellman-Ford(G,s) : n V [G] : Initialize(G, s) 3: for i to n do 4: for all (u, v) E[G] do : Relax(G, u, v) 6: end for : end for 8: for all (u, v) E[G] do 9: if d[u]+w(u, v) <d[v] then 0: return false : end if : end for 3: return true

Algoritmi e Strutture di Dati II t x s 6 8 4 3 0 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 6 t x 6 6 s 0 8 4 3 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II t x 6 6 4 s 0 8 4 3 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 8 t x s 4 6 8 4 3 0 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 9 t x s 4 6 8 4 3 0 9 y z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 0 t x s 6 8 4 3 0 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II t x s 6 6 8 4 3 0 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II t x s 6 4 6 8 4 3 0 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 3 t x 6 4 s 0 8 4 3 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 4 t x s 4 6 8 4 3 0 9 y z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II t x 6 4 s 0 8 4 3 y 9 z E[G] = {(t,x),(t,y),(t,z),(x,t),(y,x),(z,x),(z,s),(s,t),(s,y)}

Algoritmi e Strutture di Dati II 6 Complessità Bellman-Ford(G,s) : n V [G] : Initialize(G, s) 3: for i to n do 4: for all (u, v) E[G] do : Relax(G, u, v) 6: end for : end for 8: for all (u, v) E[G] do 9: if d[u]+w(u, v) <d[v] then 0: return false : end if : end for 3: return true

Algoritmi e Strutture di Dati II. la fase di inizializzazione costa Θ(n);. il primo ciclo for costa (n ) m Θ() = Θ(nm); 3. il secondo ciclo for costa Θ(m); Quindi in totale il costo di Bellman-Ford è Θ(n + m + nm) =Θ(nm) cioè Θ(n 3 ) qualora il grafo sia denso.

Algoritmi e Strutture di Dati II 8 Grafi diretti aciclici (DAG) Supponiamo di avere un grafo G =(V,E,w) diretto e aciclico (DAG) con pesi reali (possibilmente negativi). Essendo G aciclico, esso non contiene cicli di peso negativo, quindi tutti i cammini minimi esistono e l algoritmo di Bellman-Ford ritorna true. Ordiniamo topologicamente i nodi del grafo, e inseriamo in E gli archi in quest ordine: prima tutti gli archi (in ordine qualsiasi) uscenti dal primo nodo in ordine topologico, poi tutti gli archi uscenti dal secondo nodo in ordine topologico, e così via. Ora lanciamo Bellman-Ford sul grafo G. Cosa succede?

Algoritmi e Strutture di Dati II 9 Bellman-Ford(G,s) : n V [G] : Initialize(G, s) 3: for i to n do 4: for all (u, v) E[G] do : Relax(G, u, v) 6: end for : end for 8: for all (u, v) E[G] do 9: if d[u]+w(u, v) <d[v] then 0: return false : end if : end for 3: return true

Algoritmi e Strutture di Dati II 30 0 3 6 4

Algoritmi e Strutture di Dati II 3 6 0 4 3

Algoritmi e Strutture di Dati II 3 6 0 6 4 3

Algoritmi e Strutture di Dati II 33 6 0 6 6 4 4 3

Algoritmi e Strutture di Dati II 34 6 0 6 4 4 3

Algoritmi e Strutture di Dati II 3 6 0 6 3 4 3

Algoritmi e Strutture di Dati II 36 6 0 6 3 4 3

Algoritmi e Strutture di Dati II 3 In sostanza, posso suddividere i grafi diretti pesati sui numeri reali in tre categorie in funzione del comportamento di Bellman-Ford su tali grafi:. grafi aciclici: in questo caso, ordinando opportunamente gli archi, Bellman-Ford raggiunge uno stato stabile in un passo;. grafi ciclici privi di cicli negativi: in questo caso Bellman-Ford raggiunge uno stato stabile in k passi, con k n ; 3. grafi ciclici con cicli negativi: in questo caso Bellman-Ford non raggiunge mai uno stato stabile.

Algoritmi e Strutture di Dati II 38 DAG-Shortest-Paths(G,s) : Initialize(G, s) : TopologicalSort(G, S) 3: while S 6= ; do 4: u Pop(S) : for all v Adj[u] do 6: Relax(G, u, v) : end for 8: end while

Algoritmi e Strutture di Dati II 39 Complessità la fase di inizializzazione costa Θ(n); l ordinamento topologico costa Θ(n + m); durante il ciclo while, faccio n di estrazioni dalla pila, ognuna con costo costante. Quindi il costo di tutte le estrazioni risulta Θ(n); durante il ciclo while, chiamo m volte la procedura Relax. Tale procedura ha costo costante, quindi il costo di tutti i rilassamenti ammonta a Θ(m).

Algoritmi e Strutture di Dati II 40 Il costo di DAG-Shortest-Paths è dunque Θ(3n +m) =Θ(n + m) contro Θ(nm) nel caso di Bellman-Ford.

Algoritmi e Strutture di Dati II 4 Algoritmo di Dijkstra L algoritmo di Dijkstra risolve il problema del cammino minimo con una sorgente e pesi reali non negativi. Dunque assumiamo che w(u, v) 0 per ogni arco (u, v) del grafo. L algoritmo mantiene un insieme S, inizialmente vuoto, che contiene i nodi terminati (per i quali un cammino minimo è già stato calcolato), e un insieme Q = V \ S di nodi ancora da scoprire.

Algoritmi e Strutture di Dati II 4 Fino a quando Q contiene qualche elemento, l algoritmo: estrae da Q il nodo u più vicino alla sorgente (cioè con la più piccola stima della distanza dalla sorgente); aggiunge u a S; rilassa tutti gli archi che escono da u. L insieme Q viene implementato con una coda con priorità basata sul minimo. Ogni nodo v viene inserito nella coda con priorità pari a d[v].

Algoritmi e Strutture di Dati II 43 Algoritmo di Dijkstra Dijkstra(G,s) : Initialize(G, s) : S ; 3: Q V [G] 4: while Q 6= ; do : u ExtractMin(Q) 6: S S [{u} : for all v Adj[u] do 8: Relax(G, u, v) 9: end for 0: end while

Algoritmi e Strutture di Dati II 44 0 t x s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 4 0 t 0 x s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 46 0 t x 8 4 s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 4 0 t 8 x 3 s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 48 0 t 8 x 9 s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 49 0 t 8 x 9 s 0 3 9 6 4 y z

Algoritmi e Strutture di Dati II 0 Complessità Dijkstra(G,s) : Initialize(G, s) : S ; 3: Q V [G] 4: while Q 6= ; do : u ExtractMin(Q) 6: S S [{u} : for all v Adj[u] do 8: Relax(G, u, v) 9: end for 0: end while

Algoritmi e Strutture di Dati II la fase di inizializzazione costa Θ(n); la crazione del min-heap implicita nell istruzione Q V [G] costa Θ(n); durante il ciclo while, faccio n estrazioni del minimo. Ogni estrazione costa Θ(log n), quindi il costo di tutte le estrazioni risulta Θ(n log n); durante il ciclo while, chiamo m volte la procedura Relax. Durante la chiamata di Relax(G, u, v), la stima d[v] puòessere aggiornata. Questo implica la chiamata implicita di ModifyKey che costa Θ(log n). Quindi il costo di tutti i rilassamenti ammonta a Θ(m log n).

Algoritmi e Strutture di Dati II Il costo di Dijkstra è dunque Θ(n + n log n + m log n) =Θ((n + m) log n) contro Θ(nm) nel caso di Bellman-Ford. Se m> n log n n log n allora Dijkstra è da preferire. In particolare, se m n, Dijkstraè più veloce.

Algoritmi e Strutture di Dati II 3 Dijkstra e BFS Dijkstra è un algoritmo greedy: ad ogni passo, esso inserisce in S il nodo più vicino alla sorgente s. Inoltre, se associamo un peso unitario ad ogni arco, Dijkstra simula la procedura BFS che visita in ampiezza un grafo a partire da una sorgente. I nodi vengono visitati in ampiezza e inseriti in S una volta scoperti. Un cammino di peso minimo corrisponde ad un cammino di lunghezza minima. L albero dei cammini di peso minimo corrisponde al BF-albero dei cammini di lunghezza minima.

Algoritmi e Strutture di Dati II 4 t x s 0 y z

Algoritmi e Strutture di Dati II t x s 0 y z

Algoritmi e Strutture di Dati II 6 t x s 0 y z

Algoritmi e Strutture di Dati II t x s 0 y z

Algoritmi e Strutture di Dati II 8 t x s 0 y z

Algoritmi e Strutture di Dati II 9 t x s 0 y z

Algoritmi e Strutture di Dati II 60 Ricostruzione dei cammini minimi PrintPath(G, s, v) : if v = s then : print s 3: else 4: if º[v] =nil then : print no path exists 6: else : P rintp ath(g, s, º[v]) 8: print v 9: end if 0: end if