una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e...

26
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati Cammini minimi in grafi: una trilogia

Transcript of una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e...

Page 1: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

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

Cammini minimi in grafi: una trilogia

Page 2: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Cammini minimi in grafi: Episodio III: la fine della trilogia

Page 3: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

…nelle puntate precedenti

• Input: – grafo pesato G=(V,E,w), sV

• Output: – albero dei cammini minimi radicato in s e/o le

distanze di tutti i nodi da s, ovvero, dG(s,v) per ogni vV

A

B

C E

D

s

2

4

1

2

2

2 4

Page 4: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

…nelle puntate precedenti

• Input: – grafo pesato G=(V,E,w), sV

• Output: – albero dei cammini minimi radicato in s e/o le

distanze di tutti i nodi da s, ovvero, dG(s,v) per ogni vV

A

B

C E

D

s

2

4

1

2

2

2 4

0

2

3 5

4

Page 5: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Nelle puntate precedenti:

• Visita BFS: albero dei cammini minimi per grafi non pesati. Tempo: O(m+n).

• Algoritmo di Dijkstra: grafi con pesi non negativi. Tempo: O(m+n log n) con heap di Fibonacci. Altre implementazioni meno efficienti: – O(n2) - con array/liste non ordinate – O(m log n) con heap binari/binomiali

• Algoritmo di Bellman-Ford: cammini minimi per grafi con pesi qualsiasi (senza cicli negativi). Tempo O(mn) – con liste di adiacenza.

• Algoritmo basato sull’ord. topologico: albero dei cammini minimi per DAG con pesi qualsiasi. Tempo O(m+n).

Page 6: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Cammini minimi fra tutte le coppie: Algoritmo di Floyd e Warshall e

Algoritmo di Johnson

Page 7: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

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+n2 log n)

• grafi con pesi qualsiasi (senza cicli negativi) – eseguo n volte Bellman-Ford

– tempo: O(mn2)

Page 8: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Algoritmo di Floyd e Warshall (cammini minimi fra tutte le coppie di

nodi per grafi senza cicli negativi)

Page 9: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Approccio • Elegante applicazione della tecnica della programmazione dinamica

• Numeriamo i vertici di G da 1 a n, cioè V={v1, v2, … 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 qualsiasi (anche vuoto) dei vertici Ik={v1, v2, … vk}.

• Idea di Floyd e Warshall (sottoproblemi): calcolare cammini minimi k-vincolati per k=0,1,…, n

v1

3

1

7 4 1

v2

v3 v4

x

y

tra x e y il cammino minimo

0-vincolato è lungo +

1-vincolato è lungo +

2-vincolato è lungo 8: <x,v2,y>

3-vincolato è lungo 5: <x,v2,v3,y> 4-vincolato (ovvero senza vincoli) è lungo 5: <x,v2,v3,y>

Page 10: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Relazioni tra distanze vincolate

L’algoritmo calcola dxy incrementando k da 0 a n

• Sia dxy il costo di un cammino minimo k-vincolato da x a y. Valgono le seguenti proprietà: – dxy= w(x,y) se (x,y)E, +∞ altrimenti

– d

= d

e

d = d

– dxy= dxy

k

0

k-1

• Per le proprietà di cui sopra e per la proprietà di minimalità dei sottocammini di cammini minimi, si ha:

n

k k k-1 xvk xvk vkx vkx

d = min {d , d + d } k k-1 k k xy xy xvk vky

= min {d , d + d } k-1 k-1 k-1 xy xvk vky

k

cammino minimo k-vincolato non passa

per vk

passa per vk

vk

x y

Page 11: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Pseudocodice

Tempo di esecuzione: (n3) (sia con liste di adiacenza che con matrice di adiacenza)

D: Meglio dell’applicazione ripetuta di Dijkstra? R: Utilizzando gli Heap di Fibonacci, n applicazioni dell’algoritmo di Dijkstra richiedono tempo O(mn+n2 log n) = O(n3). Quindi, Dijkstra è più efficiente. Però si applica solo su un sottoinsieme delle istanze ammissibili per F&W.

D: Meglio di B&F ripetuto n volte? R: Sì! O(n3)=O(mn2)

Page 12: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

e se G contiene un ciclo di peso negativo posso

accorgermene?

Esercizio: pensarci…

Page 13: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Esempio: applicare l’algoritmo di Floyd e Warshall al seguente grafo:

v1

v2

v4

v3

v5

5 -1

3 -4 5

-1

Page 14: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Posso applicare F&W?

Sì, non ci sono cicli negativi! Inizializziamo la matrice delle distanze:

D0 =

01

0

503

40

150

D2 =

01

0

503

40

150

1

1

D1 =

01

0

503

40

150

D3 =

01

0

5103

40

42120

D4 =

01

0

5103

40

42120

D5 =

01

0

5103

40

42120

v1

v2

v4

v3

v5

5 -1

3 -4 5

-1

Page 15: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Algoritmo di Johnson

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

riferimento: capito 25 del libro Introduzione agli algoritmi e strutture dati,

di Cormen, Leiserson, Rivest, Stein McGraw-Hill

Page 16: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

rendere i pesi non negativi: un primo tentativo

A

C D

B

1

-3

-2 -3 0

cammini con un # diverso di archi cambiano costo in

modo diverso

Idea: aggiungere un valore opportuno al peso di tutti archi.

aggiungo =3

A

C D

B

4

0

1 0 3

funziona?

no: non preservo i cammini minimi!

Page 17: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

rendere i pesi non negativi: un primo tentativo

A

C D

B

1

-3

-2 -3 0

cammini con un # diverso di archi cambiano costo in

modo diverso

Idea: aggiungere un valore opportuno al peso di tutti archi.

aggiungo =3

A

C D

B

4

0

1 0 3

funziona?

no: non preservo i cammini minimi!

cammino minimo fra

A e C

cammino minimo fra

A e C

Page 18: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

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

notazione:

d(u,v): distranza da u a v in G=(V,E,w)

per ogni arco (u,v)E, definiamo un nuovo peso:

wh(u,v)=w(u,v) + h(u)-h(v)

dh(u,v): distranza da u a v in G=(V,E,wh)

w(u,v)

h(u) h(v)

u v

wh(u,v)= w(u,v)+h(u)-h(v)

u v

Page 19: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

wh(p) = wh(vi,vi+1) i=1

k-1

dh(u,v)=d(u,v)+h(u)-h(v)

Un cammino p=<v1,v2, …, vk> è minimo in G=(V,E,w) se e solo è minimo in G=(V,E,wh)

Lemma

dim

= ( w(vi,vi+1) + h(vi) -h(vi+1) ) i=1

k-1

= w(vi,vi+1) + ( h(vi) -h(vi+1) ) i=1

k-1

i=1

k-1

= w(p) + h(v1) - h(vk)

Page 20: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

scegliere h() in modo da rendere i pesi non negativi

…la condizione di Bellman:

ricorda qualcosa?

per ogni arco (u,v)E , vorremmo:

w(u,v) + h(u)-h(v) 0

wh(u,v) 0

h(v) h(u) + w(u,v)

d(s,v) d(s,u) + w(u,v)

Page 21: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

calcolare h()

A

C D

B

1

-3

-2 -3 0

i pesi degli archi sono non negativi e i cammini minimi

fra tutte le coppie sono preservati!

A

C D

B

0

0

0 1 1

G=(V,E,wh)

s 0

0 0 0

G=(V,E,w)

aggiungo una sorgente fittizia s

calcolo le distanze da s

0

0 -3

-5 -4

assunzione: G non ha cicli di peso negativo

Nota: per ogni arco (u,v):

d(s,v) d(s,u) + w(u,v) wh(u,v) 0

e le uso come funzione h()

Page 22: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Algoritmo di Johnson

O(mn + n2log n)

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), vV 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) vV

3. Calcola le distanze fra tutte le coppie in G=(V,E,wh) usando n volte l’alg. di Dijkstra

4. for each u,vV, 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,vV

Complessità:

Page 23: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Sommario grafico

Universo dei grafi

Grafi senza cicli negativi: BF, FW e J

Grafi senza archi negativi: Dijkstra

Grafi aciclici: ordinamento topologico

Grafi non pesati:BFS

Page 24: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

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

…to be continued…

Page 25: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Esercizio

Page 26: una trilogia - mat.uniroma2.itguala/06_FloydWarshall_2016.pdf · Introduzione agli algoritmi e strutture dati, di Cormen, Leiserson, Rivest, Stein McGraw-Hill . rendere i pesi non

Esercizio