La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi e Strutture dati Mod B Grafi: Percorsi Minimi (parte I)

Presentazioni simili


Presentazione sul tema: "Algoritmi e Strutture dati Mod B Grafi: Percorsi Minimi (parte I)"— Transcript della presentazione:

1 Algoritmi e Strutture dati Mod B Grafi: Percorsi Minimi (parte I)

2 Grafi: Percorsi minimi Un percorso minimo in un grafo G= grafo pesato orientato, con funzione di peso w: E che mappa archi in pesi a valori reali tra due vertici s e v, è un percorso da s a v tale che la somma dei pesi degli archi che formano il percorso sia minima v s

3 Percorsi minimi: pesi negaivi w xy v u Qualè il percorso minimo tra u e x nel grafo sottostante? Percorso Peso …... Non esiste alcun percorso minimo tra u e x!

4 Grafi: Percorsi minimi Lemma 1: Dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali, sia p= il percorso minimo tra v 1 e v k e per ogni i e j con 1 i j k, sia p ij = un sottopercorso di p tra v i e v j. Allora, p ij = è un percorso minimo tra v i e v j. Proprietà di sottostruttura ottima (per dimostrazione vedere Cormen)

5 Grafi: Percorsi minimi Corollario 1: Sia G = (V, E) un grafo pesato orientato, con funzione di peso w: E che mappa archi in pesi a valori reali. Supponiamo che un percorso minimo p dalla sorgente s ad un veritce v possa essere decomposto in s u v per qualche vertice u e percorso p. Allora, il peso del percorso minimo tra s e v è (s,v)= (s,u) + w(u,v). p Lemma 2: Dato un grafo pesato orientato G = (V, E), con funzione di peso w: E, e un vertice sorgente s, allora per ogni arco (u,v) in E vale (s,v) (s,u) + w(u,v). Per dimostrazioni vedere Cormen

6 Albero dei percorsi minimi Definizione: Sia G = (V, E) un grafo pesato orientato, con funzione di peso w: E che mappa archi in pesi a valori reali. Un albero dei percorsi minimi con radice s è un sottografo orientato G = (V, E) di G con V V e E E e tale che: ¶ V è linsieme di vertici raggiungibili da s · G forma un albero radicato in s ¸ per ogni v V, lunico percorso semplice da s a v è un percorso minimo.

7 Grafi: Percorsi minimi Peso unitario Breadth First Search Pesi non negativi Algoritmo di Dijkstra Pesi non negativi con cicli non negativi Algoritmo di Bellman-Ford Cicli negativi Nessuna soluzione

8 Grafi: Percorsi minimi (Dijkstra) Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali.

9 Il peso di un percorso p = (v 1, v 2,..., v k ) è w(v i, v i+1 ). i=1 k-1 Il peso del percorso lungo gli archi rossi è = 12. Grafi: Percorsi minimi (Dijkstra) Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali.

10 Problema del percorso minimo da una singola sorgente: dato un ver- tice s, per ogni vertice v V trovare un percorso minimo da s a v. Grafi: Percorsi minimi (Dijkstra) Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Il peso di un percorso p = (v 1, v 2,..., v k ) è w(v i, v i+1 ). i=1 k-1

11 Lalgoritmo di Dijkstra risol- ve il problema in modo effi- ciente nel caso in cui tutti i pesi siano non-negativi, come nellesempio del grafo. Grafi: Percorsi minimi (Dijkstra) Problema del percorso minimo da una singola sorgente: dato un ver- tice s, per ogni vertice v V trovare un percorso minimo da s a v.

12 Lalgoritmo di Dijkstra risolve il problema in modo efficiente nel caso in cui tutti i pesi siano non-negativi, come nellesem- pio del grafo. - Utilizza un campo d[v] con la stima della distanza minima - Utilizza un campo p[v] con il nodo predecessore di v Grafi: Percorsi minimi (Dijkstra) Problema del percorso minimo da una singola sorgente: dato un ver- tice s, per ogni vertice v V trovare un percorso minimo da s a v.

13 Sottografo dei predecessori (Dijkstra) Lalgoritmo di Dijkstra sul grafo G= costruisce in p[] il sottografo dei predecessori denotato con G p =, dove: V p = { v V : p [v] Nil} {s} E p = { (p [v],v) E : v V p - {s} } Il sottografo dei predecessori è definito come per BFS La differenza è che ora verrà costruito in modo che i percorsi che individua siano quelli con peso minimo (non col numero minimo di archi) Si dimostra che il sottografo dei predecessori costruito dallalgoritmo di Dijkstra è un albero dei percorsi minimi

14 Grafi: Percorsi minimi (Dijkstra) Inizializzazione del grafo 1 La stima distanza d[s] viene posta a 0 2 Tutte le altre stime delle disanze d[v]) sono posti a Inizializza(G,s)

15 La stima distanza d[s] viene posta a 0 2 Tutte le altre stime delle disanze d[v]) sono posti a 3 I predecessori p[v] sono posti a Nil Grafi: Percorsi minimi (Dijkstra) Inizializzazione del grafo 0 Inizializza(G,s)

16 Grafi: Percorsi minimi (Dijkstra) Meccanismo di aggiustamento (diminuzione) progressivo delle stime d[v] delle distanze minime tra s e gli altri nodi v. Rilassamento degli archi Utilizza la funzione di peso w e si applica agli archi del grafo. Modifica sia d[v] che p[v].

17 Rilassamento 1 3 v u v u 4 Relax(u,v,w) 1 8 z u z u 9 Relax(u,z,w) 1 1 x u Relax(u,x,w) 1 1 x u u x z v u x z v

18 Rilassamento 2 4 v u v u 4 Relax(u,v,w) u v z u v z 2 2 z u z u 4 Relax(u,z,w)

19 Rilassamento Verifica se è possibile ottenere un percorso migliore tra s e v passando per il vetice u d[v]: estremo superiore della lunghezza del percorso minimo tra s a v (s è la sorgente) p[v]: il vertice predecessore di v nel percorso minimo corrente tra s e v (padre di v) w(u,v): peso dellarco (u,v) Relax(u,v,w) if d[v] > d[u] + w(u,v) then d[v] = d[u] + w(u,v) p[v] = u

20 Rilassamento: proprietà Lemma 3: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali e sia (u,v) E. Allora, immediatamente dopo un rilas- samento di (u,v) ( Relax(u,v,w) ), otteniamo che d[v] d[u] + w(u,v).

21 Rilassamento: proprietà Lemma 4: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e il grafo sia inizializzato con una chiamata a Inizializza(G,s). Allora, vale d[v] (s,v) per ogni vertice v di G e tale invariante viene mantenuto lungo ogni sequenza di operazioni di rilassamento. Inoltre, appena d[v] = (s,v), d[v] non cambia più.

22 Rilassamento: proprietà Corollario 2: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Suppeoniamo che in G non esistano percorsi tra s e un vertice v. Allora dopo che grafo è stato inizializzato con Inizializza(G,s), vale d[v] = (s,v) e questa uguaglianza viene mantenuto lungo ogni sequenza di operazioni di rilassamento.

23 Rilassamento: proprietà Lemma 5: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e s u v sia un percorso minimo per qualche u,v V. Il grafo sia inizializzato con una chiamata a Inizializza(G,s) e venga applicata una sequenza di operazioni di rilassamento che includa Relax(u,v,w). Se, d[u] = (s,u) in qualunque momento prima della chiamata, allora vale d[v] = (s,v) sempre dopo la chiamata.

24 Rilassamento e percorsi minimi Lemma 6: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali e sia s la sorgente. Allora, dopo che il grafo è stato inizializzato con una chiamata a Inizializza(G,s), il sottografo dei predecessori G p forma un albero con radice s, e qualunque sequenza di opra- zioni di rilassamento su G mantiene questa proprietà.

25 Rilassamento e percorsi minimi Lemma 7: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e G non contenga cicli di peso negativo. Il grafo sia inizializzato con una chiamata a Inizializza(G,s) e venga applicata una sequenza di operazioni di rilassamento che includa Relax(u,v,w) tale che d[v] = (s,v). Allora il sottografo dei predecessori G p è un albero di cammini minimi con radice s.

26 Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Utilizza anche, per ogni ver- tice v non in S, un campo d[v] contenente ad ogni passo lestremo superiore del peso del percorso minimo da s a v. Grafi: Percorsi minimi (Dijkstra)

27 Lalgoritmo seleziona a turno il vertice u in V – S col minimo valore d[u], inserisce u in S, e rilassa tutti gli archi uscenti da u. Grafi: Percorsi minimi (Dijkstra) Utilizza anche, per ogni ver- tice v non in S, un campo d[v] contenente ad ogni passo lestremo superiore del peso del percorso minimo da s a v. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

28 s Inizialmente: S = { } v d Inizializza una coda a priorità con tutti i vertici e i loro estremi superiori d[]. Sia 1 il vertice sorgente. Grafi: Percorsi minimi (Dijkstra) Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

29 s v d Seleziona il vertice u V – S con il minimo valore d[v], inserisce u in S,... Grafi: Percorsi minimi (Dijkstra) Inizialmente: S = { }. Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

30 s v d... rimuovi u dalla coda, inserisci u in S, S = (qui manteniamo la stima con il vertice in S) Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

31 s S = v d... e rilassa gli archi uscenti da u. 1 0 Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

32 s S = v d... riordina la coda rispetto alle nuove stime. 1 0 Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

33 s Ripeti... Grafi: Percorsi minimi (Dijkstra) S = v d 1 0 Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

34 s S = v d... rimuovi dalla coda e inserisci in S Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

35 s S = v d... rilassa gli archi Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

36 s S = v d... e riordina la coda Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

37 s S = v d Ripeti... Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

38 s S = v d rimuovi dalla coda e inserisci in S Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

39 s S = v d Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente.... rilassa gli archi... Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

40 s S = v d Grafi: Percorsi minimi (Dijkstra)... e riordina la coda... Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

41 s S = v d Grafi: Percorsi minimi (Dijkstra) Ripeti... Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

42 s S = v d Grafi: Percorsi minimi (Dijkstra)... rimuovi dalla coda e inserisci in S Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

43 s S = v d Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente.... rilassa gli archi... Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

44 s S = v d e riordina la coda (nessun cam- biamento in questo caso)... Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

45 s S = v d Grafi: Percorsi minimi (Dijkstra) Ripeti... Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

46 s S = v d Grafi: Percorsi minimi (Dijkstra)... rimuovi dalla coda e inserisci in S Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

47 s S = v d rilassa gli archi (nessun cam- biamento in questo caso)... Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

48 s S = v d Grafi: Percorsi minimi (Dijkstra) Ripeti... Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

49 s S = v d Fatto! Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

50 s S = Il risultato è la riga in basso che contiene in ciascuna cella la lunghezza del percorso minimo dal nodo s al nodo indicato nella riga sopra. v d Grafi: Percorsi minimi (Dijkstra) Sia 1 il vertice sorgente. Lalgoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati.

51 s S = Per calcolare i percorsi corris- pondenti, utilizziamo il campo p[v], che contiene il predeces- sore v lungo il percorso minimo. v d p Grafi: Percorsi minimi (Dijkstra)

52 s S = Utilizzando il predecessore p[v], si può facilmente ricostruire il percorso fino a v, procedendo allindietro da v a s. v d p Grafi: Percorsi minimi (Dijkstra)

53 s S = Es., v = 6. v d p Grafi: Percorsi minimi (Dijkstra)

54 s S = Es., v = 6. p(6) = 5, v d p Grafi: Percorsi minimi (Dijkstra)

55 s S = Es., v = 6. p(6) = 5, p(5) = 3, v d p Grafi: Percorsi minimi (Dijkstra)

56 s S = Es., v = 6. p(6) = 5, p(5) = 3, p(3) = 1. v d p Grafi: Percorsi minimi (Dijkstra)

57 s S = v d p Percorso: 1, 3, 5, 6. Peso: 4. Grafi: Percorsi minimi (Dijkstra) Es., v = 6. p(6) = 5, p(5) = 3, p(3) = 1.

58 Lalgoritmo di Dijkstra Dijkstra(G,s) Inizializza(G,s) S = Q = V(G) while ( Q ) u = Delete_Min(Q) S = S {u} for each vertice v adiecente a u relax(u,v,w) Coda di priorità

59 Lalgoritmo di Dijkstra Dijkstra(G,s) Inizializza(G,s,d) S = Q = V(G) while ( Q ) u = Delete_Min(Q) S = S {u} for each vertice v adiecente a u relax(u,v,w) Coda di priorità Relax(u,v,w) if d[v] > d[u] + w(u,v) then Decrase_key(d[v], d[u] + w(u,v)) p[v] = u Operazione riduzione del valore di un elemento

60 Tempo di esecuzione: Dijkstra Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min quante volte viene eseguita?

61 Tempo di esecuzione: Dijkstra Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte.

62 Tempo di esecuzione: Dijkstra Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte.

63 Tempo di esecuzione: Dijkstra Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte. Tempo totale = |V| T + |E| T Delete_minDecrease_key

64 Tempo di esecuzione: Dijkstra Decrease_key Coda a priorità T T Total time Array non ordinato Heap binario Delete_min Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte. Tempo totale = |V| T + |E| T Delete_minDecrease_key

65 Tempo di esecuzione: Dijkstra O(|V|) O(1) Decrease_key Coda a priorità T T Total time Array non ordinato Heap binario Delete_min Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte. Tempo totale = |V| T + |E| T Delete_minDecrease_key

66 Tempo di esecuzione: Dijkstra O(|V| 2 ) O(log |V|) O(|V|) O(1) Decrease_key Coda a priorità T T Total time Array non ordinato Heap binario Delete_min Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte. Tempo totale = |V| T + |E| T Delete_minDecrease_key

67 Tempo di esecuzione: Dijkstra O(E log |V|) O(|V|) O(1) Decrease_key Coda a priorità T T Total time Array non ordinato Heap binario Delete_min O(|V| 2 ) O(log |V|) Tempo di esecuzione: verifichiamo il tempo in relazione a differenti implementazioni della coda di priorità. Differenti implementazioni danno differenti costi per le operazioni sulla coda. Delete_Min viene eseguita O(|V|) volte. Decrease_key viene eseguita O(|E|) volte. Tempo totale = |V| T + |E| T Delete_minDecrease_key

68 Algoritmo di Dijkstra: correttezza Teorema: Se eseguiamo lalgoritmo di Dijkstra su un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali non-negativi, e un vertice sor- gente s, allora, alla terminazione, d[u] = (s,u) per tutti i vertici u in V.

69 Rilassamento: proprietà Lemma 4: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e il grafo sia inizializzato con una chiamata a Inizializza(G,s). Allora, vale d[v] (s,v) per ogni vertice v di G e tale invariante viene mantenuto lungo ogni sequenza di operazioni di rilassamento. Inoltre, appena d[v] = (s,v), d[v] non cambia più.

70 Rilassamento: proprietà Corollario 2: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Suppeoniamo che in G non esistano percorsi tra s e un vertice v. Allora dopo che grafo è stato inizializzato con Inizializza(G,s), vale d[v] = (s,v) e questa uguaglianza viene mantenuta lungo ogni sequenza di operazioni di rilassamento.

71 Rilassamento: proprietà Lemma 5: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e s u v sia un percorso minimo per qualche u,v V. Il grafo sia inizializzato con una chiamata a Inizializza(G,s) e venga applicata una sequenza di operazioni di rilassamento che includa Relax(u,v,w). Se, d[u] = (s,u) in qualunque momento prima della chiamata, allora vale d[v] = (s,v) sempre dopo la chiamata.

72 Algoritmo di Dijkstra: correttezza Dimostrazione: Dimostriamo che per ogni u V, quando u viene inserito in S, vale d[u] = (s,u). Procedamo per contraddizione. Sia u il primo nodo per cui d[u] (s,u) quando viene inserito in S. Considerando la sitazione allinizio del while quando u viene inserito in S ottenendo la contraddizione d[u] = (s,u), esaminando il percorso minimo da s a u. Sappiamo che: 1 u s poiché d[s] = 0 = (s,s) allinizio del loop. 2 Ma allora deve pure valere anche S prima che u sia inserito. 3 Ci deve essere un percorso da s a u altrimenti d[u] = = (s,u) per il Corollario 2, e quindi contraddizione. 4 Se cè un percorso, cè anche un percorso minimo p.

73 Algoritmo di Dijkstra: correttezza Dimostrazione: Sia u il primo nodo per cui d[u] (s,u) quando viene inserito in S. Sappiamo che: 1 u s 2 S 3 Cè un percorso da s a u. 4 Cè un percorso minimo p. p connette un nodo in S con un nodo (u) in V-S Sia y il primo in V-S di p e x il suo predecessore. p può essere scomposto in s x y u y x s u S V-SV-S p1p1 p2p2 p1p1 p2p2

74 Algoritmo di Dijkstra: correttezza Dimostrazione: Possiamo asserire che quando u è inserito in S, vale d[y] = (s,y). Infatti sappiamo che u è il primo nodo per cui d[u] (s,u), quando viene inserito in S. x appartiene ad S, quindi avevamo d[x] = (s,x) quando è stato inserito in S. Ma lalgoritmo allora rilassa larco (x,y). Quindi per il Lemma 5, deve essere d[y] = (s,y), dopo la chiamata a Relax(x,y,w). y x s u S V-SV-S p1p1 p2p2

75 Algoritmo di Dijkstra: correttezza Dimostrazione: Possiamo ora ottenere la nostra contrad- dizione. Poiché y compare nel percorso minimo tra s e u e i pesi (ed in particolare quelli in p 2 ) sono tutti non-negativi, (s,y) (s,u) e inoltre d[y] = (s,y) (s,u) d[u] (Lemma 4) Poiché sia u che y sono in V-S quando u viene estratto dalla coda (linea 5), vale anche d[u] d[y]. Cioè d[y] = d[y], e quindi d[y] = (s,y) = (s,u) = d[u]. (contraddizione!) y x s u S V-SV-S p1p1 p2p2 Lemma 4 ci garantisce inoltre che luguaglianza vale sempre dopo linserimento di u in S.

76 Algoritmo di Dijkstra: correttezza 2 Corollario: Se eseguiamo lalgoritmo di Dijkstra su un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali non-negativi, e un vertice sor- gente s, allora, alla terminazione il sottografo dei predecessori G p corrisponde allalbero dei percorsi minimi con radice s.

77 Rilassamento e percorsi minimi Lemma 6: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali e sia s la sorgente. Allora, dopo che il grafo è stato inizializzato con una chiamata a Inizializza(G,s), il sottografo dei predecessori G p forma un albero con radice s, e qualunque sequenza di opra- zioni di rilassamento su G mantiene questa proprietà.

78 Rilassamento e percorsi minimi Dimostrazione: Per dimostrare il lemma è necessario dimostrare che: sempre G p è un grafo aciclico; sempre esiste almeno un percorso da s a v V p ; sempre esiste al più un percorso da s a v V p. Dimostreremo solo la prima, per la dimostra- zione delle altre due vedere Cormen

79 Rilassamento e percorsi minimi Dimostrazione: Dimostriamo che G p è sempre un albero (cioè G p è un grafo aciclico). Appena eseguita linizializzazione la proprietà è ov- viamente vera (unico nodo in G p è s). Sia stata eseguita una sequenza di rilassamenti. Supponiamo che lultimo rilassamento abbia intro- dotto un ciclo (dove v k =v 0 ). Possiamo assumere che sia stato il rilassamento dellarco (v k-1,v k ) ad creare il ciclo. (perché?) - Tutti i nodi del ciclo sono raggigibili da s. Infatti, ogni nodo v i nel ciclo ha predecessore p[v i ] non- Nil quindi questi nodi ha valore finito di d[v i ] quando p[v i ] viene assegnato. Per Lemma 4 ogni v i ha percorso minimo finito, quindi è raggiungibile da s.

80 Rilassamento e percorsi minimi Dimostrazione: Supponiamo che lultimo rilassamento abbia introdotto un ciclo (dove v k =v 0 ). Possiamo assumere che sia stato il rilassamento dellarco (v k-1,v k ) ad creare il ciclo. (perché?) - Tutti i nodi del ciclo sono raggigibili da s. Appena prima del rilassamento di (v k-1,v k ) abbiamo che p[v i ]=v i-1 per i=1,…,k-1 e lultimo assegnamento di d[v i ] è stato d[v i ] = d[v i-1 ] + w(v i-1,v i ). Se d[v i-1 ] è cambiato da allora, può solo essere diminuito. Allora prima del rilassamento certamente vale d[v i ] d[v i-1 ] + w(v i-1,v i ) per i=1,…,k-1 Poiché p[v k ] viene assegnato, prima del rilassamento deve valere d[v k ] > d[v k-1 ] + w(v k-1,v k ). Sommando le due disuguaglianse otteniamo

81 Rilassamento e percorsi minimi Dimostrazione: Supponiamo che lultimo rilassamento abbia introdotto un ciclo (dove v k =v 0 ). Possiamo assumere che sia stato il rilassamento dellarco (v k-1,v k ) ad creare il ciclo. (perché?) - Tutti i nodi del ciclo sono raggigibili da s. Appena prima del rilassamento di (v k-1,v k ) abbiamo che d[v i ] d[v i-1 ] + w(v i-1,v i ) per i=1,…,k-1 d[v k ] > d[v k-1 ] + w(v k-1,v k ). Sommando le due disuguaglianze otteniamo Perché ogni vertice del ciclo occorre una sola volta in ogni sommatoria Contraddizione!

82 Rilassamento e percorsi minimi Lemma 7: Sia dato un grafo pesato orientato G = (V, E), con funzione di peso w: E che mappa archi in pesi a valori reali. Sia s la sorgente e G non contenga cicli di peso negativo. Il grafo sia inizializzato con una chiamata a Inizializza(G,s) e venga applicata una sequenza di operazioni di rilassamento che includa Relax(u,v,w) tale che d[v] = (s,v). Allora il sottografo dei predecessori G p è un albero di cammini minimi con radice s.

83 Rilassamento e percorsi minimi Dimostrazione: Per dimostrare il lemma è necessario dimostrare che: V p contiene solo vertici raggiungibili da s; G p è un albero con radice s; i percorsi in G p sono percorsi minimi da s a v V p. Dimostreremo solo la terza, per la dimostrazione delle altre due vedere Cormen

84 Rilassamento e percorsi minimi Dimostreremo solo la terza: Sia p= un percorso in G p, dove v 0 =s e v k =v. Per i=1,…,k abbiamo le seguenti: d[v i ] = (s,v i ) d[v i ] d[v i-1 ] + w(v i-1,v i ) poiché se fosse minore, il predecessore di v i non in G p potrebbe certo essere v i-1. Ma allora possiamo concludere che w(v i-1,v i ) (s,v i ) - (s,v i-1 )

85 Rilassamento e percorsi minimi Dimostreremo solo la terza: Sia p= un percorso in G p, dove v 0 =s e v k =v. Ma allora possiamo concludere che w(v i-1,v i ) (s,v i ) - (s,v i-1 ) Calcoliamo il peso del percorso p. w(p ) = w(v i-1,v i ) i=1…k (s,v i ) - (s,v i-1 ) i=1…k serie telescopica (s,v k ) + (s,v 0 ) (s,v k ) poiché (s,v 0 )=0. Ma (s,v k ) è un limite per ogni percorso da s a v k. Quindi w(p) = (s,v k ).

86 Algoritmo di Dijkstra: correttezza 2 Dimostrazione Corollario: Conseguenza imme- diata del Teorema di correttezza e del Lemma 7.

87 Esercizio Trovare il percorso minimo da b ad ogni altro vertice c ef d b a c ef d b a 5 1 1


Scaricare ppt "Algoritmi e Strutture dati Mod B Grafi: Percorsi Minimi (parte I)"

Presentazioni simili


Annunci Google