Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1 / 50
Ricerca di un cammino su grafo
Ricerca di un cammino
2 / 50
Ricerca di un cammino su grafo
Procedura ad "ALBERO"
ovvero
determinaz. di un cammino tra due nodi
Es :
2 5 8
1 3 6 9
4 7 10
3 / 50
Ricerca di un cammino su grafo
4 / 50
Ricerca di un cammino su grafo
1 2 5
2 5 8
1 3
x 1 3 6 9 8
4 7 10
6 6 7
Ordine di etichettatura ed esame:
1 , 2 , 3 , 5 , 6 , 8 , 4 , 7 , 9 , 10
Individuazione cammino da 1 a 10 (a ritroso, memorizzando le
etichette) :
10 - 7 - 6 - 3 - 1
5 / 50
Albero ricoprente di costo minimo
• Un famoso problema della teoria dei grafi è il problema dell’albero
ricoprente (spanning tree in inglese) di costo minimo.
Sede centrale
7 / 50
Albero ricoprente di costo minimo
Un approccio un po naif
Sede centrale
Molto costoso!
8 / 50
Albero ricoprente di costo minimo
Un approccio migliore
Sede centrale
9 / 50
Albero ricoprente di costo minimo
10 / 50
Albero ricoprente di costo minimo: Esempio
a 9 a 9
b b
2 6 2 6
d d
5 5 5 5
4 4
4 4
c e c e
5 5
• Come ottenere in generale un albero ricoprente di costo minimo?
• Modello di programmazione lineare del problema?
11 / 50
Albero ricoprente di costo minimo
- Un modello di programmazione lineare per il problema (cij rappresenta il
costo dello spigolo (i, j)):
xij ∈ {0, 1}
= 1 se lo spigolo (i, j) ∈ E è scelto nell’albero ricoprente; = 0 altrimenti.
X
min cij xij (minimizzazione della somma dei costi)
(i,j)∈E
X
xij = |V | − 1 (selezione di |V | − 1 spigoli)
(i,j)∈E
X
xij ≤ |S| − 1 ∀S ⊆ V
(i,j)∈E :i∈S,j∈S
13 / 50
Algoritmo di Kruskal
14 / 50
Algoritmo di Kruskal: Esempio
Iterazione 1: spigolo (a, d) X Iterazione 2: spigolo (d, e) X
a 9 a 9
b b
2 6 2 6
d d
5 5 5 5
4 4
4 4
c e c e
5 5
d d
5 5 5 5
4 4
4 4
c e c e
5 5
16 / 50
Algoritmo di Prim
17 / 50
Algoritmo di Prim: Esempio (partendo dal vertice e)
Iterazione 1: {e} ∈ T Iterazione 2: {d, e} ∈ T
→ (e, d) X → (a, d) X
a 9 a 9
b b
2 6 2 6
d d
5 5 5 5
4 4
4 4
c e c e
5 5
Iterazione 3: {a, d, e} ∈ T Iterazione 4: {a, c, d, e} ∈ T
→ (c, d) X → (b, e) X
a 9 a 9
b b
2 6 2 6
d d
5 5 5 5
4 4
4 4
c e c e
5 5 18 / 50
Algoritmo di Prim: Esempio (partendo dal vertice e)
19 / 50
Problema del cammino minimo
20 / 50
Problema del cammino minimo
• Si consideri un grafo G = (V , A) orientato e pesato, con l’insieme dei
nodi (o vertici) V e l’insieme degli archi A. Si indichi con n = |V | il
numero di nodi nel grafo, con m = |A| il numero di archi e con lij il
costo di ciascun arco (i, j) ∈ A.
• Nel problema del cammino minimo, si vuole determinare il cammino
tra un nodo di origine e un nodo di destinazione del grafo G tale che
la somma dei costi dei suoi archi sia minima.
• Considereremo il seguente grafo come esempio:
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7 21 / 50
Problema del cammino minimo
• Per ogni arco (i, j) ∈ A, si considera una variabile binaria xij uguale a
1 se l’arco è percorso nel cammino minimo da s a t.
22 / 50
Problema del cammino minimo
23 / 50
Problema del cammino minimo
Come esempio, si riporta il modello di programmazione lineare per trovare
un cammino minimo dal nodo 1 al nodo 4 nel grafo nella slide 3:
24 / 50
Algoritmo di Dijkstra
• Γ−1
i : insieme dei predecessori del nodo i, ovvero dei nodi che hanno un
arco verso il nodo i.
25 / 50
Algoritmo di Dijkstra
• P(i): predecessore del nodo i nel cammino minimo dal nodo di origine
al vertice i ((P(i), i) ∈ A).
26 / 50
Algoritmo di Dijkstra
• I passi dell’algoritmo di Dijkstra sono i seguenti:
1) S = {2, .., n}
Π(1) =
0
l1i se i ∈ Γ1
Π(i) =
∞ altrimenti
P(i) = 1, ∀i ∈ Γ1 .
S = S − {j}
Porre
Se S = 0, STOP; altrimenti andare al passo 3).
3) ∀ i ∈ Γj ∩ S porre
Π(i) = min(Π(i), Π(j) + lji )
P(i) = j se Π(i) = Π(j) + lji .
Andare al passo 2).
27 / 50
Algoritmo di Dijkstra
• Primo passo dell’algoritmo (inizializzazione):
1) S = {2, .., n}
Π(1) =
0
l1i se i ∈ Γ1
Π(i) =
∞ altrimenti
P(i) = 1, ∀i ∈ Γ1 .
• Per gli altri nodi del grafo, il costo del relativo cammino minimo dal
nodo 1 si pone pari ad infinito (Π(i) = ∞).
28 / 50
Algoritmo di Dijkstra
S = S − {j}
Porre
Se S = 0, STOP; altrimenti andare al passo 3).
29 / 50
Algoritmo di Dijkstra
• Terzo passo dell’algoritmo:
3) ∀ i ∈ Γj ∩ S porre
Π(i) = min(Π(i), Π(j) + lji )
P(i) = j se Π(i) = Π(j) + lji .
Andare al passo 2).
• Se il costo del cammino minimo Π(i) è pari a Π(j) + lji , allora il nodo j
diventa il predecessore del nodo i nel cammino minimo da 1 a i
(P(i) = j se Π(i) = Π(j) + lji ).
31 / 50
Algoritmo di Dijkstra: Esempio
Π(2) = min(7, 1 + 5) = 6 3
7
6
Π(5) = min(∞, 1 + 2) = 3
Π(6) = min(∞, 1 + 7) = 8
P(2) = P(5) = P(6) = 3.
32 / 50
Algoritmo di Dijkstra: Esempio
Iterazione 2
S = {2, 4, 5, 6}, Π(2) = 6, 4
4 5
Π(4) = ∞, Π(5) = 3, Π(6) = 8
2 5
2) j = 5, S = {2, 4, 6} 2
7
3) Γ5 ∩ S = {2, 4}
1 5 3
Π(2) = min(6, 3 + 2) = 5
2 1
Π(4) = min(∞, 3 + 5) = 8 1
P(2) = 5, P(4) = 5. 3
7
6
33 / 50
Algoritmo di Dijkstra: Esempio
Iterazione 3
S = {2, 4, 6}, 4
4 5
Π(2) = 5, Π(4) = 8, Π(6) = 8
2 5
2) j = 2, S = {4, 6} 2
7
3) Γ2 ∩ S = {4, 6}
1 5 3
Π(4) = min(8, 5 + 4) = 8
2 1
Π(6) = min(8, 5 + 1) = 6, 1
P(6) = 2. 3
7
6
34 / 50
Algoritmo di Dijkstra: Esempio
Iterazione 4
S = {4, 6}, Π(4) = 8, Π(6) = 6 4
4 5
2) j = 6, S = {4}
2 5
2
3) Γ6 ∩ S = {∅}. 7
1 5 3
Iterazione 5 2
1 1
S = {4}, Π(4) = 8
3 6
7
2) j = 4, S = 0 ⇒ STOP.
35 / 50
Algoritmo di Dijkstra: Esempio
Si riporta infine l’albero di supporto relativo ai cammini minimi trovati.
Π(2) = 5 P(2) = 5
Π(3) = 1 P(3) = 1
Π(4) = 8 P(4) = 5
Π(5) = 3 P(5) = 3
Π(6) = 6 P(6) = 2.
4
5
2 5
2
1
2 1
1
3 6
36 / 50
Algoritmo di Dijkstra: prova di correttezza
37 / 50
Algoritmo di Bellman-Ford
38 / 50
Algoritmo di Bellman-Ford
4
1 1
2 5
-4
1
1 -2 1
5
3 6
4
39 / 50
Algoritmo di Bellman-Ford
40 / 50
Algoritmo di Bellman-Ford
• L’algoritmo di Bellman-Ford si basa sulle seguenti considerazioni:
1 In assenza di circuiti di costo negativo in un grafo con n nodi, un
cammino minimo tra una coppia di nodi contiene al più n − 1 archi.
• Nel caso in cui Πn (i) < Πn−1 (i) per almeno un nodo i, l’algoritmo
termina concludendo che esiste un circuito di costo negativo.
41 / 50
Algoritmo di Bellman-Ford
42 / 50
Algoritmo di Bellman-Ford
• Nel passo 1), l’algoritmo inizializza il costo Π0 (1) a 0 e tutti gli altri
costi Π0 (i) a ∞ (i 6= 1) per rappresentare l’impossibilità di
raggiungere un nodo diverso da 1 senza utilizzare archi.
ovvero calcola, per ogni nodo i, il costo del cammino minimo dal
nodo 1 al nodo i con al più k archi sulla base di quanto ottenuto con
i cammini minimi con al più k − 1 archi per il nodo i e per i
predecessori di i.
43 / 50
Algoritmo di Bellman-Ford
44 / 50
Algoritmo di Bellman-Ford: Esempio
Si riportano di seguito le iterazioni dell’algoritmo di Bellman-Ford per il
grafo nella slide 3:
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
Inizializzazione
1) Π0 (1) = 0, Π0 (2) = Π0 (3) = Π0 (4) = Π0 (5) = Π0 (6) = ∞,
k = 1.
45 / 50
Algoritmo di Bellman-Ford: Esempio
Iterazione 1
2) Π1 (1) = 0,
Π1 (2) = min[Π0 (2), min{Π0 (1) + l12 , Π0 (3) + l32 , Π0 (5) + l52 }] = 7,
Π1 (3) = min[Π0 (3), Π0 (1) + l13 ] = 1,
Π1 (4) = min[Π0 (4), min{Π0 (2) + l24 , Π0 (5) + l54 }] = ∞,
Π1 (5) = min[Π0 (5), min{Π0 (3) + l35 , Π0 (6) + l65 }] = ∞,
Π1 (6) = min[Π0 (6), min{Π0 (2) + l26 , Π0 (3) + l36 }] = ∞.
3) Π1 (i) = Π0 (i) ∀i ? no ⇒ k ≤ 5 ? sı̀ ⇒ k = 2.
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
46 / 50
Algoritmo di Bellman-Ford: Esempio
Iterazione 2
2) Π2 (1) = 0,
Π2 (2) = min[Π1 (2), min{Π1 (1) + l12 , Π1 (3) + l32 , Π1 (5) + l52 }] = 6,
Π2 (3) = min[Π1 (3), Π1 (1) + l13 ] = 1,
Π2 (4) = min[Π1 (4), min{Π1 (2) + l24 , Π1 (5) + l54 }] = 11,
Π2 (5) = min[Π1 (5), min{Π1 (3) + l35 , Π1 (6) + l65 }] = 3,
Π2 (6) = min[Π1 (6), min{Π1 (2) + l26 , Π1 (3) + l36 }] = 8.
3) Π2 (i) = Π1 (i) ∀i ? no ⇒ k ≤ 5 ? sı̀ ⇒ k = 3.
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
47 / 50
Algoritmo di Bellman-Ford: Esempio
Iterazione 3
2) Π3 (1) = 0,
Π3 (2) = min[Π2 (2), min{Π2 (1) + l12 , Π2 (3) + l32 , Π2 (5) + l52 }] = 5,
Π3 (3) = min[Π2 (3), Π2 (1) + l13 ] = 1,
Π3 (4) = min[Π2 (4), min{Π2 (2) + l24 , Π2 (5) + l54 }] = 8,
Π3 (5) = min[Π2 (5), min{Π2 (3) + l35 , Π2 (6) + l65 }] = 3,
Π3 (6) = min[Π2 (6), min{Π2 (2) + l26 , Π2 (3) + l36 }] = 7.
3) Π3 (i) = Π2 (i) ∀i ? no ⇒ k ≤ 5 ? sı̀ ⇒ k = 4.
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
48 / 50
Algoritmo di Bellman-Ford: Esempio
Iterazione 4
2) Π4 (1) = 0,
Π4 (2) = min[Π3 (2), min{Π3 (1) + l12 , Π3 (3) + l32 , Π3 (5) + l52 }] = 5,
Π4 (3) = min[Π3 (3), Π3 (1) + l13 ] = 1,
Π4 (4) = min[Π3 (4), min{Π3 (2) + l24 , Π3 (5) + l54 }] = 8,
Π4 (5) = min[Π3 (5), min{Π3 (3) + l35 , Π3 (6) + l65 }] = 3,
Π4 (6) = min[Π3 (6), min{Π3 (2) + l26 , Π3 (3) + l36 }] = 6.
3) Π4 (i) = Π3 (i) ∀i ? no ⇒ k ≤ 5 ? sı̀ ⇒ k = 5.
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
49 / 50
Algoritmo di Bellman-Ford: Esempio
Iterazione 5
2) Π5 (1) = 0,
Π5 (2) = min[Π4 (2), min{Π4 (1) + l12 , Π4 (3) + l32 , Π4 (5) + l52 }] = 5,
Π5 (3) = min[Π4 (3), Π4 (1) + l13 ] = 1,
Π5 (4) = min[Π4 (4), min{Π4 (2) + l24 , Π4 (5) + l54 }] = 8,
Π5 (5) = min[Π4 (5), min{Π4 (3) + l35 , Π4 (6) + l65 }] = 3,
Π5 (6) = min[Π4 (6), min{Π4 (2) + l26 , Π4 (3) + l36 }] = 6.
3) Π5 (i) = Π4 (i) ∀i ? sı̀, STOP.
4
4 5
2 5
2
7
1 5 3
2 1
1
3 6
7
50 / 50