• Non ci sono risultati.

Cammini minimi Cammini minimi

N/A
N/A
Protected

Academic year: 2021

Condividi "Cammini minimi Cammini minimi"

Copied!
45
0
0

Testo completo

(1)

Cammini minimi Cammini minimi

Damiano Macedonio mace@unive.it

(2)

Algoritmi e Strutture Dati 2

Copyright © 2010—2012, Moreno Marzolla, Università di Bologna, Italy (http://www.moreno.marzolla.name/teaching/ASD2011B/)

Modifications Copyright c 2015, Damiano Macedonio, Universita di Venezia, Italy

This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

(3)

Definizione del problema

Consideriamo un grafo orientato G=(V, E) in cui ad ogni arco e  E sia associato un costo w(e)

Il costo di un cammino π=(v0, v1, ... vk) che connette il vertice v0 con vk è definito come

Data una coppia di vertici v0 e vk, vogliamo trovare (se esiste) il cammino π*v0 vk di costo minimo tra tutti i

cammini che vanno da v0 a vk

w =

i=1 k

w v

i−1

, v

i

(4)

Algoritmi e Strutture Dati 4

Applicazioni dei cammini minimi

(5)

Applicazioni dei cammini minimi (oops!)

Cammino più breve tra Haugesund e Trondheim

Nel 2005 Nel 2010

(6)

Algoritmi e Strutture Dati 6

Diverse formulazioni del problema

Single-source shortest path

Determinare i cammini minimi da un vertice sorgente s a tutti i vertici raggiungibili da s

All-pairs shortest paths

Determinare i cammini minimi tra ogni coppia di vertici u, v tali che esista un cammino da u a v

Cammino minimo fra una singola coppia di vertici u e v

Determinare esclusivamente il cammino minimo π*uv

Nessun algoritmo conosciuto è in grado di risolvere il

problema del cammino minimo fra una singola coppia senza risolvere anche il problema dei cammini minimi da singola sorgente

(7)

Osservazione

In quali situazioni non esiste un cammino minimo?

Quando i vertici non sono connessi

Quando ci sono cicli di costo negativo a

b

c d e

a

b

c d e

Non esiste alcun cammino che connette a con e

1 -5 1

1 1 È sempre possibile

trovare un cammino di costo

inferiore che connette a con e

(8)

Algoritmi e Strutture Dati 8

Proprietà

(sottostruttura ottima)

Sia G=(V, E) un grafo orientato con funzione costo w;

allora ogni sottocammino di un cammino minimo in G è a sua volta un cammino minimo in G

Dimostrazione

Consderiamo un cammino minimo π*xy da x a y

Siano i e j due nodi intermedi

Dimostriamo che il sottocammino di πxy* che collega i e j è un cammino minimo tra i e j

x i j y

(9)

Proprietà

(sottostruttura ottima)

Supponiamo per assurdo che esista un cammino P' tra i e j di costo strettamente inferiore a P

Ma allora potremmo costruire un cammino tra x e y di costo inferiore a πxy*, il che è assurdo perché

avevamo fatto l'ipotesi che πxy* fosse il cammino di costo minimo

x i P j y

P'

x i j y

P'

w(P') < w(P)

(10)

Algoritmi e Strutture Dati 10

Esistenza

Sia G=(V, E) un grafo orientato con funzione peso w. Se non ci sono cicli negativi, allora fra ogni coppia di vertici connessi in G esiste sempre un cammino minimo

Dimostrazione

Possiamo sempre trasformare un cammino in un cammino semplice (privo di cicli)

Ogni volta che si rimuove un ciclo, il costo diminuisce (o resta uguale), perché non ci sono cicli negativi

Per trovare un cammino minimo possiamo restringere la ricerca ai cammini semplici (che sono in numero finito)

x i y x i y

(11)

Nota

D'ora in poi, assumiamo che nel grafo G non esistano cicli di lunghezza negativa

(12)

Algoritmi e Strutture Dati 12

Albero dei cammini minimi

Sia s un vertice prefissato di un grafo orientato pesato G=(V, E). Allora esiste un albero T che contiene i

vertici raggiungibili da s tale che ogni cammino in T sia un cammino minimo

Grazie alla proprietà di sottostruttura ottima, è sempre

possibile far “crescere” un albero parziale T' fino a includere tutti i vertici raggiungibili

s s

v v

u

u è il primo vertice in T' procedendo “a ritroso”

nel cammino πsv*

(13)

Distanza tra vertici in un grafo

Sia G=(V, E) un grafo orientato con funzione costo w.

La distanza dxy tra x e y in G è il costo di un cammino minimo che li connette; + se tale cammino non esiste

Nota: dvv = 0 per ogni vertice v

Nota: Vale la disuguaglianza triangolare

d

xy

= { w 

*xy

se esiste un cammino minimo 

*xy

∞ altrimenti

d

xz

d

xy

d

yz

(14)

Algoritmi e Strutture Dati 14

Algoritmo di Dijkstra

Consente di calcolare i

cammini minimi da singola sorgente nel caso in cui gli archi abbiano costo ≥ 0

Il grafo può contenere cicli, che per l'ipotesi sopra non possono avere lunghezza negativa

Edsger W. Dijkstra, (1930—2002)

http://en.wikipedia.org/wiki/Edsger_W._Dijkstra

(15)

Lemma (Dijkstra)

Sia G=(V, E) un grafo orientato con funzione costo w; i costi devono essere ≥0. Se T è un albero di cammini minimi radicato in s, ma che non include tutti i vertici raggiungibili da s, allora l'arco (u, v) con u  V(T) e v  V(T) che minimizza la quantità dsu + w(u,v)

appartiene ad un cammino minimo da s a v

(16)

Algoritmi e Strutture Dati 16

T

Dimostrazione

Supponiamo per assurdo che (u,v) non appartenga ad un cammino minimo tra s e v

quindi dsu + w(u,v) > dsv

Quindi deve esistere π*sv che porta da s in v senza passare per (u,v) con costo inferiore a dsu + w(u,v)

s

u v

x y

dsx

dsu 1

(17)

T

Dimostrazione

Per il teorema di sottostruttura ottima, il cammino πsv* si scompone in πsy* e πyv*

Quindi dsv = dsx + w(x,y) + dyv

s

u v

x y

dsx

dsu πsy*

πyv* 2

(18)

Algoritmi e Strutture Dati 18

T

Dimostrazione

Per ipotesi (lemma di Dijkstra), l'arco (u,v) è quello

che, tra tutti gli archi che collegano un vertice in T con uno non ancora in T, minimizza la somma dsu + w(u,v)

In particolare: dsu + w(u,v) ≤ dsx + w(x,y)

s

u v

x y

dsx

dsu πsy*

πyv* 3

(19)

Riassumiamo

Da (1) abbiamo dsu + w(u,v) > dsv

Da (2) abbiamo dsv = dsx + w(x,y) + dyv

Da (3) abbiamo dsu + w(u,v) ≤ dsx + w(x,y)

Combinando (1) (2) e (3) otteniamo

Assurdo! I pesi sono positivi, quindi d non è negativo

d

su

+ w (u , v) > d

sx

+ w( x , y)+d

yv

da (1) e (2)

d

sx

+ w( x , y)

d

su

+ w (u , v) da (3)

(20)

Algoritmi e Strutture Dati 20

Algoritmo di Dijkstra generico

algoritmo DijkstraGenerico(G, s)→albero inizializza D tale che

Dsv := + se v ≠ s Dss := 0

T := albero formato dal solo vertice s while (T ha meno di n nodi) do

Trova l'arco (u,v) incidente su T con Dsu + w(u,v) minimo Dsv := Dsu + w(u,v)

rendi u padre di v in T endfor

(21)

Esempio

A

B

D

C E

F

G 7

14 30

6 10

1

6

4 9

(22)

Algoritmi e Strutture Dati 22

Esempio

0

7

14 30

6 10

1

6

4 9

(23)

Esempio

0

7

14 30

6 10

1

6

4 9

(24)

Algoritmi e Strutture Dati 24

Esempio

0

7

7

14 30

6 10

1

6

4 9

(25)

Esempio

0

7

7

14 30

6 10

1

6

4 9

(26)

Algoritmi e Strutture Dati 26

Esempio

0

7

13

7

14 30

6 10

1

6

4 9

(27)

Esempio

0

7

13

7

14 30

6 10

1

6

4 9

(28)

Algoritmi e Strutture Dati 28

Esempio

0

7

13 14

7

14 30

6 10

1

6

4 9

(29)

Esempio

0

7

13 14

7

14 30

6 10

1

6

4 9

(30)

Algoritmi e Strutture Dati 30

Esempio

0

7

13 14

20

7

14 30

6 10

1

6

4 9

(31)

Esempio

0

7

13 14

20

7

14 30

6 10

1

6

4 9

(32)

Algoritmi e Strutture Dati 32

Esempio

0

7

13 14

20

23 7

14 30

6 10

1

6

4 9

(33)

Esempio

0

7

13 14

20

23 7

14 30

6 10

1

6

4 9

(34)

Algoritmi e Strutture Dati 34

Esempio

0

7

30

13 14

20

23 7

14 30

6 10

1

6

4 9

(35)

Algoritmo di Dijkstra

algoritmo Dijkstra(Grafo G=(V,E), nodo s)→albero for each u in V do Dsu :=  endfor

T := albero formato dal solo nodo s S := CodaPriorita di (nodi, costi);

Dss := 0;

S.insert(s,0);

while (not S.isEmpty()) do u := S.extractMin();

for each (u,v)E do if (Dsv = ) then

S.insert(v,Dsu + w(u,v));

Dsv := Dsu + w(u,v);

rendi u padre di v in T;

else if (Dsu + w(u,v) < Dsv)) then S.decreaseKey(v,Dsu + w(u,v));

Dsv := Dsu + w(u,v);

rendi u nuovo padre di v in T;

endif endfor endwhile

Rendi Dsu+w(u,v) il nuovo costo di v

(36)

Algoritmi e Strutture Dati 36

Analisi dell'algoritmo di Dijkstra

O(m log n) nel caso peggiore

Osservazione

Con un minimo di “astuzia” e una implementazione più efficiente della coda di priorità è possibile implementare l'algoritmo di Dijkstra in tempo O(m + n log n)

Vedere libro di testo (sezione 14.5.1) per i dettagli

(37)

Osservazione

Notare che la dimostrazione di correttezza funziona perché si assume che i pesi dei cammini (in

particolare, degli archi) non possono mai essere negativi

Esempio di funzionamento errato

Il cammino minimo da a→c non è (a,c) ma (a,b,c) che ha costo complessivo 1!

a

b

c 5

4

-4 0

5

4

-4 0

4 5

4

-4 0

5

4 5

4

-4

(38)

Algoritmi e Strutture Dati 38

Domanda

Sia G=(V, E) un grafo orientato con archi pesati, anche con pesi negativi; supponiamo che in G non esistano cicli negativi. Supponiamo di incrementare i pesi di

tutti gli archi di una costante C in modo che tutti i pesi risultanti siano non negativi.

L'algoritmo di Dijkstra applicato ai nuovi pesi

restituisce l'albero dei cammini minimi anche per i pesi originali?

(39)

Risposta: NO

a

b

c 5

4

-4

0

9

8

0 0

8 9

8

0 0

9

8 9

8

0 a

b

c 9

8

0

Aggiungo 4 ai pesi degli archi

a

b

c 9

8

0

(40)

Algoritmi e Strutture Dati 40

Algoritmo di Floyd e Warshall

Si può applicare a grafi orientati con costi arbitrari (anche negativi), purché non ci siano cicli negativi

Basato sulla programmazione dinamica

Sia V={v1, v2, … vn}

Sia dxyk la minima distanza per andare dal vertice x al vertice y, in cui si usano solo vertici in {v1, v2, … vk} (oltre eventualmente x e y)

La soluzione complessiva è dxyn per ogni coppia di vertici x e y

All-pair shortest paths

(41)

Algoritmo di Floyd e Warshall

Per andare da x a y usando solo vertici intermedi in {v1, … vk} (sempre che ciò sia possibile), ho due

alternative

Non passo mai per vk. La distanza in tal caso è dxyk-1

Passo per vk. Per la proprietà di sottostruttura ottima, la distanza in tal caso è dx vkk-1 + dvk yk-1

Quindi

d

kxy

= min { d

k−1xy

, d

xvk

k−1

d

v

k y k−1

}

(42)

Algoritmi e Strutture Dati 42

Inizializzazione

Posso calcolare dxy0 come

d

0xy

= { w x , y se  x , y∈E 0 se x= y

se  x , y∉E

dxy0 = minima distanza per andare da x a y senza passare per altri

nodi intermedi

(43)

Algoritmo di Floyd e Warshall

algoritmo FloydWarshall( G=(V,E) )→distanze inizializza Dxy0

for k := 1 to n do for each x  V do

for each y  V do Dxyk := Dxyk-1;

if (Dx vkk-1 + Dvk yk-1 < Dxyk ) then Dxyk := Dx vkk-1 + Dvk yk-1;

endif enefor endfor

endfor return Dn

Costo: tempo O(n3), spazio O(n3)

dkxy=min

{

dk −1xy , dxvk

k −1dv

k y k −1

}

(44)

Algoritmi e Strutture Dati 44

Esempio

A

B

D

C E

F

G 7

14 30

6 10

1

6

4 9

D = A B C D E F G A 0 7 14 30 Inf Inf Inf B Inf 0 6 Inf Inf Inf Inf C Inf Inf 0 Inf 1 Inf Inf D Inf Inf 10 0 Inf Inf Inf E Inf Inf Inf Inf 0 6 9 F Inf Inf Inf Inf Inf 0 4 G Inf Inf Inf Inf Inf Inf 0

(45)

Esempio

D = A B C D E F G A 0 7 13 30 14 20 23 B Inf 0 6 Inf 7 13 16 C Inf Inf 0 Inf 1 7 10 D Inf Inf 10 0 11 17 20 E Inf Inf Inf Inf 0 6 9 F Inf Inf Inf Inf Inf 0 4 G Inf Inf Inf Inf Inf Inf 0

0

7

30

13 14

20

23 7

14 30

6 10

1

6

4 9

Riferimenti

Documenti correlati

Infatti, il numero di utenti che può chiamare è enorme e ciascuno ha probabilità molto piccola di chiamare in [0; T ].. Dobbiamo stimare

Quando l’agenzia esamina una persona, ha di fronte una grandezza incognita X che rappresenta il valore VERO che quella dovrebbe pagare; prima che quella persona paghi, ha di

Trova questi oggetti nella tua casa e misurali con Quindi scrivi quanto sono lunghi.. Quanto

Una volta definiti gli articoli allocati sulla ci occuperemo di trovare la sequenza di prodotti da lanciare sulla linea, al fine di ridurre i tempi di cambio formato sul

Come applicazione della matrice d’adiacenza, ricaviamo alcune formule per il calcolo del numero di cammini e cicli di lunghezza fissata. 1 Numero di cammini in

Per gli stessi motivi esemplificati sopra, non si pu` o neanche definire un grafo dei cam- mini minimi in presenza di un massimo numero di hop. Infatti, il grafo dei cammini min-

● L'algoritmo di Bellman e Ford determina i cammini di costo minimo anche in presenza di archi con peso negativo. – Però non devono esistere cicli di

Infatti se si volesse risolvere la partizione in questo modo si avrebbe un algoritmo di complessit` a O(2 n n) che non sarebbe polinomiale nemmeno con la codifica unaria.. Infatti