Title: Cammini minimi con una sorgente
1Cammini 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
2Problema 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.
1
9
1
8
2
1
2
1
1
1
1
3
1
3
3
3
6
6
1
6
1
4
4
1
4
5
-3
5
1
-1
3Problema dei cammini minimi
Il peso di un cammino p ltv1, v2, ,vkgt è la
somma dei pesi degli archi che lo costituiscono.
p1 ltPO, FI, SIgt 15 min 50 min 65 min p2
ltPO, FI, AR, SIgt 15 min 35 min 40 min
90 min p3 ltPO, FI, PI, LI, GR, SIgt 160 min
50
MC
PT
20
35
LU
20
25
PO
20
15
PI
60
FI
35
LI
50
AR
65
SI
40
70
GR
4Problema 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) d(u,v). Può non essere unico!
d(6,1) 7 p1 lt6, 2, 3, 1 gt w(p1) 7 p2
lt6, 1gt w(p2) 9 p3 lt6, 5, 6, 2, 3, 1 gt
w(p3) 9 p4 lt6, 5, 4, 3, 1 gt w(p4) 7
9
8
2
1
1
3
3
3
6
3
3
4
-2
5
-1
5Vari 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.
6Archi 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 (-8).
Ciclo lt6,5gt negativo. Ogni volta che compio un
giro diminuisco il peso del cammino che passa per
il ciclo. d(6,1) -8
9
8
2
1
1
3
3
3
3
6
3
4
-2
5
-7
7Sottostruttura ottima di un cammino minimo
Sottocammini di cammini minimi sono cammini
minimi Dato un grafo G(V,E) con funzione peso
wE? R, sia p ltv1, v2, ,vkgt un cammino
minimo da v1 a vk. Per ogni i e j tali che 1 i
j k, ha che il sottocammino pij ltvi,
vi1, ,vjgt è un cammino minimo.
w(pij)d(i,j)
1
i
j
k
pij
Dato un altro sottocammino da i a j pij,
necessariamente w(pij ) w(pij), altrimenti il
cammino minimo passa per pij.
8Sottostruttura 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 è d(s,v) d(s,u) w(u,v).
d(s,u)
cammino minimo tra u e v d(s,v) d(s,u)
w(u,v).
w(u,v)
i
u
v
Più in generale, se esiste un arco (u,v), allora
si ha d(s,v) d(s,u) w(u,v).
9Algoritmo 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 dv d(s,v), quindi un cammino minimo
tra s e v è stato determinato. - Q V-S una coda a priorità dove dv ha il
valore del cammino con peso minore finora
scoperto. - Allinizio, S contiene solo s, ds0, mentre
QV-s con dv8.
10Algoritmo di Dijkstra
- DIJKSTRA(G,w,s)
- for ogni vertice u in VG // inizializzazione
di ogni vertice - do du ? 8
- pu ? NIL
- ds ? 0 // si comincia dal vertice s
- Q ? VG // coda a priorità
- S ? Ø // insiemi dei cammini minimi trovati
- while Q?Ø // termina quando la coda Q è vuota
- do u ? EXTRACT-MIN(Q) // prendi il cammino in Q
più piccolo - S ? S U u // inserisci u in S
- for ogni vertice v in Adju //
aggiorna cammini minimi in Q con v adiacente
a u - do if dv gt du w(u,v)
- then dv ? du wu,w
- pv ? u
11Esempio
v
u
10
v
u
10
v
u
10
1
1
1
8
14
8
8
10
8
3
3
3
s
s
s
9
9
9
2
2
2
0
4
6
0
4
6
0
4
6
7
7
7
8
8
5
8
5
7
5
2
5
2
5
2
y
x
y
x
y
x
(a)
(b)
(c)
u
10
u
10
u
10
v
v
v
1
1
1
8
13
8
9
8
9
3
3
3
s
s
s
9
9
9
2
2
2
0
4
6
0
4
6
0
4
6
7
7
7
5
7
5
7
5
7
5
2
5
2
5
2
y
x
y
x
y
x
(d)
(e)
(f)
12Correttezza algoritmo
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 dv d(s,v) per ogni v
in V. Dimostrazione Supponiamo per assurdo che
u sia il primo vertice ad entrare in S tale che
du ? d(s,u). Prendiamo un cammino minimo da s a
u, che può essere decomposto in s?x?y?u, con x in
S, y in Q e (x,y) arco di G.
Può essere s x o y u
S
s
x
y
p1
u
p2
13Correttezza algoritmo
dx d(s,x) x è entrato prima di u in S.
S
s
x
y
p1
u
p2
Si ha anche dy d(s,y) d(s,x) w(x,y),
perché sottocamino di un cammino minimo. Inoltre
dy d(s,y) d(s,u) du. Nellalgoritmo u
viene scelto prima di y (EXTRACT-MIN(Q)), quindi
deve valere luguaglianza dy d(s,y)
d(s,u) du. ASSURDO! d(s,u) ? du.
14Complessità
- 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(VxV) O(V2) - 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(VEV2).
15Rappresentazione dei cammini minimi
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.
v
u
10
v
u
1
1
8
9
8
9
3
3
s
s
9
Tp(Vp,Ep)
2
0
4
6
0
7
5
7
5
7
5
2
5
2
y
x
y
x