La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Cammini minimi Moreno Marzolla

Presentazioni simili


Presentazione sul tema: "Cammini minimi Moreno Marzolla"— Transcript della presentazione:

1 Cammini minimi Moreno Marzolla http://www.moreno.marzolla.name/

2 Algoritmi e Strutture Dati2 Copyright © 2010, 2011, Moreno Marzolla, Università di Bologna, Italy (http://www.moreno.marzolla.name/teaching/ASD2010/) 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 Algoritmi e Strutture Dati3 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 π=(v 0, v 1,... v k ) che connette il vertice v 0 con v k è definito come ● Data una coppia di vertici v 0 e v k, vogliamo trovare (se esiste) il cammino π v0 vk * di costo minimo tra tutti i cammini che vanno da v 0 a v k

4 Algoritmi e Strutture Dati4 Applicazioni dei cammini minimi

5 Algoritmi e Strutture Dati5 Applicazioni dei cammini minimi (oops!) ● Cammino più breve tra Haugesund e Trondheim Nel 2005 http://blogs.sun.com/kevin/entry/microsoft_map_bug Nel 2010

6 Algoritmi e Strutture Dati6 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 Algoritmi e Strutture Dati7 Osservazione / 1 ● Il problema del MST è un problema differente – Es: il cammino minimo che collega h e i è (h, i) oppure (h, g, i) di peso 7 – In questo caso il cammino minimo non è un sottoinsieme del MST a b h i c g d f e 4 8 11 8 1 7 6 2 4 7 14 9 10 2

8 Algoritmi e Strutture Dati8 Osservazione / 2 ● In quali situazioni non esiste un cammino minimo? – Quando i vertici non sono connessi – Quando ci sono cicli di costo negativo a b cde a b cde Non esiste alcun cammino che connette a con e 1 -51 1 1 È sempre possibile trovare un cammino di costo inferiore che connette a con e

9 Algoritmi e Strutture Dati9 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 xijy

10 Algoritmi e Strutture Dati10 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 xijy P P' xijy w(P') < w(P)

11 Algoritmi e Strutture Dati11 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 xiyxiy

12 Algoritmi e Strutture Dati12 Nota ● D'ora in poi, assumiamo che nel grafo G non esistano cicli di lunghezza negativa

13 Algoritmi e Strutture Dati13 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 *

14 Algoritmi e Strutture Dati14 Distanza tra vertici in un grafo ● Sia G=(V, E) un grafo orientato con funzione costo w. La distanza d xy tra x e y in G è il costo di un cammino minimo che li connette; +  se tale cammino non esiste ● Nota: d vv = 0 per ogni vertice v ● Nota: Vale la disuguaglianza triangolare

15 Algoritmi e Strutture Dati15 Condizione di Bellman ● Per ogni arco (u, v) e per ogni vertice s, vale la seguente disuguaglianza ● Dimostrazione – Dalla disuguaglianza triangolare si ha – Ma risulta anche da cui la tesi

16 Algoritmi e Strutture Dati16 Trovare cammini minimi ● Dalla condizione di Bellman si può dedurre che l'arco (u, v) fa parte del cammino minimo π sv * se e solo se

17 Algoritmi e Strutture Dati17 Tecnica del rilassamento ● Supponiamo di mantenere una stima D xy ≥ d xy della lunghezza del cammino minimo tra x e y ● Effettuiamo dei passi di “rilassamento”, riducendo progressivamente la stima finché si ha D xy = d xy if (D xv + w(π vy ) < D xy ) then D xy := D xv + w(π vy )

18 Algoritmi e Strutture Dati18 Algoritmo di Bellman e Ford ● Consideriamo un cammino minimo inizialmente ignoto π s vk * = (s, v 1,... v k ) ● Sappiamo che da cui partendo da D ss = 0, potremmo effettuare i passi di rilassamento seguenti

19 Algoritmi e Strutture Dati19 Algoritmo di Bellman e Ford ● Problema: noi non conosciamo gli archi del cammino minimo π s vk * né il loro ordine, quindi non possiamo fare il rilassamento nell'ordine corretto ● Però se facciamo per ogni arco (u,v) sicuramente includeremo anche il primo passo di rilassamento “corretto” if (D su + w(u,v) < D sv ) then D sv := D su + w(u,v)

20 Algoritmi e Strutture Dati20 Algoritmo di Bellman e Ford ● Ad ogni passo consideriamo tutti gli m archi del grafo (u,v) ed effettuiamo (se necessario) l'operazione di rilassamento ● Dopo n iterazioni (tante quanti sono i vertici del grafo) siamo sicuri di aver calcolato tutti i valori D s vk corretti if (D su + w(u,v) < D sv ) then D sv := D su + w(u,v)

21 Algoritmi e Strutture Dati21 Algoritmo di Bellman e Ford algoritmo BellmanFord(G, s)→distanze inizializza D tale che D sv := +  se v ≠ s D ss := 0 for i := 1 to n do for each (u,v)  E do if ( D su + w(u,v) < D sv ) then D sv := D su + w(u,v) endif endfor ● Costo computazionale: O(nm)

22 Algoritmi e Strutture Dati22 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

23 Algoritmi e Strutture Dati23 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à d su + w(u,v) appartiene ad un cammino minimo da s a v

24 Algoritmi e Strutture Dati24 T Dimostrazione ● Supponiamo per assurdo che (u,v) non appartenga ad un cammino minimo tra s e v – quindi d su + w(u,v) > d sv ● Quindi deve esistere π sv * che porta da s in v senza passare per (u,v) con costo inferiore a d su + w(u,v) s uv xy dsxdsx dsudsu 1

25 Algoritmi e Strutture Dati25 T Dimostrazione ● Per il teorema di sottostruttura ottima, il cammino π sv * si scompone in π sy * e π yv * ● Quindi d sv = d sx + w(x,y) + d yv s uv xy dsxdsx dsudsu π sy * π yv * 2

26 Algoritmi e Strutture Dati26 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 d su + w(u,v) ● In particolare: d su + w(u,v) ≤ d sx + w(x,y) s uv xy dsxdsx dsudsu π sy * π yv * 3

27 Algoritmi e Strutture Dati27 Riassumiamo ● Da (1) abbiamo d su + w(u,v) > d sv ● Da (2) abbiamo d sv = d sx + w(x,y) + d yv ● Da (3) abbiamo d su + w(u,v) ≤ d sx + w(x,y) ● Combinando (1) (2) e (3) otteniamo Assurdo!

28 Algoritmi e Strutture Dati28 Algoritmo di Dijkstra generico algoritmo DijkstraGenerico(G, s)→albero inizializza D tale che D sv := +  se v ≠ s D ss := 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 D su + w(u,v) minimo D sv := D su + w(u,v) rendi u padre di v in T endfor

29 Algoritmi e Strutture Dati29 Esempio A B D CE F G 7 14 30 6 10 1 6 4 9

30 Algoritmi e Strutture Dati30 Esempio 0 ∞ ∞ ∞∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

31 Algoritmi e Strutture Dati31 Esempio 0 ∞ ∞ ∞∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

32 Algoritmi e Strutture Dati32 Esempio 0 7 ∞ ∞∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

33 Algoritmi e Strutture Dati33 Esempio 0 7 ∞ ∞∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

34 Algoritmi e Strutture Dati34 Esempio 0 7 ∞ 1313 ∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

35 Algoritmi e Strutture Dati35 Esempio 0 7 ∞ 1313 ∞ ∞ ∞ 7 14 30 6 10 1 6 4 9

36 Algoritmi e Strutture Dati36 Esempio 0 7 ∞ 1313 1414 ∞ ∞ 7 14 30 6 10 1 6 4 9

37 Algoritmi e Strutture Dati37 Esempio 0 7 ∞ 1313 1414 ∞ ∞ 7 14 30 6 10 1 6 4 9

38 Algoritmi e Strutture Dati38 Esempio 0 7 ∞ 1313 1414 2020 ∞ 7 14 30 6 10 1 6 4 9

39 Algoritmi e Strutture Dati39 Esempio 0 7 ∞ 1313 1414 2020 ∞ 7 14 30 6 10 1 6 4 9

40 Algoritmi e Strutture Dati40 Esempio 0 7 ∞ 1313 1414 2020 2323 7 14 30 6 10 1 6 4 9

41 Algoritmi e Strutture Dati41 Esempio 0 7 ∞ 1313 1414 2020 2323 7 14 30 6 10 1 6 4 9

42 Algoritmi e Strutture Dati42 Esempio 0 7 3030 1313 1414 2020 2323 7 14 30 6 10 1 6 4 9

43 Algoritmi e Strutture Dati43 Algoritmo di Dijkstra Vi ricorda qualcosa?

44 Algoritmi e Strutture Dati44 Algoritmo di Dijkstra algoritmo Dijkstra(Grafo G=(V,E), nodo s)→albero for each u in V do D su :=  endfor T := albero formato dal solo nodo s CodaPriorita S; D ss := 0; S.insert(s,0); while (not S.isEmpty()) do u := S.deleteMin(); for each (u,v)  E do if (D sv =  ) then S.insert(v,D su + w(u,v)); D sv := D su + w(u,v); rendi u padre di v in T; else if (D su + w(u,v) < D sv )) then S.decreaseKey(v,D su + w(u,v)); D sv := D su + w(u,v); rendi u nuovo padre di v in T; endif endfor endwhile return T; Rendi D su +w(u,v) il nuovo costo di v

45 Algoritmi e Strutture Dati45 Analisi dell'algoritmo di Dijkstra ● È pressoché identico all'algoritmo di Prim, e quindi ha lo stesso costo computazionale – 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

46 Algoritmi e Strutture Dati46 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 0 ∞ 4 5 4 0 5 4 5 4

47 Algoritmi e Strutture Dati47 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?

48 Algoritmi e Strutture Dati48 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

49 Algoritmi e Strutture Dati49 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={v 1, v 2, … v n } ● Sia d xy k la minima distanza per andare dal vertice x al vertice y, in cui si usano solo vertici in {v 1, v 2, … v k } (oltre eventualmente x e y) ● La soluzione complessiva è d xy n per ogni coppia di vertici x e y – All-pair shortest paths

50 Algoritmi e Strutture Dati50 Algoritmo di Floyd e Warshall ● Per andare da x a y usando solo vertici intermedi in {v 1, … v k } (sempre che ciò sia possibile), ho due alternative – Non passo mai per v k. La distanza in tal caso è d xy k-1 – Passo per v k. Per la proprietà di sottostruttura ottima, la distanza in tal caso è d x vk k-1 + d vk y k-1 ● Quindi

51 Algoritmi e Strutture Dati51 Inizializzazione ● Posso calcolare d xy 0 come d xy 0 = minima distanza per andare da x a y senza passare per altri nodi intermedi

52 Algoritmi e Strutture Dati52 Algoritmo di Floyd e Warshall algoritmo FloydWarshall( G=(V,E) )→distanze inizializza D xy 0 for k := 1 to n do for each x, y  V do D xy k := D xy k-1 ; if (D x vk k-1 + D vk y k-1 < D xy k ) then D xy k := D x vk k-1 + D vk y k-1 ; // rilassamento endif enefor endfor return D n ● Costo: tempo O(n 3 ), spazio O(n 3 )

53 Algoritmi e Strutture Dati53 Esempio A B D CE 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

54 Algoritmi e Strutture Dati54 Esempio D = 0 7 14 30 Inf Inf Inf Inf 0 6 Inf Inf Inf Inf Inf Inf 0 Inf 1 Inf Inf Inf Inf 10 0 Inf Inf Inf Inf Inf Inf Inf 0 6 9 Inf Inf Inf Inf Inf 0 4 Inf Inf Inf Inf Inf Inf 0 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 3030 1313 1414 2020 2323 7 14 30 6 10 1 6 4 9


Scaricare ppt "Cammini minimi Moreno Marzolla"

Presentazioni simili


Annunci Google