1 / 87

Algoritmi e Strutture dati Mod B

Algoritmi e Strutture dati Mod B. Grafi: Percorsi Minimi (parte I). 1. s. 5. 10. 1. 8. 3. 3. 2. 4. 1. 1. 3. 1. 4. 6. 5. 5. 2. v. Grafi: Percorsi minimi.

malina
Download Presentation

Algoritmi e Strutture dati Mod B

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 1 s 5 10 1 8 3 3 2 4 1 1 3 1 4 6 5 5 2 v Grafi: Percorsi minimi Un percorso minimo in un grafoG=<V,E> grafo pesato orientato, con funzione di peso w: E che mappa archi in pesi a valori realitra 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.

  3. -5 -2 w v 6 -4 8 u 7 -3 7 y x 9 Percorsi minimi: pesi negaivi Qual’è il percorso minimo tra u e x nel grafo sottostante? Percorso Peso <u,v,x> 2 <u,v,w,v,x> -5 <u,v,w,v,w,v,x> -12 <u,v,w,v,w,v,w,v,x> -19 … ... … ... 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=<v1,…,vk> il percorso minimo tra v1 e vk e per ogni i e j con 1 ij  k, siapij=<vi,…,vj> un sottopercorso di p tra vie vj. Allora, pij=<vi,…,vj> è un percorso minimo tra vi e vj. Proprietà di sottostruttura ottima (per dimostrazione vedere Cormen)

  5. 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 minimopdalla sorgentes 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’ Per dimostrazioni vedere Cormen Grafi: Percorsi minimi 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).

  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 orientatoG’ = (V’, E’) di G con V’ V eE’ E e tale che: • V’ è l’insieme di vertici raggiungibili da s • G’ forma un albero radicato in s • per ogni vV’ , l’unico 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. 1 5 10 1 8 3 2 4 3 1 1 3 1 4 6 6 5 2

  9. 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. 1 Il pesodi unpercorso p = (v1 , v2 , . . ., vk ) è w(vi , vi+1). 5 10 1 k-1 8 3 2 4 3 i=1 1 1 3 1 4 6 Il peso del percorso lungo gli archi rossi è 1 + 6 + 1 + 4 = 12. 6 5 2

  10. 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. 1 Il pesodi unpercorso p = (v1 , v2 , . . ., vk ) è w(vi , vi+1). 5 10 1 k-1 8 3 2 4 3 i=1 1 1 3 1 Problema del percorso minimo da una singola sorgente: dato un ver-tice s, per ogni vertice vVtrovare un percorso minimo da s a v. 4 6 6 5 2

  11. Grafi: Percorsi minimi (Dijkstra) Problema del percorso minimo da una singola sorgente: dato un ver-tice s, per ogni vertice vVtrovare un percorso minimo da s a v. 1 5 10 1 L’algoritmo di Dijkstrarisol-ve il problema in modo effi-ciente nel caso in cui tutti i pesi siano non-negativi, come nell’esempio del grafo. 8 3 2 4 3 1 1 3 1 4 6 6 5 2

  12. Grafi: Percorsi minimi (Dijkstra) Problema del percorso minimo da una singola sorgente: dato un ver-tice s, per ogni vertice vVtrovare un percorso minimo da s a v. 1 5 L’algoritmo di Dijkstrarisolve il problema in modo efficiente nel caso in cui tutti i pesi siano non-negativi, come nell’esem-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 10 1 8 3 2 4 3 1 1 3 1 4 6 6 5 2

  13. Sottografo dei predecessori (Dijkstra) • L’algoritmodi Dijkstra sul grafo G=<V,E>costruisce in p[] il sottografo dei predecessori denotato con Gp=<Vp,Ep>, dove: Vp={vV:p [v] Nil}{s} Ep={(p [v],v)E:vVp-{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 dall’algoritmo diDijkstra è un albero dei percorsi minimi

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

  15. Grafi: Percorsi minimi (Dijkstra) Inizializzazione del grafo 0 Inizializza(G,s) 1 1 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 5 10 1    8 3 2 4 3 1 1 3 1 4 6   6 5 2

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

  17. 0 5 10 1 v u u 1 u 1 u 1 8 3 10 1 5 z 3 8 1 1 1 3 1 4 6 v 5 z 10 x    Relax(u,v,w) Relax(u,z,w) Relax(u,x,w) 0 2 x 5 10 1 u 1 u 1 u 1 v u 8 3 1 9 4 3 8 1 z 1 v 4 z 9 x 2 1 3 1 4 6  2 2 x Rilassamento

  18. 0 5 10 1 u 2 u 2 v 8 3 1 9 4 4 2 1 1 3 1 v 4 z 11 4 6 z 11 Relax(u,v,w) Relax(u,z,w) 2 0 2 u 5 10 u 2 u 2 1 v 8 3 4 2 1 9 4 1 v 4 z 4 1 3 1 4 6 z 4 2 2 u Rilassamento

  19. Rilassamento Verifica se è possibile ottenere un percorso migliore tra sev passando per il vetice u • d[v]:estremo superiore della lunghezza del percorso minimotra sav (s è la sorgente) • p[v]:il vertice predecessore di v nel percorso minimo corrente tra sev (padre di v) • w(u,v):peso dell’arco (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 Gp 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 Gp è un albero di cammini minimi con radice s.

  26. 1 5 10 1 8 3 2 4 3 1 1 3 1 4 6 6 5 2 Grafi: Percorsi minimi (Dijkstra) L’algoritmo 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 l’estremo superiore del peso del percorso minimo da s a v.

  27. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. 1 5 Utilizza anche, per ogni ver-tice v non in S, un campo d[v] contenente ad ogni passo l’estremo superiore del peso del percorso minimo da s a v. 10 1 8 3 2 4 3 1 1 3 1 4 6 L’algoritmo seleziona a turno il vertice uin V – Scol minimo valore d[u], inserisce u in S, e rilassatutti gli archi uscenti da u. 6 5 2

  28. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 Inizialmente: S = { }. 5 10 1 v 6 2 3 4 5 1 8 3 2 4 3 d  0     1 1 3 1 4 6 Inizializza una coda a priorità con tutti i vertici e i loro estremi superiori d[]. 6 5 2

  29. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 Inizialmente: S = { }. 5 10 1 v 6 2 3 4 5 1 8 3 2 4 3 d  0     1 1 3 1 4 6 Seleziona il vertice uV – Scon il minimo valore d[v], inserisce u in S, . . . 6 5 2

  30. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 (qui manteniamo la stima con il vertice in S) 1 10 S = 1 0 8 3 2 4 v 3 6 2 3 4 5 1 d      1 3 1 4 6 . . . rimuovi u dalla coda, inserisci u in S,. . . 6 5 2

  31. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 1 10 S = 1 0 8 3 2 4 3 v 6 2 3 4 5 10 1 5 1   d 1 3 1 4 6 . . . e rilassa gli archi uscenti da u. 6 5 2

  32. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 1 10 S = 1 0 8 3 2 4 v 3 6 3 4 2 5 10 1 5   d 1 1 3 1 4 6 . . .riordina la coda rispetto alle nuove stime. 6 5 2

  33. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 1 10 S = 1 0 8 3 2 4 v 3 6 3 4 2 5 10 1 5   d 1 1 3 1 4 6 Ripeti . . . 6 5 2

  34. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 1 10 S = 1 1 0 8 3 2 4 v 3 6 4 2 5 10 5   d 1 1 3 1 4 6 . . . rimuovi dalla coda e inserisci in S 6 5 2

  35. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 1 10 S = 1 1 0 8 3 2 4 v 3 6 4 2 5 9 4 2  1 d 1 3 1 4 6 . . . rilassa gli archi . . . 6 5 2

  36. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 1 10 S = 1 1 0 8 3 2 4 v 3 4 2 6 5 9 4  2 1 d 1 3 1 4 6 . . . e riordina la coda. . . 6 5 2

  37. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 1 10 S = 1 1 0 8 3 2 4 3 v 4 2 6 5 9 4 1  2 d 1 3 1 4 6 Ripeti . . . 6 5 2

  38. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 1 10 S = 1 1 0 2 8 3 2 4 v 3 4 2 6 9 4  1 d 1 3 1 4 6 . . . rimuovi dalla coda e inserisci in S 6 5 2

  39. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 1 10 S = 1 1 0 2 8 3 2 4 3 v 4 2 6 9 4 1 4 d 1 3 1 4 6 . . . rilassa gli archi . . . 6 5 2

  40. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 1 10 S = 1 1 0 2 8 3 2 4 v 3 2 6 4 9 4 1 4 d 1 3 1 4 6 . . . e riordina la coda. . . 6 5 2

  41. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 1 10 S = 1 1 0 2 8 3 2 4 v 3 2 6 4 9 4 4 1 d 1 3 1 4 6 Ripeti . . . 6 5 2

  42. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 4 1 10 S = 1 1 0 2 4 8 3 2 4 v 3 2 6 9 4 1 d 1 3 1 4 6 . . . rimuovi dalla coda e inserisci in S 6 5 2

  43. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 4 1 10 S = 1 1 0 2 4 8 3 v 2 4 3 2 6 9 4 d 1 1 3 1 4 6 . . . rilassa gli archi . . . 6 5 2

  44. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 4 1 10 S = 1 1 0 2 4 8 3 2 4 v 3 2 6 9 4 1 d 1 3 1 4 6 . . . e riordina la coda (nessun cam-biamento in questo caso) . . . 6 5 2

  45. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 3 5 4 10 1 S = 1 1 0 2 4 8 3 2 4 3 v 2 6 1 9 4 d 1 3 1 4 6 Ripeti . . . 6 5 2

  46. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 6 3 5 4 1 10 S = 1 1 0 2 4 4 8 3 2 4 v 3 2 9 1 d 1 3 1 4 6 . . . rimuovi dalla coda e inserisci in S 6 5 2

  47. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 6 3 5 4 1 10 S = 1 1 0 2 4 4 8 3 2 4 v 3 2 9 1 d 1 3 1 4 6 . . . rilassa gli archi (nessun cam-biamento in questo caso) . . . 6 5 2

  48. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 6 5 3 5 4 1 10 S = 1 1 0 2 4 4 8 3 2 4 v 3 2 9 d 1 1 3 1 4 6 Ripeti . . . 6 5 2

  49. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 6 5 3 5 4 2 1 10 S = 1 1 9 2 4 4 0 8 3 v 2 4 3 d 1 1 3 1 4 6 Fatto! 6 5 2

  50. Grafi: Percorsi minimi (Dijkstra) L’algoritmo di Dijkstra utilizza un insieme S di vertici i cui pesi del percorso minimo sono già stati determinati. Sia 1 il vertice sorgente. s 1 5 10 v 6 3 5 4 2 1 1 S = 1 9 2 4 4 0 8 3 d 2 4 3 1 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. 1 3 1 4 6 6 5 2

More Related