...

i j u , c b b Determinare con l`algoritmo dei cammini minimi

by user

on
Category: Documents
17

views

Report

Comments

Transcript

i j u , c b b Determinare con l`algoritmo dei cammini minimi
Determinare con l’algoritmo dei cammini minimi successivi (SSPT)
il flusso di costo minimo sul grafo
–5
2, 7
1
0
2
3, 1
–5
3
5, 3
4, 3
4
,
1
0
5
3, 1
4, 1
4,
0
3, 1
3
4
7
6
2, −4
uij, cij
bi
i
j
bj
Dati del problema
i bi
1 −5
2
0
3 −5
4
3
5
0
6
7
(i, j)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(3, 6)
(5, 4)
(5, 6)
uij
2
5
3
1
3
3
4
2
4
4
cij
7
3
1
4
1
1
0
−4
3
1
Algoritmo dei cammini minimi successivi : inizializzazione
Pseudoflusso minimale x1 iniziale :
non esistendo archi
con costo negativo e capacità infinita,
uno pseudoflusso minimale iniziale
si ottiene ponendo
xij = 0 se cij ≥ 0
xij = uij se cij < 0
(i, j)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(3, 6)
(5, 4)
(5, 6)
uij
2
5
3
1
3
3
4
2
4
4
cij
7
3
1
4
1
1
0
−4
3
1
xij
0
0
0
0
0
0
0
2
0
0
Calcolo degli sbilanciamenti ai nodi nello pseudoflusso x1
i
1
2
3
4
5
6
BS FS bi ei = BS − FS −bi
0
0 −5
5
0
0
0 0
0 −2 −5
3
0
0 3
−3
0
0
0 0
2
0 7
−5
nodi con eccedenza di flusso : O(x1) = { 1, 3 }
nodi con difetto di flusso :
D(x1) = { 4, 6 }
sbilanciamento complessivo : g(x1) = 5 + 3 = 8 ≠ 0
ei(x1) i
5
xij
0
1
4
0
0
2
ej(x1)
−3
0
0
0
j
5
0
0
0
0
0
3
3
2
6
−5
nodi con eccedenza di flusso : O(x1) = { 1, 3 }
nodi con difetto di flusso : D(x1) = { 4, 6 }
sbilanciamento complessivo : g(x1) = 5 + 3 = 8 ≠ 0
⇒ occorre eseguire la procedura Trova-Cammino-Minimo
⇒ per trovare un cammino aumentante di costo minimo P
⇒ da un nodo s ∈ O(x1) ad un nodo t ∈ D(x1)
grafo G con pseudoflusso x1
(i, j)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(3, 6)
(5, 4)
(5, 6)
xij
0
0
0
0
0
0
0
2
0
0
uij
2
5
3
1
3
3
4
2
4
4
cij
7
3
1
4
1
1
0
−4
3
1
grafo residuo G(x1)
(i, j) uij′
(1, 4) 2
(1, 5) 5
(2, 1) 3
(2, 4) 1
(2, 5) 3
(3, 2) 3
(3, 4) 1
(5, 4) 4
(5, 6) 4
(6, 3) 2
cij′
7
3
1
4
1
1
0
3
1
4
Grafo residuo G’(x1) associato allo pseudoflusso x1 iniziale:
7
1
4
nello pseudoflusso iniziale gli archi di G
o sono vuoti o sono saturi :
3 quindi nel grafo residuo G(x ) vi è
1
uno e un solo arco per ogni arco di G
5
• concorde all’arco di G e con costo cij′ = cij
se l’arco di G è vuoto
1
3
1
4
2
1
0
1
3
6
4
i
• discorde all’arco di G e con costo cij′ = −cij
se l’arco di G è saturo
cij′
j
Essendo | O(x1) | = 2, si introduce una super-radice r = 0
collegata a tutti i nodi in O(x1) con archi a costo nullo:
il grafo residuo ampliato G’(x1) è
7
1
3
0
0
3
1
4
0
2
4
5
1
1
0
1
3
4
6
Tutti gli archi di G’(x1) hanno costo nonnegativo:
i cammini minimi si determinano con l’algoritmo di Dijkstra
Archi del grafo residuo ampliato
archi
(0, 1)
(0, 3)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(5, 4)
(5, 6)
(6, 3)
costi
0
0
7
3
1
4
1
1
0
3
1
4
Esecuzione dell’algoritmo di Dijkstra su tabella
L’insieme Q è formato dai nodi i il cui costo di è circolettato.
In Q si sceglie il nodo u il cui costo du è il minimo dei di :
⇒ si copia du senza circoletto sulla riga dell’iterazione in corso
Archi v della stella uscente da u :
⇒ si leggono nell’elenco degli archi del grafo (ordinati per nodo di coda)
Per ogni v, se du + cuv < dv :
⇒ si scrive il nuovo dv circolettato in riga corrente e colonna del nodo v
Differenze
algoritmo in pseudocodice :
se il nodo v di cui si è aggiornato il costo dv è già presente in Q,
esso non viene (ovviamente) inserito in Q
algoritmo su tabella :
il costo dv che è stato aggiornato viene circolettato in ogni caso,
anche se era già circolettato (e non scelto) nella riga precedente
Inizializzazione
d
nodi
iter. 0 1 2 3 4 5 6
0
0 M M M M M M
Q={0}
p
iter 0 1
0 nil 0
nodi
2 3 4
0 0 0
5 6
0 0
Iterazione 1
d
nodi
iter. 0 1 2 3 4 5 6
0
0 M M M M M M
1
0 0
0
Q = { 1, 3 }
p
iter 0 1
0 nil 0
1
0
nodi
2 3 4
0 0 0
0
5 6
0 0
si parte dal nodo 0,
ma si percorrono gli archi di G
e non gli archi fittizi
Iterazione 2
d
nodi
iter. 0 1 2 3 4 5 6
0
0 M M M M M M
1
0 0
0
2
0
7 3
Q = { 3, 4, 5 }
p
iter 0 1
0 nil 0
1
0
2
nodi
2 3 4
0 0 0
0
1
5 6
0 0
1
Iterazione 3
d
nodi
iter 0 1 2 3
0 0 M M M
1 0 0
0
2
0
3
1 0
4 5 6
M M M
7
0
3
Q = { 2, 4, 5 }
p
iter 0 1
0 nil 0
1
0
2
3
nodi
2 3 4
0 0 0
0
1
3
3
5 6
0 0
1
Iterazione 4
d
nodi
iter 0 1 2 3
0 0 M M M
1 0 0
0
2
0
3
1 0
4
4 5 6
M M M
7
0
0
Q = { 2, 5 }
3
p
iter 0 1
0 nil 0
1
0
2
3
4
nodi
2 3 4
0 0 0
0
1
3
3
5 6
0 0
1
Iterazione 5
d
nodi
iter 0 1 2 3
0 0 M M M
1 0 0
0
2
0
3
1 0
4
5
1
4 5 6
M M M
7
0
0
3
2
Q={5}
p
iter 0 1
0 nil 0
1
0
2
3
4
5
nodi
2 3 4
0 0 0
0
1
3
3
5 6
0 0
1
2
Iterazione 6
d
nodi
iter 0 1 2 3
0 0 M M M
1 0 0
0
2
0
3
1 0
4
5
1
6
4 5 6
M M M
7
0
0
3
2
2 3
Q={6}
p
iter 0 1
0 nil 0
1
0
2
3
4
5
6
nodi
2 3 4
0 0 0
0
1
3
3
5 6
0 0
1
2
5
Iterazione 7
d
nodi
iter 0 1 2 3
0 0 M M M
1 0 0
0
2
0
3
1 0
4
5
1
6
7
4 5 6
M M M
7
0
0
3
2
2 3
3
p
iter 0 1
0 nil 0
1
0
2
3
4
5
6
7
Q = ∅ : l’algoritmo di Dijkstra termina
nodi
2 3 4
0 0 0
0
1
3
3
5 6
0 0
1
2
5
Albero dei cammini minimi sul grafo residuo ampliato
d1 = 0
1
d0 = 0
0
4
d4 = 0
5
d5 = 2
6
d6 = 3
d2 = 1
2
3
d3 = 0
Albero dei cammini minimi sul grafo residuo
d1 = 0
1
4
d4 = 0
5
d5 = 2
6
d6 = 3
d2 = 1
2
3
d3 = 0
cammino 3 – 4 : di costo 0
cammino 3 – 2 – 5 – 6 : di costo 3
Inviamo il flusso aggiuntivo lungo il cammino 3 – 4 .
Capacità del cammino 3 – 4:
θ(P, x1) = u34 – x34 = 4 – 0 = 4
Quantità θ di flusso aggiuntivo che si può inviare da s = 3 a t = 4 :
θ = min { θ(P, x1) , e3(x1) , – e4(x1) } = min { 4 , 3 , –(–3) } = 3
Si ottiene lo pseudoflusso x2 rappresentato in figura
bi , ei
i
3, 0
–5,5
0
1
0
4
3–0–3=0
0
0
0
0, 0 2
5
0
0
3
0
0 – (– 5) – 5 = 0
xij
3
– 5, 0
2
6
7, – 5
0, 0
j
bj , ej
nodi con eccedenza di flusso : O(x2) = { 1 }
nodi con difetto di flusso : D(x2) = { 6 }
sbilanciamento complessivo : g(x2) = 5 ≠ 0
Occorre trovare un cammino aumentante P di costo minimo
dal nodo 1 al nodo 6
grafo G con pseudoflusso x2
(i, j)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(3, 6)
(5, 4)
(5, 6)
xij
0
0
0
0
0
0
3
2
0
0
uij
2
5
3
1
3
3
4
2
4
4
cij
7
3
1
4
1
1
0
−4
3
1
grafo residuo G(x2)
(i, j) uij′
(1, 4) 2
(1, 5) 5
(2, 1) 3
(2, 4) 1
(2, 5) 3
(3, 2) 3
(3, 4) 1
(4, 3) 3
(5, 4) 4
(5, 6) 4
(6, 3) 2
cij′
7
3
1
4
1
1
0
0
3
1
4
ei(x)
uij’, cij’
i
j
5
2, 7
1
5, 3
0 3
5
0
3,
0
3, 1
1,
0
3, 1
0
Su questo grafo si deve determinare
il cammino di costo minimo
tra il nodo 1 (unico elemento di O(x2))
4
1,
2
4
4, 3
3, 1
0
ej(x)
2, 4
4, 1
e il nodo 6 (unico elemento di D(x2)).
Poiché tutti i costi sono nonnegativi,
si usa l’algoritmo di Dijkstra
6
–5
dati del problema SPT
7
1
3
4
3
1
4
2
5
1
1
0
0
1
3
4
6
(i, j)
(1, 4)
(1, 5)
(2, 1)
(2, 4)
(2, 5)
(3, 2)
(3, 4)
(4, 3)
(5, 4)
(5, 6)
(6, 3)
cij′
7
3
1
4
1
1
0
0
3
1
4
Inizializzazione
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
Q={1}
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
Iterazione 1
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
0
7
3
Q = { 4, 5 }
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
si parte dal nodo 1,
ma si percorrono gli archi di G’
e non gli archi fittizi
Iterazione 2
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
2
0
7
6
3
3 4
Q = { 4, 6 }
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
2
5
5
Iterazione 3
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
2
3
0
7
6
8
Q = { 3, 4 }
3
3 4
4
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
2
5
5
3
6
Iterazione 4
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
2
3
4
0
7
6
8
6
6
Q={3}
3
3 4
4
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
2
5
5
3
6
4
4
Iterazione 5
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
2
3
4
5
0
7
6
7
8
6
6
Q={2}
6
3
3 4
4
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
2
5
5
3
6
4
4
5
3
Iterazione 6
d
nodi
iter. 1 2 3 4 5 6
0
0 M M M M M
1
2
3
4
5
6
0
7
6
7
7
8
6
6
6
3
3 4
4
p
nodi
iter. 1 2 3 4 5 6
0 nil 1 1 1 1 1
1
1 1
2
5
5
3
6
4
4
5
3
6
Q = ∅ : l’algoritmo di Dijkstra termina
Albero dei cammini minimi
d1 = 0
1
4
d2 = 7 2
d3 = 6
3
d4 = 6
5
d5 = 3
6
d6 = 4
Il cammino di costo minimo dal nodo 1 al nodo 6 ha costo 4
Inviamo il flusso aggiuntivo lungo il cammino 1 – 5, 5 – 6 .
Capacità del cammino 1 – 5, 5 – 6 :
θ(P, x2) = min {u15 – x15 , u56 – x56 } = min {5 , 4} = 4
Quantità θ di flusso aggiuntivo che si può inviare da s = 1 a t = 6 :
θ = min { θ(P, x2) , e1(x2) , – e6(x2) } = min {4, 5, –(–5) } = 4
Si ottiene lo pseudoflusso x3 rappresentato in figura
bi , ei
–5,1
0
2
4
5
0
4
3
0
0 – (– 5) – 5 = 0
3–0–3=0
0
0
0, 0
i
3, 0
0
4
1
xij
3
– 5, 0
2
6
7, – 1
0, 0
j
bj , ej
Calcolo degli sbilanciamenti ai nodi nello pseudoflusso x3
nodo entrata – uscita – deficit
1
0
–4
5
1
2
0
0
0
0
3
0
– (3+2)
5
0
4
3
0
–3
0
5
4
–4
0
0
6
2+4
0
–7
–1
nodi con eccedenza di flusso : Ox = { 1 }
nodi con difetto di flusso : Dx = { 6 }
sbilanciamento complessivo : g(x) = 1 ≠ 0
Occorre trovare un cammino aumentante di costo minimo P
dal nodo 1 al nodo 6
Si costruisce il grafo residuo Gx associato allo pseudoflusso x2 :
1
0, 2, 7
1
4,
5,
0, 3, 1
2
4
j
i
4
0
0, 4, 3
5
0
0
4, 4, 1
3, 1
0
2
3, 1
0 3
2, 2, -4
0 3
6
–1
ex(j)
j
2, 7
1
3,
0, 3, 1
uij’, cij’
5
0, 3, 1
4,
0
1,
,
0
3
ex(i)
1, 3
4,
–3
4
,
1
4
0
4, 3
5
0
3, 1
0
i
ex(j)
3,
xij, uij, cij
1,
0
ex(i)
2, 4
4, –1
6
–5
Determinare l’albero dei cammini minimi a partire dal nodo 1
Vi sono costi sono negativi: algoritmo di Bellman
cij’
i
7
1
3
–3
1
4
3
4
2
j
5
1
–1
0
0
1
3
4
6
Inizializzazione
d1 = 0
1
2
d2 = M
3
d3 = M
4
d4 = M
5
d5 = M
6
d6 = M
Q={1}
Iterazione 1: da Q si sceglie il nodo 1, Q = ∅
FS (1) = { (1, 4), (1, 5) }
• d1 + c14 = 0 + 7 < M = d4
⇒
d4 = 7 e Q = { 4 }
• d1 + c15 = 0 + 3 < M = d5
⇒
d5 = 3 e Q = { 4, 5 }
d1 = 0
1
2
d2 = M
d3 = M
3
4
d4 = 7
5
d5 = 3
6
d6 = M
Q = { 4, 5 }
Iterazione 2: da Q si sceglie il nodo 4, Q = { 5 }
FS (4) = { (4, 3) }
• d4 + c43 = 7 + 0 < M = d3
⇒
d3 = 7 e Q = { 5, 3 }
d1 = 0
1
4
d4 = 7
2
d2 = M
5
d5 = 3
3
6
d6 = M
d3 = 7
Q = { 5, 3 }
Iterazione 3: da Q si sceglie il nodo 5, Q = { 3 }
FS (5) = { (5, 4) }
• d5 + c54 = 3 + 3 < 7 = d4
⇒
d4 = 6 e Q = { 3, 4 }
d1 = 0
1
4
d4 = 6
2
d2 = M
5
d5 = 3
3
6
d6 = M
d3 = 7
Q = { 3, 4 }
Iterazione 4: da Q si sceglie il nodo 3, Q = { 4 }
FS (3) = { (3, 2), (3, 4) }
• d3 + c32 = 7 + 1 < M = d2
⇒
d2 = 8 e Q = {4, 2 }
• d3 + c34 = 7 + 0 > 6 = d4
d1 = 0
d2 = 8
d3 = 7
1
4
d4 = 6
2
5
d5 = 3
3
6
d6 = M
Q ={ 4, 2 }
Iterazione 5: da Q si sceglie il nodo 4, Q = { 2 }
FS (4) = { (4, 3) }
• d4 + c43 = 6 + 0 < 7 = d3
d1 = 0
d2 = 8
d3 = 6
⇒
d3 = 6 e Q = {2, 3 }
1
4
d4 = 6
2
5
d5 = 3
3
6
d6 = M
Q = { 2, 3 }
Iterazione 6: da Q si sceglie il nodo 2, Q = { 3 }
FS (2) = { (2, 1), (2, 4), (2, 5) }
• d2 + c21 = 8 + 1 > 0 = d1
• d2 + c24 = 8 + 4 > 6 = d4
• d2 + c25 = 8 + 1 > 3 = d5
d1 = 0
d2 = 8
d3 = 6
1
4
d4 = 6
2
5
d5 = 3
3
6
d6 = M
Q={3}
Iterazione 7: da Q si sceglie il nodo 3, Q = ∅
FS (3) = { (3, 2), (3, 4) }
• d3 + c32 = 6 + 1 < 8 = d2 ⇒
d2 = 7 e Q = { 2 }
• d3 + c34 = 6 + 0 = 6 = d4
d1 = 0
d2 = 7
d3 = 6
1
4
d4 = 6
2
5
d5 = 3
3
6
d6 = M
Q={2}
Iterazione 8: da Q si sceglie il nodo 2, Q = ∅
FS (2) = { (2, 1), (2, 4), (2, 5) }
• d2 + c21 = 7 + 1 > 0 = d1
• d2 + c24 = 7 + 4 > 6 = d4
• d2 + c25 = 7 + 1 > 3 = d5
d1 = 0
d2 = 7
d3 = 6
1
4
d4 = 6
2
5
d5 = 3
3
6
d6 = M
Q=∅
L’algoritmo di Bellman è terminato senza trovare un cammino
dal nodo 1 al nodo 6
Il nodo 6, rispetto al grafo residuo associato allo pseudoflusso x2 ,
non è connesso.
Il problema di flusso di costo minimo
(che stavamo risolvendo con SSPT)
non ha soluzione ammissibile.
Fly UP