Camminimi fra tutte le coppie Algoritmo di Floyd

  • Slides: 20
Download presentation
Camminimi fra tutte le coppie: Algoritmo di Floyd e Warshall e Algoritmo di Johnson

Camminimi fra tutte le coppie: Algoritmo di Floyd e Warshall e Algoritmo di Johnson

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Punto della situazione

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Punto della situazione • Visita BFS: albero dei camminimi per grafi non pesati. Complessità O(m+n) • Algoritmo di Dijkstra: albero dei camminimi per tutti i grafi che non contengono archi di peso negativo. Complessità O(m + n log n) (con Heap di Fibonacci). Si noti che quest’ultima è la più efficiente delle implementazioni presentate, poiché: • • m + n log n = O(n 2) (liste/array non ord. ), in quanto m = O(n 2) e n log n = o(n 2) m + n log n = O(m log n) (heap binari/binomiali), in quanto m = o(m log n) e n log n = O(m log n) • Algoritmo di Bellman&Ford: albero dei camminimi per tutti i grafi che non contengono cicli negativi. Complessità Θ(n·m) (con liste di adiacenza). • Algoritmo basato sull’ordinamento topologico: albero dei camminimi in grafi diretti aciclici. Complessità Θ(n+m) (con liste di adiacenza).

distanza fra tutte le coppie: soluzioni semplici • grafi non pesati: – eseguo n

distanza fra tutte le coppie: soluzioni semplici • grafi non pesati: – eseguo n volte visita BFS: – tempo O(mn) • grafi con pesi non negativi: – eseguo n volte Dijkstra: – tempo: O(mn+n 2 log n) • grafi con pesi qualsiasi (senza cicli negativi) – eseguo n volte Bellman-Ford – tempo: O(mn 2)

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmo di Floyd

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmo di Floyd e Warshall (camminimi tra tutte le coppie di nodi per tutti i grafi che non contengono cicli negativi) 4 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Approccio • Elegante

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Approccio • Elegante applicazione della tecnica della programmazione dinamica • Supponiamo di enumerare i vertici di G da 1 a n, cioè V={v 1, v 2, … vn}. Un cammino minimo k-vincolato da x a y è un cammino di costo minimo tra tutti i cammini da x a y che usano come vertici intermedi un sottoinsieme (anche vuoto) dei vertici Ik={v 1, v 2, … vk}. v 2 1 7 x=v 1 1 y=v 4 4 3 v 3 Tra x e y, il cammino minimo: • 0 -vincolato è lungo + • 1 -vincolato è lungo + • 2 -vincolato è lungo 8: <x, v 2, y>; • 3 -vincolato è lungo 5: <x, v 2, v 3, y>; • 4 -vincolato (ovvero senza vincoli) è lungo 5. • Idea di Floyd e Warshall: calcolare camminimi kvincolati per k=1, …, n 5 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Relazioni tra distanze

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Relazioni tra distanze vincolate k • Sia dxy il costo di un cammino minimo k-vincolato da x a y. Chiaramente, valgono le seguenti proprietà: 0 – dxy = w(x, y) se (x, y) E, +∞ altrimenti k-1 k – d xv = d e d = d xvk vkx k n – dxy= dxy • Per le proprietà di cui sopra e per la proprietà di minimalità dei sottocammini di camminimi, si ha: L’algoritmo calcola dxy dal basso verso l’alto, incrementando k da 0 a n 6 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Pseudocodice Tempo di

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Pseudocodice Tempo di esecuzione: (n 3) (sia con liste di adiacenza che con matrice di adiacenza) D: Come si confronta con l’applicazione ripetuta di Dijkstra? R: Utilizzando gli Heap di Fibonacci, n applicazioni dell’algoritmo di Dijkstra richiederanno tempo O(n (m+n log n)) = O(n m+n 2 log n) = O(n 3). Quindi, Dijkstra è più efficiente. Tuttavia, si applica solo su un sottoinsieme delle istanze ammissibili per F&W. 7 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano e se G

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano e se G contiene un ciclo di peso negativo posso accorgermene? Esercizio: pensarci… 8 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 9 Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Copyright ©

Algoritmi e strutture dati 9 Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Applicare l’algoritmo di

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Applicare l’algoritmo di Floyd e Warshall al seguente grafo: v 1 5 v 2 v 4 -4 -1 3 v 3 5 v 5 -1 10 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Soluzione v 1

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Soluzione v 1 Posso applicare F&W? Sì, non ci sono cicli negativi! Inizializziamo la matrice delle distanze: D 0 = D 1 = D 2 = D 3 = D 4 = D 5 = 11 5 v 2 v 4 -4 -1 3 v 3 5 v 5 -1 Copyright © 2004 - The Mc. Graw - Hill Companies, srl

Algoritmo di Johnson Idea: rendere i pesi non negativi e poi applicare n volte

Algoritmo di Johnson Idea: rendere i pesi non negativi e poi applicare n volte l’algoritmo di Dijkstra

rendere i pesi non negativi: un primo tentativo A -3 C A -3 0

rendere i pesi non negativi: un primo tentativo A -3 C A -3 0 1 0 B -2 C 4 aggiungo =3 D funziona? B 3 0 no: non preservo i camminimi! 1 D Idea: aggiungere un valore opportuno al peso di tutti archi. cammini con un # diverso di archi cambiano costo in modo diverso

rendere i pesi non negativi: un primo tentativo A cammino minimo fra Ae. C

rendere i pesi non negativi: un primo tentativo A cammino minimo fra Ae. C -3 C A cammino 0 minimo fra Ae. C -3 0 1 0 B -2 C 4 aggiungo =3 D funziona? B 3 no: non preservo i camminimi! 1 D Idea: aggiungere un valore opportuno al peso di tutti archi. cammini con un # diverso di archi cambiano costo in modo diverso

un modo migliore per ri-pesare gli archi: aggiungere pesi sui nodi Dato un grafo

un modo migliore per ri-pesare gli archi: aggiungere pesi sui nodi Dato un grafo pesato G=(V, E, w) e una funzione h: V R per ogni arco (u, v) E, definiamo un nuovo peso: wh(u, v)=w(u, v) + h(u)-h(v) u w(u, v) h(u) v u wh(u, v)= w(u, v)+h(u)-h(v) notazione: d(u, v): distranza da u a v in G=(V, E, w) dh(u, v): distranza da u a v in G=(V, E, wh) v

Lemma Un cammino p=<v 1, v 2, …, vk> è minimo in G=(V, E,

Lemma Un cammino p=<v 1, v 2, …, vk> è minimo in G=(V, E, w) se e solo è minimo in G=(V, E, wh) dim wh(p) = = = k-1 w (v , v i=1 h i k-1 i+1) ( w(v , v i=1 i k-1 w(v , v i=1 i i+1) + h(vi) -h(vi+1) ) + k-1 ( h(v ) -h(v i=1 i i+1) ) = w(p) + h(v 1) - h(vk) dh(u, v)=d(u, v)+h(u)-h(v)

scegliere h() in modo da rendere i pesi non negativi per ogni arco (u,

scegliere h() in modo da rendere i pesi non negativi per ogni arco (u, v) E , vorremmo: wh(u, v) 0 w(u, v) + h(u)-h(v) 0 h(v) h(u) + w(u, v) ricorda qualcosa? …la condizione di Bellman: d(s, v) d(s, u) + w(u, v)

calcolare h() assunzione: G non ha cicli di peso negativo 0 aggiungo una sorgente

calcolare h() assunzione: G non ha cicli di peso negativo 0 aggiungo una sorgente fittizia s s 0 calcolo le distanze da s 0 e le uso come funzione h() -3 -4 0 0 A -3 0 -3 1 d(s, v) d(s, u) + w(u, v) C D -5 0 B 1 1 -2 G=(V, E, w) Nota: per ogni arco (u, v): A B 0 C G=(V, E, wh) 0 0 D i pesi degli archi sono non negativi e i camminimi fra tutte le coppie sono preservati! wh(u, v) 0

Algoritmo di Johnson input: G=(V, E, w) %assunzione: G non ha cicli negativi output:

Algoritmo di Johnson input: G=(V, E, w) %assunzione: G non ha cicli negativi output: distanze in G=(V, E, w) fra tutte le coppie 1. costruisci G’=(V’, E’) aggiungendo un nodo s e tutti gli archi (s, v), v V di peso 0 2. Usa l’alg. di Bellman-Ford per trovare le distanze in G’=(V’, E’, w) da s e assegnale ad h(); ovvero: h(v)= d(s, v) v V 3. Calcola le distanze fra tutte le coppie in G=(V, E, wh) usando n volte l’alg. di Dijkstra 4. for each u, v V, do 1. calcola la distanza in G=(V, E, w) da u a v: d(u, v)=dh(u, v)-h(u)+h(v) 5. return (la matrice del)le distanze d(u, v) u, v V Complessità: O(mn + n 2 log n)

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Sommario grafico Universo

Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Sommario grafico Universo dei grafi Grafi non pesati: BFS Grafi senza cicli negativi: BF, FW e J Grafi senza archi negativi: Dijkstra 20 Grafi aciclici: ordinamento topologico Copyright © 2004 - The Mc. Graw - Hill Companies, srl