La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Cammini minimi con una sorgente Problema dei cammini minimi Varianti e archi negativi Sottostruttura ottima di un cammino minimo Algoritmo di Dijkstra.

Presentazioni simili


Presentazione sul tema: "Cammini minimi con una sorgente Problema dei cammini minimi Varianti e archi negativi Sottostruttura ottima di un cammino minimo Algoritmo di Dijkstra."— Transcript della presentazione:

1 Cammini minimi con una sorgente Problema dei cammini minimi Varianti e archi negativi Sottostruttura ottima di un cammino minimo Algoritmo di Dijkstra Complessità dellalgoritmo Rappresentazione dei cammini minimi

2 Problema dei cammini minimi Input: un grafo G=(V,E) orientato e pesato, con una funzione peso w: E R, che associa ad ogni arco in E un peso a valore nei reali

3 Problema dei cammini minimi Il peso di un cammino p= è la somma dei pesi degli archi che lo costituiscono. LU PT FI PO MC PI LI SI GR AR p1= = 15 min + 50 min = 65 min p2 = = 15 min + 35 min + 40 min = = 90 min p3 = = 160 min

4 Problema dei cammini minimi Il peso di un cammino minimo dal vertice u al vertice v è definito da: Un cammino minimo dal vertice u al vertice v è definito come un qualunque cammino p con peso w(p) = δ(u,v). Può non essere unico! δ(6,1) = 7 p 1 = w(p 1 ) = 7 p 2 = w(p 2 ) = 9 p 3 = w(p 3 ) = 9 p 4 = w(p 4 ) = 7

5 Vari problemi Problema di cammini minimi con sorgente singola: si vuole trovare un cammino minimo da un dato vertice sorgente s ad ogni vertice v in V. Problema di cammini minimi con destinazione singola: si vuole trovare da ogni vertice v in V un cammino minimo ad un dato vertice destinazione t. Problema di cammini minimi tra una coppia: si vuole trovare un cammino minimo da u a v. Problema di cammini minimi tra tutte le coppie: determinazione di un cammino minimo per ogni coppia di vertici u e v.

6 Archi con pesi negativi Un possibile problema può essere rappresentato dalla presenza di pesi negativi sugli archi e di cicli che contengano archi con pesi negativi. Se il peso di un ciclo è negativo, allora tutti i nodi raggiungibile dal ciclo hanno un cammino minimo infinitamente negativo (-) Ciclo negativo. Ogni volta che compio un giro diminuisco il peso del cammino che passa per il ciclo. δ(6,1) = -

7 Sottostruttura ottima di un cammino minimo Sottocammini di cammini minimi sono cammini minimi Dato un grafo G=(V,E) con funzione peso w:E R, sia p= un cammino minimo da v 1 a v k. Per ogni i e j tali che 1 i j k, ha che il sottocammino p ij = è un cammino minimo. 1i w(p ij )=δ(i,j) jk p ij Dato un altro sottocammino da i a j p ij, necessariamente w( p ij ) w( p ij ), altrimenti il cammino minimo passa per p ij.

8 Sottostruttura ottima di un cammino minimo Di conseguenza: Si supponga che un cammino minimo p da una sorgente ad un vertice v passi per larco (u,v) con peso w(u,v). Il peso del cammino minino da s a v è δ(s,v) = δ(s,u) + w(u,v). i δ(s,u) uv Più in generale, se esiste un arco (u,v), allora si ha: δ(s,v) δ(s,u) + w(u,v). w(u,v) cammino minimo tra u e v δ(s,v) = δ(s,u) + w(u,v).

9 Algoritmo di Dijkstra Lalgoritmo di Dijkstra risolve il problema dei cammini minimi con sorgente singola su un grafo orientato e pesato G=(V,E) nel caso in cui tutti i pesi degli archi siano non negativi. Ci sono due insiemi: S: dove d[v] = δ(s,v), quindi un cammino minimo tra s e v è stato determinato. Q = V-S: una coda a priorità dove d[v] ha il valore del cammino con peso minore finora scoperto. Allinizio, S contiene solo s, d[s]=0, mentre Q=V-{s} con d[v]=.

10 Algoritmo di Dijkstra DIJKSTRA(G,w,s) 1. for ogni vertice u in V[G] // inizializzazione di ogni vertice 2. do d[u] 3. p[u] NIL 4. d[s] 0 // si comincia dal vertice s 5.Q V[G] // coda a priorità 6.S Ø// insiemi dei cammini minimi trovati 7. while QØ// termina quando la coda Q è vuota 8. do u EXTRACT-MIN(Q)// prendi il cammino in Q più piccolo 9. S S U {u} // inserisci u in S 10. for ogni vertice v in Adj[u]// aggiorna cammini minimi in Q con v adiacente a u 11. do if d[v] > d[u] + w(u,v) 12. then d[v] d[u] + w[u,w] 13. p[v] u

11 Esempio v s u (a) y x v s u (b) y x v s u (c) y x v s u (d) y x v s u (e) y x v s u (f) y x

12 Se si esegue un lalgoritmo di Dijkstra su un grafo orientato e pesato G=(V,E) nel caso in cui tutti i pesi degli archi siano non negativi, allora al termine vale d[v] = δ(s,v) per ogni v in V. Dimostrazione Supponiamo per assurdo che u sia il primo vertice ad entrare in S tale che d[u] δ(s,u). Prendiamo un cammino minimo da s a u, che può essere decomposto in sxyu, con x in S, y in Q e (x,y) arco di G. Correttezza algoritmo x s y u S Può essere s = x o y = u p1p1 p2p2

13 Si ha anche d[y] = δ(s,y) = δ(s,x) + w(x,y), perché sottocamino di un cammino minimo. Inoltre d[y] = δ(s,y) δ(s,u) d[u]. Nellalgoritmo u viene scelto prima di y ( EXTRACT-MIN(Q) ), quindi deve valere luguaglianza: d[y] = δ(s,y) = δ(s,u) = d[u]. ASSURDO! δ(s,u) d[u]. Correttezza algoritmo x s y u S d[x] = δ(s,x) x è entrato prima di u in S. p1p1 p2p2

14 Complessità Si consideri che la coda con priorità Q come un array lineare: Inizzializzazione tempo O(|V|) EXTRACT-MIN(Q): ricerca del minimo in Q. Bisogna vedere tutti i valori in Q, richiede tempo O(|V|) EXTRACT-MIN(Q) viene eseguito per ogni vertice quindi il tempo totale è O(|V|x|V|) = O(|V| 2 ) Come in BFS vengono, si esamina la lista di adiacenza di ogni vertice v, che entra solo una volta in S. La somma di tutte liste di adiacenze è |E|. Il tempo totale dellalgoritmo di Dijkstra è O(|V|+|E|+|V| 2 ).

15 Come nella visita in ampiezza (BFS), lalgoritmo Dijkstra definisce un sottografo dei predecessori Tp=(Vp,Ep). Lalbero che ne segue contiene i cammini minimi individuati da s ad ogni vertice raggiungibile v. Nota: questo vale solo al termine dellalgoritmo. Rappresentazione dei cammini minimi v s u y x v s u y x Tp=(Vp,Ep)


Scaricare ppt "Cammini minimi con una sorgente Problema dei cammini minimi Varianti e archi negativi Sottostruttura ottima di un cammino minimo Algoritmo di Dijkstra."

Presentazioni simili


Annunci Google