...

2.1. Flusso di costo minimo e cammini minimi.

by user

on
Category: Documents
18

views

Report

Comments

Transcript

2.1. Flusso di costo minimo e cammini minimi.
1 . Alg o r it m i p e r p r o b le m i d i flu s s o s u r e t i
ROC-00/01 Capitolo 1
1.1. Il problema di flusso di costo minimo
Questi appunti sono da considerare una evoluzione degli appunti di Programmazione
Matematica; pertanto si eviterà di ripetere definizioni e concetti già contenuti negli altri appunti,
salvo quando necessario per garantire una chiarezza espositiva
1.1.1
Un esempio
Si assuma che un dato progetto sia decomponibile in un insieme di n attività, i=1,…,n. È dato il
tempo di che l'attività i richiede per essere eseguita. Inoltre, per ogni attività i sono noti gli
insiemi P(i) e S(i) delle attività che rispettivamente precedono e seguono i nel progetto, cioè che
devono terminare prima che inizi l'attività i e che non possono iniziare prima che sia completata
l'attività i. Si vogliono determinare i tempi di inizio delle attività in modo che il tempo di
completamento del progetto sia minimo. Senza ledere la generalità, si può assumere che l'attività
1 non sia preceduta da alcuna attività e che la attività n non sia seguita da altre attività del
progetto; infatti, in caso contrario, è sufficiente aggiungere due attività fittizie di durata nulla, una
che precede e l'altra che segue tutte le attività del progetto. Il problema può essere formulato
come problema di PL nel seguente modo.
(1.1.1)
min πn - π1
πj - πi ≥ di,
j ∈ S(i ),
i =1,…,n,
dove πi indica il tempo di inizio della attività i. Infatti i vincoli del problema implicano che la
attività i sia conclusa prima dell'inizio delle attività che la seguono (πi + di ≤ πj, j ∈ S(i )). La
funzione obiettivo, a meno della costante dn, rappresenta la durata del progetto. Indicando con xij
la variabile duale associata al vincolo di indici i, j, il duale del problema (1.1.1) è:
max∑
n
∑ dixij
i=1 j∈S(i)
(1.1.2)
-1,

∑ xji - ∑ xij =  1,
j∈P(i)
j∈S(i)
 0,
xij ≥ 0
i =1,
i =n,
altrimenti,
i = 1,…, n,
j ∈ S(i ),
Poiché, come è immediato verificare, la relazione di precedenza costituisce un ordinamento
parziale sull'insieme delle attività, si può associare al problema il grafo orientato G = (N, A), dove
il nodo i ∈ N corrisponde alla attività i, i = 1,…, n e: ak = (i,j) ∈ A ⇒ l'attività i precede l'attività j
(l'attività j segue l'attività i ). Assumiamo che sia |A | = m.
In figura 1.1 è mostrata una istanza del problema, la relativa coppia di problemi duali e il grafo
associato.
Il problema (1.1.2) è detto problema di flusso. Infatti le variabili x ij possono essere
interpretate come flussi per unità di tempo di beni (messaggi, passeggeri, litri di acqua,...)
interpretando il grafo G come una rete (di comunicazione, di trasporto, idraulica,...).
È immediato verificare (vedi figura 1.1.1) che la matrice dei vincoli del problema (1.1.2) è
la matrice di incidenza E = [eik] del grafo G. I vincoli del problema implicano che il flusso
entrante nel nodo i (Σj∈P(i) xji) sia uguale al flusso uscente dal nodo i (Σj∈S(i) xij). Si osservi
che per il nodo origine (i = 1) e per il nodo destinazione (i = n) l'offerta e la domanda sono
uguali a 1, mentre tutti gli altri nodi sono di trasferimento. Il problema consiste nel determinare
un flusso ammissibile di costo massimo.
4
ROC-00/01 Capitolo 1
x
Attività
1
2
3
4
Durata Attività che
seguono
3
4
2
0
(1,2) (1,3) (2,3)
2,3
3,4
4
π 2
∅
4
1
3
-1
1
0
0
-1
0
1
0
3
3
max
min
(2,4) (3,4)
0
-1
1
0
0
-1
0
1
0
0
-1
1
4
4
2
∨/
=
-1
0
0
1
2
4
3
1
4
1
3
4
1
2
3
Figura 1.1.1
Il problema (1.1.1), duale del problema di flusso, è detto anche problema di potenziale. Si
tratta di determinare un potenziale πi per ogni nodo del grafo in modo che la differenza di
potenziale di ogni coppia di nodi che corrispondono ad un arco di G non sia inferiore al costo
dell'arco. Si vuole minimizzare la differenza di potenziale tra il nodo destinazione e il nodo
origine. Nella letteratura il problema di flusso è usualmente indicato come problema primale e il
problema di potenziale come duale. Nel seguito adotteremo questa convenzione.
1.1.2 Formulazione del problema di flusso di costo minimo
Sia G = (N, A), con |N| = n e |A| = m, un grafo orientato e pesato; associati a G vi sono i vettori
di bilancio b = [bi], di costo c = [cij] e di capacità superiore u = [uij]. Inoltre, con E = [eik]
indichiamo la matrice di incidenza e con FS(i) e BS(i) rispettivamente la stella uscente e la stella
entrante del nodo i, i = 1 ,…, n.
Il problema (primale) di flusso di costo minimo è allora:
(P)
(1.1.3)
Min cx
Ex = b
0≤x≤u
e il suo duale (problema di potenziale) è:
(D)
Max
(1.1.4)
πb - µu
πE - µ ≤ c
µ≥0
o, in forma estesa:
(D)
Max ∑ πibi i∈N
∑ µijuij
(i,j)∈A
πj - πi - µij ≤ cij,
µij
≥ 0,
per ogni (i,j) ∈ A
per ogni (i,j) ∈ A.
5
ROC-00/01 Capitolo 1
1.1.3 Trasformazione in formulazioni equivalenti
Nel corso di Programmazione Matematica si è visto come è sempre possibile trasformare un
problema di flusso di costo minimo, senza perdita di generalità, per ottenere un problema con
capacità inferiori nulle, oppure con singola origine e singola destinazione, o anche come
problema di circolazione.
Nel seguito mostriamo altre due trasformazioni che risultano utili in particolari casi.
Uguaglianza tra domanda ed offerta
Si supponga che il problema che si vuole rappresentare abbia una domanda globale diversa
dall'offerta globale. Si studia cioè un problema in cui, se la domanda è maggiore dell'offerta, si
intende soddisfare al massimo la domanda, lasciandone una parte insoddisfatta a causa di
carenze dell'offerta. Analogamente, per il caso opposto in cui si ha un'offerta maggiore della
domanda, si intende soddisfare tutta la domanda non utilizzando la parte di offerta eccedente.
Una diretta formulazione del problema in termini di problema di flusso di costo minimo su
un grafo G sarebbe:
(P1)
Min cx
E ix
≤ bi,

= bi,
se bi >0,
altrimenti,
per ogni i∈N
0≤x≤u
dove eb = Σi∈N bi > 0, se si ha eccesso di domanda; oppure il problema:
(P2)
Min cx
E ix
≥ bi,

= bi,
se bi <0,
altrimenti,
per ogni i∈N
0≤x≤u
dove eb = Σi∈N bi < 0, in caso contrario. Si vuole trasformare (P1) o (P2) in un problema di
flusso equivalente (P') con la proprietà che eb' = 0:
(P')
(1.1.5)
Min c'x'
E'x' = b'
0 ≤ x' ≤ u'
Si trasforma G in un grafo ampliato G' con un nodo fittizio n+1 il cui bilancio è dato da:
b'n+1 = - ∑ bi.
i∈N
Inoltre:
- per il problema (P 1 ) il nodo n+1 è un origine (b'n +1 < 0) ed è connesso con ogni
destinazione i mediante un arco fittizio (n+1,i);
- per il problema (P2) il nodo n+1 è una destinazione (b'n +1 > 0) ed è connesso con ogni
origine i mediante un arco fittizio (i,n+1).
Gli archi fittizi hanno capacità superiore +∞ e costo nullo. Sia E' la matrice di incidenza di
G'; siano inoltre c', u' e b' i dati associati agli archi ed ai nodi di G'. Indicando con x' il vettore
dei flussi su G' si ottiene la formulazione (1.1.5); ovviamente eb' = 0.
Esempio 1.1.1
Il grafo originario sbilanciato ed il grafo ampliato:
6
ROC-00/01 Capitolo 1
4
Σ bi = -11 < 0
−10
(1,2)
a1
1
(3,4)
a2
(0,+∞)
2
a3
−5
−10
3
b3
4
(0,+∞)
(1,2)
a1
1
(3,4)
(2,3)
11
a2
2
a3
−5
(2,3)
3
4
( cij ,uij )
Figura 1.1.2
Esercizio 1.1.1
Dimostrare che il problema (P') è equivalente ai problemi (P1) e (P2).
Forte connessione del grafo
Dato un grafo G non fortemente connesso su cui è definito un problema di flusso (P), è
possibile ampliare G in un grafo fortemente connesso G' su cui è definito un problema di flusso
(P') equivalente a (P). Per ottenere G' è sufficiente aggiungere un nodo fittizio n+1 ed una
coppia di archi fittizi (i,n+1) e (n+1,i) per ciascun nodo i. Il nodo fittizio è un nodo di
trasferimento, gli archi fittizi hanno capacità +∞ e costo M, con M maggiore del costo di
qualunque cammino semplice (ad esempio M = 1 + (n-1)cmax, dove cmax è il massimo costo
degli archi originari). Il problema di flusso (P') sul grafo ampliato G' è equivalente al problema
(P) su G. Infatti, se (P) è non vuoto (esiste almeno una soluzione ammissibile), allora qualunque
soluzione ammissibile per (P) è ammissibile per (P') e qualunque soluzione ammissibile per (P')
che non utilizzi gli archi fittizi è ammissibile anche per (P) e ha lo stesso valore della funzione
obiettivo. Pertanto se la soluzione ottima per (P') non utilizza gli archi fittizi allora essa è ottima
anche per (P), altrimenti, cioè se almeno un arco fittizio è utilizzato, (P) è vuoto.
Esercizio 1.1.2
Dimostrare le asserzioni fatte.
Esercizio 1.1.3
Dimostrare l'equivalenza tra i due problemi (P) e (P').
Esercizio 1.1.4
Nel caso che (P) sia vuoto, quale interpretazione può essere data alla soluzione ottima di (P')?
1.1.4 Matrice di base ed albero di base
Nel seguito tratteremo il caso del problema di flusso con capacità inferiori nulle (1.1.3); la
generalizzazione al problema di flusso con capacità inferiori qualsiasi è facilmente deducibile.
Consideriamo la coppia di problemi duali di flusso e di potenziale definita su un grafo
orientato G = (N, A), |N |=n, |A |=m, formulati in (1.1.3) e in (1.1.4) e che riscriviamo; il
problema (primale) di flusso di costo minimo e il problema (duale) di potenziale sono:
(P)
Min cx
Ex = b
0≤x≤u
(D) Max πb - µu
πE - µ ≤ c
µ≥0
Assumeremo nel seguito, senza ledere la generalità, che il grafo G sia connesso e cioè che
esista un albero di copertura.
Sia B ⊆ {1, 2, …, m} un sottoinsieme dell'insieme degli indici di colonna di E, tale che |B|
= n-1 e che il grafo parziale TB = (N, AB) sia un albero. L'albero è un albero di copertura ed è
detto albero di base. Indicheremo con EB la matrice di incidenza di TB; ovviamente EB è una
sottomatrice di E, formata dalle n righe e da n-1 colonne della matrice E.
7
ROC-00/01 Capitolo 1
Teorema 1.1.1
EB ha rango massimo: r(EB) = n-1.
Dim.
Si consideri una funzione di visita posticipata vp su TB. Si costruisca la matrice ÊB, permutando
le righe e le colonne di EB, in base all'ordinamento dei nodi e degli archi indotto da vp e cioè gli
indici delle righe di ÊB sono Vp[r], Vp[Vp[r]], Vp[Vp[Vp[r]]], … , e gli indici delle colonne
(P[Vp[r]],Vp[r]), (P[Vp[Vp[r]]],Vp[Vp[r]),…(1).
Siano i e (i,P[i]) rispettivamente l'indice della riga e della colonna k-esima di Ê B. La
colonna k-esima conterrà nelle posizioni da 1 fino a k-1 elementi nulli, poiché i corrispondenti
nodi precedono i nella visita. L'elemento k sarà +1 o -1 a seconda dell'orientamento dell'arco
(cioè se P[i] > 0 o P[i] < 0). Di conseguenza la matrice ÊB è una matrice triangolare inferiore.
Osserviamo infine che se si rimuove l'ultima riga di ÊB, cioè quella corrispondente al nodo r, si
ottiene una matrice quadrata, di ordine n-1, triangolare inferiore con gli elementi della diagonale
non nulli. Pertanto, r(EB) = r(ÊB) = n-1. ♦
Esempio 1.1.2
Si considerino l'albero e la visita posticipata in figura 1.3:
1
2
4
3
5
7
8
6
9
N va -1
1 8
2 7
3 1
4 2
5 4
6 3
7 9
8 5
9 6
Figura 1.1.3
Le matrici EB e ÊB sono:
N (1,2) (1,3) (2,4) (2,5) (3,6) (3,7) (5,8) (6,9)
1 -1
-1
2
1
-1
-1
3
1
-1
-1
4
1
EB = 5
1
-1
6
1
-1
7
1
8
1
9
1
N (5,8) (2,5) (2,4) (1,2) (3,7) (6,9) (3,6) (1,3)
8 1
5 -1
1
(1) Ricordiamo che se, ad esempio, P[Vp[r]] < 0, allora l'arco e conseguentemente l'indice della colonna è
(Vp[r]),P[Vp[r]]).
8
ROC-00/01 Capitolo 1
4
2
ÊB = 7
9
6
3
1
1
-1
-1
1
1
1
-1
1
-1
-1
-1
1
-1
Esercizio 1.1.5
Dato il grafo in figura 1.1.4, determinare un albero di copertura TB, la sua matrice di incidenza EB e la matrice
permutata ÊB.
-3
2
(8,9)
−10
(1,3)
1
(3,14)
(3,6)
3
5
(cij , u ij)
(2,12)
4
8
Figura 1.1.4
Corollario 1.1.2
Il rango della matrice E è uguale a n-1.
Dim.
È infatti immediato osservare che la somma delle righe di E è il vettore nullo.♦
Osservazione 1.1.1
Il grafo può essere ampliato in modo tale che la matrice di incidenza E' del grafo ampliato sia di rango n. È
sufficiente aggiungere un particolare arco artificiale (0,r), la cui coda sia un nodo non esistente e la testa sia un
nodo che verrà assunto come radice degli alberi di copertura. L'aggiunta di (0,r) corrisponde all'aggiunta alla
matrice E della colonna er =[0,0,…,1,0,…,0], avente la sola componente r-esima = 1. Ogni albero di copertura
TB conterrà l'arco artificiale (0,r) e la corrispondente matrice di incidenza E'B è una matrice quadrata di ordine e di
rango n. Pertanto, la matrice ampliata E' = [E,er ] è di rango n.
Alternativamente la matrice E può essere ridotta ad una nuova matrice E", eliminando una riga, ad esempio
la riga r, al fine di far coincidere il numero di righe (n-1) con il suo rango. Ogni albero di copertura TB avrà il
nodo r come radice e la corrispondente matrice di incidenza E"B è una matrice quadrata di ordine e di rango n-1.
Teorema 1.1.3
Vi è corrispondenza biunivoca tra gli alberi di copertura del grafo ampliato TB e le matrici di
base E'B = [EB,er].
Dim.
Abbiamo mostrato che ad ogni albero di copertura TB corrisponde una matrice E'B = [EB,er]
quadrata e di ordine e rango n: cioè una matrice di base per il problema di flusso corrispondente.
Mostriamo ora che, data una matrice di base E'B = [E B,er], ad essa corrisponde un albero di
copertura T B . Consideriamo il grafo parziale G B = (N,A B ) associato ad E'B ; tale grafo ha
esattamente n nodi ed n archi, compreso l'arco fittizio (0,r). Supponiamo per assurdo che G
contenga un ciclo C formato dagli archi di indice i1, i2, …, ih. Con EC indichiamo la matrice di
incidenza formata da tutte e sole le colonne corrispondenti agli archi di C. Inoltre, dato
arbitrariamente un verso di percorrenza del ciclo, siano C+ e C- i due sottoinsiemi degli indici
degli archi di C rispettivamente concordi e discordi con il verso di percorrenza. Si ponga il valore
del moltiplicatore λj, per j=1, 2, …, h, nel seguente modo:
9
ROC-00/01 Capitolo 1

λj = 

1, se l'arco di indice j appartiene a C+,
-1, se l'arco di indice j appartiene a C-.
Il prodotto EC λ = 0 (è infatti facile verificare, per ogni riga i di EC, e cioè per ogni nodo i
del ciclo C, che esistono due sole componenti non nulle che indichiamo con j e k, che
corrispondono ai due archi incidenti in i, quando moltiplicate per i rispettivi coefficienti λj e λk,
forniscono due valori unitari ma di segno opposto); pertanto E C è formata da h colonne
linearmente dipendenti. Ciò implica che E'B non può essere una matrice di base e che pertanto
GB è un albero. ♦
Soluzioni di base complementari
Nel calcolo delle soluzioni di base complementari associate ad una matrice di base E'B e più in
generale nelle operazioni che vengono svolte dall'algoritmo del simplesso nelle sue diverse
versioni, svolge un ruolo particolarmente importante la soluzione di sistemi del tipo:
(1.1.6)
(1.1.7)
EBx = ξ,
π EB = η,
dove ξ e η sono due vettori di termini noti. Data la loro struttura, tali sistemi sono risolvibili in
modo efficiente attraverso una visita posticipata (1.1.6) e anticipata (1.1.7).
Iniziamo con il sistema (1.1.6). Interpretando il vettore ξ come vettore di bilancio ed il
vettore x come flusso, si tratta di determinare un flusso sull'albero TB che soddisfi il particolare
vettore di bilancio ξ.
Osserviamo che se u è un nodo foglia (in particolare il primo nodo di una visita
posticipata), allora esiste un unico arco incidente in u. Il valore del flusso su tale arco è dato per
(1.1.6) da:
xp(u),u = ξu,
se p(u)>0,
xu,-p(u) = -ξu, se p(u)<0.
Ai fini del calcolo del flusso sugli altri archi è sufficiente aggiornare la componente del
vettore corrispondente al nodo come segue:
ξ|p(u)| := ξ|p(u)| + ξu,
e proseguire selezionando il nodo successivo nella visita. Si osservi che in questo modo esisterà
sempre un unico arco incidente nel nodo selezionato il cui flusso deve ancora essere
determinato. La procedura, la cui complessità è O(n) poiché ogni nodo di TB viene esaminato
una sola volta, può essere formalizzata come segue:
Procedura Flusso_di_base (TB,r,P,Vp,ξ,x):
begin
u:=Vp[r];
while u≠r do
begin if P[u] >0 then x[P[u],u]:= ξ[u] else x[u,-P[u]]:= -ξ[u];
ξ[|P[u]|] = ξ[|P[u]|] + ξ[u]; u:=Vp[u] end
end.
Figura 1.1.5 - La procedura Flusso_di_base
Consideriamo adesso il sistema (1.1.7). Se attribuiamo alle componenti di η il significato
di differenza di potenziale sui corrispondenti archi di TB, il vettore π può essere interpretato
come un vettore di potenziali da assegnare ai nodi dell'albero in modo da realizzare le richieste
10
ROC-00/01 Capitolo 1
differenze di potenziale sugli archi. Osserviamo che avendo in questo caso il sistema n variabili
ed n-1 vincoli, si ha un grado di libertà che può essere eliminato ponendo ad esempio πr = 0. Il
sistema può essere risolto mediante una visita anticipata di TB come mostrato dalla seguente
procedura, di complessità O(n):
Procedura Potenziale_di_base (TB,r,P,Va,c,π):
begin
π[r]:=0; u:=Va[r];
while u≠r do begin if P[u] >0 then π[u]:=π[P[u]] + c[P[u],u] else π[u]:=π[-P[u]] - c[u,-P[u]];
u:=Va[u] end
end.
Figura 1.1.6 - La procedura Potenziale_di_base
Soluzione di base primale
Essendo il problema di flusso (1.1.3) un problema di P.L. a variabili limitate, una base per la
coppia di problemi duali (1.1.3) e (1.1.4) è individuata dalla partizione degli indici degli archi di
A in (B,L,U), dove B individua l'albero di copertura TB e (L,U) è una partizione degli indici degli
archi fuori base tali che:
 0, se h ∈ L,
xh = 
uh, se h ∈ U.
La soluzione di base primale associata è quindi:
(1.1.8)
 x_B 
_ _ 
x = x 
L
 x_ 
U
_
_
_
_
dove x L = 0, x U = uU e x B è soluzione di EB x B = b - EUuU.
_
Per il calcolo della soluzione di base primale o flusso di base, x , corrispondente alla
matrice di base EB è sufficiente applicare la procedura Flusso_di_base con ξ = b – EUuU. La
_
soluzione x così determinata è un flusso e, per costruzione, soddisfa i vincoli di conserva-zione
del flusso e, per gli archi fuori base , cioè {ah: h ∈ L ∪ U}, soddisfa anche i vincoli di capacità.
_
Il flusso di base x è ammissibile se sono soddisfatti anche i vincoli di capacità per gli archi in
base:
_
(1.1.9)
0 ≤ x B ≤ u B.
Esempio 1.1.3
Sia B = {2, 3, 6, 7}, L = {1, 4}, U = {5} la base del grafo in figura 1.1.7 dove:
c = [ 2 3 5 -3 -1 2 4],
 45
1
u =  2,
 47
3
11
 -50
b = -6
 38
ROC-00/01 Capitolo 1
(cij , u ij)
a
(2,4)
a
3
a5
(5,1)
1
7
3
(4,3)
(-1,4)
a
5
a 2 (3,5)
-6
TB
1
3
4
a2
a1
-5
a4
(-3,2)
2
n =5, m=7
3
(2,7)
a6
5
8
r =1
a3
6
2
a7
4
Figura 1.1.7 - La procedura Potenziale_di_base
_
_
_
Il valore del flusso sugli archi fuori base è x 12 = x 24 = 0, x 34 = u34 = 4. Infine, ξ = b -E U uU è dato da
ξ i = b i, i = 1, 2, 5; ξ 3 = b 3 + u34 = -2; ξ 4 = b 4 - u 34 = -1. L'applicazione della procedura Flusso_di_base
fornisce:
_
_
x 23 = -ξ2 = 0;
ξ3 = -2;
x 45 = -ξ4 = 1;
ξ5 = 8 - 1 = 7;
_
_
x 35 = ξ 5 = 7;
ξ3 = -2 + 7 = 5;
x 13 = ξ 3 = 5;
ξ1 = -5 + 5 = 0.
Si ha quindi:
_
xB =
 5
 0 _
  ; x =  0 ; x_ = [4];
 7 L  0 U
 
 1
_
0 ≤ x B ≤ uB, pertanto il flusso è ammissibile.
 05
0
_
x =  0 ;
 47
1
Soluzione di base duale
__
_
La soluzione di base duale associata alla base (B, L, U ), è data da (π,µ) dove π è soluzione del
sistema :
_
(1.1.10) π EB = cB,
_ _ _ _
e µ = (µB, µL, µU ) è data da:
_
_
_
_
µB = µL = 0,
µU = πEU - cU
_
Per il calcolo di π, indicato come potenziale di base, è sufficiente applicare la procedura
Potenziale_di_base con η = cB. Ricordiamo che è necessario fissare il potenziale di un nodo (ad
_
_
es. πr = 0) perché π sia univocamente determinato.
__
Affinché la soluzione (π,µ) sia ammissibile devono essere verificate le condizioni:
_
_
(1.1.11) π EL - µL ≤ cL,
_
_
(1.1.12) µU = πEU - cU ≥ 0.
__
_
Poiché µL = 0, la soluzione (π,µ) è ammissibile se e solo se sono verificati i vincoli:
_ _
π j - πi ≤ cij;
per ogni ah = (i,j) tale che h ∈ L;
_ _
π j - πi ≥ cij;
per ogni ah = (i,j) tale che h ∈ U.
_ _
_
Chiameremo c ij = cij + πi - πj il costo ridotto dell'arco (i,j). Si osservi che il costo ridotto
degli archi in base, cioè {ah: h ∈ B}, è nullo per costruzione. Quindi, la soluzione duale di base
è ammissibile se e solo se per gli archi fuori base valgono le seguenti relazioni:
12
ROC-00/01 Capitolo 1
(1.1.13)
_
c ij ≥ 0
_
c ij ≤ 0
per ogni ah = (i,j) tale che h ∈ L;
per ogni ah = (i,j) tale che h ∈ U.
_
Poiché
la componente µ della soluzione duale di base è determinata univocamente dato il
_
vettore π, nel seguito_ le soluzioni duali di base verranno indicate semplicemente per mezzo del
vettore di potenziale π.
Esempio 1.1.3 (continua)
Applicando la procedura Potenziale_di_base al problema fornito in figura 1.1.7 si ha:
_
_
_
_
_
π 1 = 0;
π 3 = π1 + c13 = 0 + 3 = 3;
π 5 = π3 + c35 = 3 + 2 = 5;
_
_
_
_
π 4 = π5 - c45 = 5 - 4 = 1;
π 2 = π3 - c23 = 3 - 5 = -2.
Inoltre, i costi ridotti degli archi fuori base sono:
_
_
c 12 = 2 + 0 + 2 = 4;
c 24 = -3 - 2 - 1 = -6;
_
essendo (2,4)∈ L e c 24 < 0, la soluzione duale non è ammissibile.
_
c 34 = -1 + 3 - 1 = 1;
I problemi di flusso di costo minimo costituiscono una classe importante dei problemi di
PL in quanto, se i dati sono interi, anche le soluzioni di base complementari hanno componenti
intere come mostrato dal seguente teorema.
Teorema 1.1.4
Se i costi, le domande e le capacità del grafo sono valori interi, allora ogni coppia di soluzioni di
base complementari ha componenti a valori interi.
Dim
La dimostrazione segue immediatamente osservando che la matrice di base ha determinante ±1
o, equivalentemente, osservando che le operazioni aritmetiche effettuate nelle procedure
Flusso_di_base e Potenziale_di_base sono solo somme e sottrazioni. ♦
1.1.5 Intorno di una base
È possibile individuare, nell'intorno di una base di un problema di flusso di costo minimo
primale (duale) ammissibile, una base adiacente primale (duale) ammissibile che migliora la
funzione obiettivo (o, in caso di degenerazione, con uguale valore della funzione obiettivo).
Sviluppiamo in termini di operazione su alberi sia l'individuazione delle basi adiacenti, sia il
calcolo delle soluzioni di base complementari corrispondenti alla base adiacente per mostrare
come la particolare struttura del problema renda più efficienti alcune di queste operazioni. Alla
fine del paragrafo saranno fornite le indicazioni necessarie per ottenere le basi adiacenti.
Flusso adiacente ammissibile
Assumiamo che (B, L, U) definisca un flusso di base ammissibile e un potenziale di base non
ammissibile. La non ammissibilità del potenziale di base implica che esiste un indice k tale che:
_
(1.1.14) o ∃ ak = (p,q) e k ∈ L
con c pq < 0,
_
(1.1.15) oppure ∃ ak = (p,q) e k ∈ U
con c pq > 0.
L' indice k è l'indice dell'arco entrante in base. L'aggiunta di ak a TB determina un ciclo C.
Si fissa un verso sul ciclo (vedi figura 2.4.9) come segue:
- se k ∈ L, il verso del ciclo è concorde con quello di ak;
13
ROC-00/01 Capitolo 1
-
se k ∈ U, il verso del ciclo è discorde con quello di ak.
ak
ak
k∈U
k∈L
Figura 1.1.8
Indichiamo con C + e C - gli indici degli archi del ciclo C che sono concordi e,
rispettivamente, discordi con il verso fissato. Si consideri il flusso x(θ) definito da:
_
+
 x_ij + θ, se (i,j) ∈ C ,
xij (θ) =  x ij - θ, se (i,j) ∈ C-,
 x_ ,
se (i,j) ∉ C,
ij
dove θ è un reale non negativo.
È immediato verificare che x(θ) soddisfa, per ogni θ, i vincoli di conservazione del flusso.
Consideriamo la funzione obiettivo:
_
cx(θ)=c x + θ ( ∑ cij - ∑ cij ) .
(i,j)∈C+ (i,j)∈COsserviamo che è
_ _
cij = πj - πi,
∀(i,j) ∈ C \ {(p,q)};
_
infatti C \{(p,q)} ⊆ AB e πEB = cB. Si ha quindi sostituendo:
_ _
_
c
+
π
π
=
c
se k ∈ L,
 pq
p
q
pq,
∑ c+ij - ∑ - cij = -c - _π + π_ =- c_ , se k ∈ U.
 pq p
q
pq
(ij)∈C
(ij)∈C
_
Quindi il costo ridotto c pq fornisce la variazione di costo del flusso al seguito di una
variazione unitaria di flusso sul ciclo C. Dalle (1.1.14) e (1.1.15) si ha allora che:
_
cx(θ) ≤ c x ,
∀θ ≥0.
Affinché x(θ) sia ammissibile devono
_ essere verificati i vincoli 0 ≤ xij(θ) ≤ uij, (i,j) ∈ C. I
vincoli precedenti sono soddisfatti se θ ≤ θ = min{θ1,θ2}, dove
_
_
θ1 = min{uij - x ij , (i,j) ∈ C+};
θ2 = min{ x ij , (i,j) ∈ C-}.
Infatti θ ≤ θ1 impedisce che il flusso violi la capacità superiore negli archi del ciclo concordi col
verso fissato, e θ ≤ θ2 impedisce che il flusso assuma valori negativi negli archi del ciclo discordi
col verso fissato(1). Il flusso
_
(1) Si noti che per problemi di flusso con capacità illimitata può risultare θ=+∞. In tal caso il problema di flusso
non è inferiormente limitato e il problema di potenziale è vuoto.
14
ROC-00/01 Capitolo 1
(1.1.16)
_
x' = x(θ)
è un flusso di base. Infatti ad esso è associata la base (B', L', U') adiacente a (B, L, U) determinata
come segue. _
_
Il valore θ corrisponde ad almeno un arco ah= (i,j) del ciclo C per cui xij(θ) assume valore
uguale a zero o alla capacità superiore. L'arco ah è l'arco uscente dalla base.
Posto B'= B \ {h} ∪ {k} si ha che TB' è per costruzione
un albero. Si osservi che se h = k
_
+
allora T B' = T B . Inoltre se a h ∈ C , allora_ x ij(θ ) = u ij e quindi h dovrà essere aggiunto
all'insieme U; altrimenti, se ah ∈ C-, allora xij(θ) = 0 e quindi h dovrà essere aggiunto all'insieme
L. L'indice della variabile entrante in base dovrà essere eliminato da L o da U a seconda che si
verifichi il caso (1.1.14) o il_ caso (1.1.15). Riassumendo,
_
_ una base adiacente (B', L', U') che
individua la soluzione x' = x(θ) ammissibile con cx(θ) ≤ c x è data da:
B' = B \ {h} ∪ {k}
(1.1.17)
(L ∪ {h} \ {k},U ), se k ∈L e h ∈C-,

(L,U ∪ {h} \ {k}),
(L',U') = 
(L \ {k},U ∪ {h}),
(L ∪ {h},U \ {k}),
se k ∈U e h ∈C+,
se k ∈L e h ∈C+,
se k ∈U e h ∈C_
_
_
Si osservi che se θ > 0, allora cx(θ ) < c x e la nuova base è una base distinta dalla
precedente, cui
_ dalla funzione obiettivo; questo accade in
_ corrisponde un valore inferiore
particolare se x è non degenere. Altrimenti, se θ = 0, (B',
_ L', U') è una base distinta da (B, L, U) a
cui corrisponde la stessa soluzione di base degenere x .
Determiniamo adesso la soluzione duale e cioè il potenziale (π',µ') o equivalentemente
(π',c') associato a (B', L', U'). Ovviamente π' può essere calcolato applicando la procedura
Potenziale_di_base. Mostriamo che è possibile ottenere π' mediante l'aggiornamento di π.
Cominciamo con l'osservare che la rimozione di ah da TB, causa la separazione di TB in
due alberi, che indicheremo con T' = (N', A') e T" = (N", A"); nel seguito denoteremo con T'
l'albero che contiene la radice r. La partizione (N', N") di N è un taglio del grafo G; A(N', N") è
l'insieme degli archi del taglio mentre A+(N', N") e A-(N', N") rappresentano gli insiemi degli
archi rispettivamente diretti e inversi del taglio.
Per costruzione ah ∈ A(N', N"). Poiché l'aggiunta di ak a TB forma il ciclo C contenente ah,
allora ak ∈ A(N', N"). Consideriamo la trasformazione
_
_
π + δ, se i ∈ N",
(1.1.18) πi (δ) =  πi,
se i ∈ N'.

i
dove il reale δ è detto variazione di potenziale.
Consideriamo l'effetto della trasformazione (1.1.18) sui vincoli del problema di potenziale;
per far questo, come abbiamo visto, possiamo equivalentemente valutare i costi ridotti cij(δ)
relativi alla soluzione π(δ). Si ha:
_
 c ij + δ, se (i,j) ∈ A-(N', N"),
_
_
(1.1.19)
c ij (δ) = cij + πi (δ) - πj (δ) =  c ij - δ, se (i,j) ∈ A+(N', N"),
_
 c ij,
altrimenti.
15
ROC-00/01 Capitolo 1
Allora, posto:
_
_  c pq, se ak =(p,q) ∈ A+(N', N"),
δ = _
− c pq, se ak =(p,q) ∈ A (N', N")
_
_
_
è immediato verificare
che
c
(δ
)
=
0,
c
(δ
_
pq
ij ) = c ij = 0,_∀(i,j) ∈B' \ {k }.
Pertanto π'=π(δ), ottenuto dalla (1.1.18) per δ = δ, è soluzione di
π'EB'= cB'
e quindi π' è il potenziale di base associato a (B', L', U').
Il seguente teorema riassume i risultati e caratterizza l'intorno di un flusso di base
ammissibile.
Teorema 1.1.5
_ _
Sia data
una
base
(B,
L,
U)
e
la
corrispondente
coppia
di
soluzioni
di
base
complementari
(
x
, π),
_
_
dove x è un flusso ammissibile e π è un potenziale non ammissibile. È possibile determinare
una base adiacente (B', L', U') data da (1.1.17) a cui corrispondono
la coppia di soluzioni
_
_
complementari x', data da (1.1.16), e π', data dalla (1.1.18) per δ = δ, per cui risulta cx' ≤ c x .
Esempio 1.1.3 (continua)
_
Proseguendo l'esempio, l'arco a4 = (2,4) è fuori base alla capacità inferiore, cioè 4 ∈ L e c 24 = -6 < 0. Pertanto
k = 4 e l'inserimento di a4 forma il ciclo C = {(2,4), (4,5), (3,5), (2,3)} (vedi figura 1.1.9).
Il verso di_C è concorde
_ con (2,4) e gli archi concordi con il verso di C: sono (2,4), (4,5); quindi
θ 1 = min{u 24 - x 24 , u 45 - x 45} = min{2, 2} = 2.
_
_
Gli archi
_ discordi con il verso di C sono (3,5) e (2,3); θ 2 = min{ x 3 5 , x 23 } = min{7, 0} = 0. Di
conseguenza θ = min{θ1, θ2} = min{2, 0} = 0. L'arco uscente
_ è _l'arco a3= (2,3); h =_ 3.
_
Poiché l'arco entrante (2,4) ∈ A-(N',N") si ha che δ = - c 24 = 6. Essendo θ = 0 si ha x' = x . Il nuovo
potenziale di base e i nuovi costi ridotti sono ottenuti per aggiornamento:
_
_
_
_
_
_
π'2= π 2 + δ = -2 + 6 = 4;
c12
' = c 12 - δ = 4 - 6 = -2;
c23
' = c 23 + δ = 0 + 6 = 6.
La base (B', L', U') è data da
B' = B \{h}∪{k} = {2,3,6,7} \{3}∪{4} = {2,4,6,7};
L' = L \{k}∪{h} = {1,4} \{4}∪{3} = {1,3};
U' = U = {5};
Poiché c12
' = -2 < 0, a1 = (1,2) con 1 ∈ L', la base (B', L', U') non è duale ammissibile.
T'
1
1
a2
a2
3
a6
5
a7
3
a
3
a6
5
2
2
T"
a7
a4
4
4
Figura 1.1.9
Potenziale adiacente ammissibile
_
Assumiamo ora che
(B,
L,
U)
individui
un
potenziale
di
base
ammissibile,
π, ed un flusso di base
_
_
_
non ammissibile, x . Poiché il potenziale è ammissibile si ha c L ≥ 0 e c U ≤ 0, mentre per la non
ammissibilità del flusso dovrà esistere almeno un indice h ∈ B tale che l'arco ah = (v,w) abbia
_
_
flusso x vw < 0 oppure x vw > uvw.
16
ROC-00/01 Capitolo 1
Si vuole studiare l'operazione di passaggio dalla base individuata da (B, L, U) ad una nuova
base adiacente ottenuta scegliendo l'arco ah come arco uscente. La rimozione di ah individua il
taglio (N', N") causando la separazione del albero TB in due sottoalberi, T' = (N', A') e T" = (N",
A"). Assumiamo che la radice r sia la radice di T'.
Sia a k = (p,q) l'arco entrante in base (assumiamo per ora di conoscere già tale arco,
affrontando solo successivamente il problema della sua determinazione). Dovrà naturalmente
essere ak ∈ A(N', N") e quindi esso formerà in TB un ciclo contenente ah. Nella figura 1.1.10
sono stati indicati i quattro casi possibili; in essa non è stato indicato il verso di ak, non essendo
per ora rilevante.
r
r
x vw > u vw
xvw <0
w
v
T'
v
T'
ah
w
ah
C
C
i
j
ak
j
a)
i
ak
T"
T"
b)
r
r
x vw > uvw
xvw <0
T'
T'
v
w
w
ah
v
ah
C
C
i
ak
j
j
ak
T"
c)
i
T"
d)
Figura 1.1.10
_
Osserviamo
che
il
verso
scelto
per
il
ciclo
C
è
concorde
con
l'arco
a
se
è
x
h
vw < 0 e
_
discorde se è x vw > uvw. Nella nuova base (B', L', U') l'indice h apparterrà ad L' o a U' e di
conseguenza il flusso sull'arco ah = (v,w) dovrà essere nullo, h ∈ L', oppure uguale a uvw, h ∈
U'.
Il nuovo flusso di base, x', è dato per ogni arco (i,j) ∈ A da:
_
_
x
+
θ
 _ij _, se (i,j)∈C+,
x'ij =  x ij − θ, se (i,j)∈C-,
 x_ ,
altrimenti;
ij
dove si è posto:
17
ROC-00/01 Capitolo 1
_
_  − x vw,
θ =  _
 x vw - uvw,
_
se x vw < 0,
_
se x vw > uvw.
Consideriamo ora l'aggiornamento della soluzione duale, cioè del vettore dei potenziali π.
Secondo quanto già visto nel caso di basi adiacenti primali ammissibili, il nuovo vettore dei
potenziali π' ha componenti:
_
_
πi + δ, se i∈N",
π'i = _
se i∈N';
π ,
i
dove
_
c pq, se ak=(p,q)∈A+(N',N"),
_ 
δ = 
_
 − c pq, se ak=(p,q)∈A-(N',N").
Osserviamo che il costo ridotto di (i,j) ∈ A viene così modificato:
_
_
c
−
δ
, se (i,j)∈A+(N',N"),
ij

_ _
_
(1.1.20)
c ij' =  c ij + δ, se (i,j)∈A-(N',N"),
 c_ ,
altrimenti.
ij
Osserviamo che per l'ammissibilità di π' dovrà essere, per l'arco ah = (v,w):
_
≥0, se x vw < 0 cioè h∈L',
_
_

c vw
' = c vw +π'v- π'w 
_
≤0, se x vw>uvw cioè h∈U'.
_
Pertanto, siccome c vw = 0, dovrà essere:
_
_
≤0, se x vw<0 e ah∈A+(N',N") oppure x vw>uvw e ah∈A-(N',N"),
_ 
δ 
_
_
≥0, se x vw<0 e ah∈A-(N',N") oppure x vw>uvw e.ah∈A+(N',N").
_
Supponiamo di essere nel primo caso, δ ≤ 0. Chiaramente gli unici archi il cui costo ridotto
viene modificato sono quelli appartenenti al taglio (N',N"). Volendo mantenere l'ammissibilità
_
duale, siccome il costo ridotto degli archi inversi diminuirà secondo la (1.1.20), il valore δ dovrà
risultare:
_
_

c ij, ∀(i,j)∈A+(N',N") per cui x ij = uij,
_ 
δ ≥ 
_
_
 − c ij, ∀(i,j)∈A-(N',N") per cui x ij = 0.
Indichiamo i due sottoinsiemi degli archi in questione
AL− = {ai∈A−(N',N"): i∈L}.
_
Per l'ammissibilità basta allora porre (si ricorda che δ≤0):
_
_
_
+
(1.1.21) δ = max{{ c ij: (i,j)∈AU
}∪{− c ij: (i,j)∈AL− }}.
+
AU
= {ai∈A+(N',N"): i∈U}
e
18
ROC-00/01 Capitolo 1
Come arco ak = (p,q) entrante in base al posto
degli archi)
_
_di ah scegliamo l'arco_ (o uno
_
per cui è verificata la (1.1.21), per cui si_verifica δ = c_pq se k ∈ U, oppure δ = − c pq, se k ∈ L.
Analogo è il caso in cui si debba avere δ ≥ 0; il valore δ è posto:
_
_
_
−
(1.1.22) δ = min{{ c ij: (i,j)∈AL+ }∪{− c ij: (i,j)∈AU
}},
dove
AL+ = {ai∈A+(N',N"): i∈L}
−
AU
= {ai∈A−(N',N"): i∈U}.
e
L'arco entrante in base, ak, è determinato di conseguenza. Se
nella
_ nella (1.1.21) (oppure
_
+
−
+
−
(1.1.22)) l'insieme AU ∪ AL = Ø, (oppure AL ∪ A U = Ø), si pone δ = −∞ (oppure δ = +∞). Si
ha allora che il problema
di potenziale è non limitato e quindi che il problema di flusso è vuoto.
_
Nel caso si abbia δ finito la nuova base (B', L', U') è data da:
B'=B\{h}∪{k},
k∈L
L'=L\{k}∪{h}
U'=U
L'=L\{k}
U'=U∪{h}
_
x vw<0
_
x vw>uvw
k∈U
L'=L∪{h}
U'=U \{k}
L'=L
U'=U \{k}∪{h}
Esempio 1.1.4 (continua)
Si consideri la base B = {1, 3, 4, 7}, L = {5, 6}, U = {2}_ e la coppia di soluzioni di base_complementari associate
T
(vedi figura 1.1.11):
_ il flusso di base non_ammissibile x = [0 5 -11 11 0 0 8] : x 23 < 0; il potenziale di
base ammissibile π = [0 2 7 -1 3], c = [0 -4 0 0 7 6 0]. L'arco uscente di base è a 3 , quindi h = 3.
Consideriamo gli archi candidati ad entrare in base. Il caso in esame corrisponde al caso 1).
TB
1
a1
2
3
a3
TB
1
T'
a1
a2
2
a4
4
T"
a7
3
a
3
a5
a4
4
a7
a6
5
5
Figura 1.1.11
_
_
_
_
δ1 = min{- c 13} = 4, δ2 = min{ c 34 , c 35} = 6. Pertanto δ = -4 e a2 è l'arco entrante, cioè k =2.
Esercizio 1.1.6
Completare l'esempio precedente
Osservazione 1.1.2: basi adiacenti
Si può verificare formalmente che i criteri per il passaggio a basi adiacenti ammissibili introdotti nel corso del
paragrafo, coincidano con i criteri applicati negli algoritmi del Simplesso Primale e Duale per problemi di PL a
variabili limitate. Per procedere in questa direzione è necessario calcolare EB-1 e EB-1E.
E B -1 è una matrice a valori (0, -1, 1) le cui righe sono associate agli archi di T B e le cui colonne sono
associate ai nodi di TB. Il valore eij-1, associato all'arco ai ed al nodo j è determinato dalla posizione di ai rispetto
al cammino Prj dalla radice r al nodo j su TB:
 0,
1,
eij-1 = 
 -1,
a i ∉ P rj,
a i = (p(j),j) ∈ P rj,
a i = (j,-p(j)) ∈ P rj;
19
ROC-00/01 Capitolo 1
pertanto, gli elementi non nulli della riga Ei-1 corrispondono ai nodi del sottoalbero di TB di radice j; gli elementi
j
non nulli della colonna (E-1) individuano gli archi appartenenti a Prj, il segno determina il loro orientamento.
Anche la matrice F = EB-1E è a valori (0, -1, 1); le righe sono associate agli archi di TB mentre le colonne
sono associate agli archi di G. L'interpretazione del valore fij è legata alla relazione tra ai e aj rispetto a TB = (N,
AB); ovviamente, se aj ∈ AB, allora:
 0, se j ≠ i,
fij = 
 1 , se j = i.
Supponiamo ora che j ∉ B. L'arco aj induce su TB un ciclo C ed un verso; allora:
 0, a i ∉ C ,
1 , a i ∈ C ed ha verso opposto,
fij = 
 -1,
a i ∈ C ed ha verso uguale.
Una analoga interpretazione può essere fatta considerando i due alberi T' e T" in cui viene separato TB
rimuovendo l'arco ai; si noti che ai definisce un orientamento tra T' e T"; allora:
 0, a j non riconnette T' e T",
1 , a j riconnette T' e T" ed ha orientamento uguale,
fij = 
 -1,
a j riconnette T' e T" ed ha orientamento opposto.
Pertanto, per j ∉ B, gli elementi non nulli di Fj individuano gli archi che formano un ciclo sull'albero a
causa dell'inserimento di aj, ed il segno indica il verso sul ciclo (discorde se +1, concorde se -1) rispetto a quello
di a j; inoltre, gli elementi non nulli di F i individuano gli archi che riconnettono T' e T", ed il segno indica
l'orientamento tra gli alberi (uguale se +1, opposto se -1) rispetto a quello di ai.
Esempio 1.1.4
Dato il grafo in figura 1.1.12, la sua matrice di incidenza E e la base B = {2, 3, 5}:
2
2
a1
a4
TB
a3
1
4
a2
a3
1
a2
a5
4
a5
3
3
Figura 1.1.12


E = 


-1 -1 0 0 0
1 0 -1 -1 0
0 1 1 0 -1
0 0 0 1 1


EB-1 = 


0 1
0 -1
0 0
1 1
1
0
0
1
1
0
1
1
1
0
0
0














EB = 




F = EB-1E = 


-1 0 0
0 -1 0
1 1 -1
0 0 1
1
-1
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
1
1
0






0
0
1
0
0
0
0
1






1.1.6 Algoritmi del simplesso su reti
Algoritmo primale del simplesso su reti
Un algoritmo del simplesso per i problemi di flusso è facilmente descrivibile (vedi figura
1.1.13). La procedura riceve in input una base primale ammissibile e le strutture dati
caratterizzanti l'albero di base (Visita anticipata, Visita posticipata, Predecessore).
20
ROC-00/01 Capitolo 1
Procedure Simplesso_per_flusso(c,u,b,B,L,U,TB,r,Va,Vp,P,x,π):
begin
ottimo := true; Flusso_di_base(u,b,B,L,U,TB,r,Vp,P,x); Potenziale_di_base(c,B,TB,r,Va,P,π);
repeat
Potenziale_Ammissibile(c,L,U,π,k,ottimo);
if not ottimo then
_
begin Trova_Ciclo(u,T
,P,k,z,x,θ
,h,verso);
B
_
_
if θ > 0 then Aggiorna_Flusso(TB,P,verso,k,z,θ,x);
Aggiorna_Potenziale(c,k,h,π,δ); Aggiorna_base(B,L,U,h,k) end
until ottimo
end.
Figura 1.1.13
Esercizio 1.1.7
Proseguire l'applicazione del simplesso per flussi al problema dell'esempio 1.1.3 sino a determinare la soluzione
ottima.
Algoritmo duale del simplesso su reti
Un algoritmo del simplesso per i problemi di potenziale è facilmente descrivibile (vedi figura
1.1.14). La procedura riceve in input una base duale ammissibile e le strutture dati caratterizzanti
l'albero di base (Visita anticipata, Visita posticipata, Predecessore).
Procedure Simplesso_per_potenziale(c,u,b,B,L,U,TB,r,Va,Vp,P,x,π):
begin
ottimo := true; potenziale_illimitato := false;
Flusso_di_base(u,b,B,L,U,TB,r,Vp,P,x); Potenziale_di_base(c,B,TB,r,Va,P,π);
repeat
Flusso_Ammissibile(u,B,x,h,ottimo);
if not ottimo then
begin
_
Trova_delta(c,L,U,h,δ,k,potenziale_illimitato);
if not potenziale_illimitato then _
_
begin Trova_Ciclo(u,T
B,P,k,z,x,θ,h,verso); Aggiorna_Flusso(T
B,P,verso,k,z,θ,x);
_
_
if δ ≠ 0 then Aggiorna_Potenziale(c,k,h,π,δ);
Aggiorna_base(B,L,U,h,k) end
end
until ottimo or potenziale_illimitato
end.
Figura 1.1.14
Esercizio 1.1.8
Proseguire l'esempio 1.1.3 sino a determinare la coppia di soluzioni ottime.
Determinazione di basi ammissibili iniziali
Nel caso di problemi di flusso, la determinazione di una base ammissibile iniziale è facilmente
effettuabile sia per il problema di flusso che per il problema di potenziale.
Una base primale ammissibile, artificiale, è ottenibile ampliando il grafo con un nodo
fittizio n+1 e con n archi fittizi: un arco (i,n+1) per ogni nodo i origine o di trasferimento ed un
arco (n+1,j) per ogni nodo j destinazione. Agli archi del tipo (i,n+1) si attribuisce una capacità
uin+1 = -bi e costo M opportunamente grande mentre per gli archi del tipo (n+1,i) si attribuisce
una capacità un+1j = bj e costo nullo. Gli archi fittizi individuano un albero di copertura per il
problema ampliato; la base (B, L, U) si ottiene ponendo gli indici degli archi del grafo originario
in L, gli indici degli archi fittizi in B e ponendo U= ∅. A (B, L, U) corrisponde un flusso
21
ROC-00/01 Capitolo 1
ammissibile per il problema ampliato. Inoltre se il problema di partenza è non vuoto, allora il
flusso ottimo per il problema ampliato è ammissibile per il problema originario. Altrimenti, se il
problema originario è vuoto, allora il flusso ottimo per il problema ampliato è non nullo in
almeno due archi fittizi.
Esercizio 1.1.9
Scrivere la formulazione del problema ampliato e del suo duale.
La individuazione di una base cui corrisponde un potenziale ammissibile può essere
effettuata senza ampliare il problema, e pertanto senza modificare la struttura del grafo. Infatti,
dato un qualsiasi albero di copertura T B , è immediato determinare una partizione (L, U)
dell'insieme degli indici degli archi fuori base tale che (B,L,U) sia una base duale ammissibile.
_
Infatti è sufficiente calcolare con una visita anticipata su T B il vettore dei potenziali π e,
_
successivamente il vettore dei costi ridotti c . Quindi si assegnano gli indici degli archi fuori base
ad L o ad U in modo che risulti cL ≥ 0 e cU < 0. La base (B,L,U) risultante è duale ammissibile
per costruzione.
Esercizio 1.1.10
Determinare una base duale ammissibile per il problema dell'esempio 1.1.3.
Esercizio 1.1.11
Descrivere una procedura che in O(m) determina un albero di base ed una base duale ammissibile.
22
ROC-00/01 Capitolo 1
1.2 Il problema dei cammini minimi
In questo capitolo approfondiremo alcuni aspetti del problema della determinazione dell'albero
dei cammini minimi essenzialmente per problemi implementativi e per la valutazione della relativa
complessità computazionale. Non ripeteremo quindi quanto riportato negli appunti di Ricerca
Operativa.
Introdurremo inoltre alcune varianti delle condizioni di Bellman per la risoluzione di
problemi di cammino quando la misura del cammino stesso non è necessariamente la somma
delle misure sugli archi.
1.2.1 Formulazione del problema dell'albero dei cammini minimi
Il problema è un particolare problema di flusso dove la radice r è l'unica origine di n-1 unità di
flusso, ciascun altro nodo i essendo destinazione di una unità di flusso. I flussi sugli archi sono
vincolati solo ad essere non negativi (pertanto il problema è a capacità illimitata). Il problema ha
quindi la seguente formulazione:
(1.2.1)
(P) Min cx
Ex = b
x≥ 0
dove b è:

bi = 

-(n-1), se i = r,
1,
altrimenti.
Il duale del problema (P) è:
(1.2.2)
(D) Max πb
πE ≤ c
o, in forma estesa:
(D) Max
∑
πi
i∈N \{r}
- (n-1)πr
πj
- πi
≤ cij,
∀ (i,j) ∈ A
Essendo le righe della matrice di incidenza E linearmente dipendenti, si può porre senza
perdere di generalità πr = 0. Il problema
duale (D) ha una diretta interpretazione in termini di
_
costi dei cammini. Un potenziale π è ammissibile se la differenza di potenziale tra i nodi estremi
_
di ciascun arco non eccede il costo dell'arco stesso. Interpretando la differenza di potenziale πi _
π r come il costo del cammino dalla radice r ad i, l'obiettivo è massimizzare la somma dei costi
degli n-1 cammini da r agli altri nodi sotto il vincolo che la differenza di potenziale tra i nodi
estremi di ciascun arco non ecceda il costo dell'arco stesso.
1.2.2 Le condizioni di Bellman
Si ricorda che il costo C(Pxy) di un cammino Pxy è dato dalla somma dei costi degli archi che
formano il cammino:
C(Pxy) =
∑
ca.
a∈A xy
23
ROC-00/01 Capitolo 1
Senza perdere di generalità si può presupporre che esista almeno un cammino da r a
ciascun altro nodo i.
Sia Tr = (N,Ar) un albero di copertura radicato in r e orientato, cioè gli archi dell'albero
sono tutti orientati dai padri verso i figli; inoltre sia di un valore reale, detto etichetta del nodo i,
che rappresenta un'approssimazione per eccesso del costo dell'unico cammino da r a i in Tr. Le
seguenti condizioni sono dette condizioni di Bellman:
(1.2.3)
di + cij ≥ dj,
∀ (i ,j)∈A.
Si noti che le condizioni di Bellman (1.2.3) non sono altro che i vincoli del problema duale
quando si utilizzano le etichette al posto dei potenziali. Si può dimostrare che la procedura SPT
non è altro che una implementazione efficiente dell'algoritmo del simplesso per la risoluzione
della coppia di problemi (1.2.1) e (1.2.2).
Vale il seguente teorema:
Teorema 1.2.1
Se il grafo G contiene un ciclo negativo, cioè un cammino orientato chiuso il cui costo è
negativo, allora il problema dell'albero dei cammini minimi è mal posto in quanto esistono
cammini (non semplici) il cui costo non è limitato inferiormente.
Nel seguito supporremo che il problema di cammino minimo abbia ottimo, e pertanto che il
grafo sia privo di cicli negativi. L'ipotesi non è restrittiva in quanto, si ricorda, è possibile
verificare in tempo polinomiale se un grafo contiene un ciclo negativo.
1.2.3 Algoritmo SPT
Si riporta qui la procedura SPT (Shortest Path Tree) già descritta negli appunti di
Programmazione Matematica.
Procedure SPT(r, P, d):
begin
for i := 1 to n do begin P[i] := r; d[i] := M end; P[r] := nil; d[r] := 0; Q := {r};
repeat
select u from Q; Q := Q \ {u};
for each (u,v) ∈ FS(u) do
if d[u] + c[u,v] < d[v] then
begin d[v] := d[u] + c[u,v]; P[v] := u;
if v ∉ Q then Q := Q ∪ {v} end
until Q = ø
end.
Figura 1.2.1 - La procedura SPT
La correttezza della procedura è mostrata dal seguente teorema.
Teorema 1.2.2
La procedura SPT è corretta.
Dim.
Mostriamo che essa termina in un numero finito di passi. Ricordiamo che il valore dell'etichetta
del nodo v, dv, è il costo di un cammino del grafo da r a v. Osserviamo inoltre che il nodo v è
inserito in Q quando la sua etichetta dv diminuisce. Poiché il numero di cammini da r a v è finito,
dv può diminuire un numero finito di volte e quindi il nodo v potrà essere inserito in Q un
24
ROC-00/01 Capitolo 1
numero finito di volte. Di conseguenza il ciclo repeat…until è ripetuto un numero finito di volte,
quindi, la procedura termina in un numero finito di passi.
Si noti che, alla generica iterazione k della procedura, può esistere un arco (i,j) con i=p(j)
tale che dj >di + cij. Ciò si verifica quando il nodo i, successivamente alla sua estrazione da Q
che ha determinato l'assegnazione i=p(j), viene inserito nuovamente in Q, poiché la sua etichetta è
stata migliorata. Pertanto, per ogni arco (i,j) dell'albero corrente, vale la condizione dj ≥di + cij.
Mostriamo adesso che al termine della procedura l'albero Tr definito da p(.) è un albero dei
cammini minimi. I nodi i ≠ r tali che di < M sono stati inseriti (almeno una volta) in Q e quindi è
stato individuato almeno un cammino da r a i. Assumiamo che, al termine della procedura, esista
almeno un nodo j tale che dj = M. Allora non esistono cammini di G da r a j di lunghezza
minore di M o, in altre parole, l'unico cammino è rappresentato dall'arco artificiale (r,j). Infatti, se
per assurdo un tale cammino esistesse, allora la procedura a partire da r attribuirebbe al nodo j,
attraverso l'inserimento in Q dei nodi del cammino, una etichetta dj < M. Possiamo quindi
limitarci a considerare il grafo G' = (N', A') di G indotto dai nodi i ∈ N: dj < M; sia T'r l'albero di
G' definito da p(.) applicata ai nodi di N' (T'r è l'albero restituito dalla procedura privato degli
eventuali nodi con etichetta M e degli archi incidenti in tali nodi). Per ogni arco (i,j) dell'albero,
cioè p(j) = i, si ha dj =di + cij, quindi le etichette dei nodi rappresentano i costi dei cammini
dell'albero. Essendo verificate le condizioni di Bellman per tutti gli archi del grafo, non esiste
nessun cammino di costo inferiore al cammino dell'albero da r al nodo i, per ogni i ∈ N'.
Pertanto T'r è l'albero dei cammini minimi di radice r del grafo G'. ♦
Indicate rispettivamente con:
γsel il numero di selezioni di nodi da Q,
γmax il massimo numero di selezioni dello stesso nodo da Q,
γcon il numero di controlli delle condizioni di Bellman, e pertanto il massimo numero di
possibili inserimenti in Q,
si hanno le seguenti condizioni:
- γsel ≤ n γmax,
(ogni nodo selezionato non più di γmax volte),
- γmax ≥ 1,
(ogni nodo selezionato almeno una volta),
- γcon ≤ n γsel,
(num. controlli per selezione = num. archi stella uscente ≤n),
- γcon ≤ m γmax,
(num. controlli per arco = num. selez. del nodo coda ≤γmax),
- γcon ≤ min{nγsel,mγmax}, (dalle due condizioni precedenti).
Supponendo che sia il controllo di appartenenza di un elemento a Q sia il controllo se Q è
vuoto si possono effettuare in tempo O(1), senza fare ulteriori ipotesi sulla scelta implementativa
di Q indichiamo le complessità delle operazioni elementari per la sua gestione, rispettivamente
con:
- qinit la complessità dell'inizializzazione di Q,
- qsel la complessità della selezione e rimozione di un elemento da Q,
- qcon la complessità dell'inserimento di un elemento in Q (e suo eventuale
riordinamento).
Allora la complessità di SPT può essere espressa da:
-
(1.2.4)
-
O(qinit + γsel qsel + γcon qcon).
In generale si possono fare due scelte implementative per l'insieme Q:
la coda di priorità:
(non ordinata, ordinata, parzialmente ordinata),
la lista:
(fila, pila, liste a doppio ingresso).
25
ROC-00/01 Capitolo 1
Studiamo separatamente le due scelte.
1.2.4 Algoritmi a selezione del nodo di etichetta minima (Shortest-first)
L'insieme Q viene implementato come coda di priorità. Ad ogni elemento è cioè associata una
chiave di priorità e le operazioni elementari eseguibili in Q sono:
- inserimento di un elemento con associata chiave di priorità,
- modifica della chiave di priorità di un elemento di Q di cui si conosca la posizione in Q,
- selezione dell'elemento con chiave di priorità migliore e sua rimozione da Q.
Per il problema dell'albero dei cammini minimi la chiave di priorità di un nodo i è l'etichetta
di; l'elemento di priorità migliore è il nodo di etichetta minima:
(1.2.5)
u = argmin{di: i ∈ Q}.
Vale il seguente Teorema di Dijkstra (1959):
Teorema 1.2.3
Se in SPT si implementa Q come coda di priorità e se i costi sono non negativi, allora ogni nodo
verrà inserito in Q (e rimosso da esso) una ed una sola volta.
Dim.
Basta osservare che, essendo i costi non negativi, le etichette dei nodi selezionati durante le varie
iterazioni di SPT formano una sequenza non decrescente; infatti, tutti i nodi inseriti
successivamente all'estrazione di un nodo i avranno un'etichetta ≥ di. Pertanto, affinché il nodo i
sia reinserito in Q a causa della riduzione della propria etichetta, sarebbe necessario che esistesse
un arco incidente in i con costo negativo. Dalla non negatività dei costi segue la tesi. ♦
Corollario 1.2.4
γmax = 1.
Indichiamo con SPT_S le versioni di SPT nelle quali è adottata la selezione del nodo ad
etichetta minima, cioè le versioni in cui Q è implementato come coda di priorità. Dal Corollario
1.2.4 si ha che: γsel = n, γcon = m; pertanto la complessità di SPT_S è:
(1.2.6)
O(qinit + n qsel + m qcon).
Osservazione 1.2.1 Se si hanno costi negativi, si ha γcon = O(2n ), γsel = O(2n ) [D.B. Johnson, 1973].
Studiamo ora due realizzazioni della coda di priorità Q: la lista non ordinata e lo heap
binario, già presentate nel corso di Programmazione Matematica.
Algoritmo SPT_S_Dijkstra
La coda di priorità Q è realizzata mediante una lista non ordinata (ad
vettore a puntatori); le operazioni elementari comportano:
- inizializzazione della lista Q con la sola radice r:
- selezione del nodo di etichetta minima: scansione della lista Q
- rimozione del nodo di etichetta minima selezionato
- inserzione di un nodo (ad esempio, in testa) o modifica dell'etichetta
pertanto si ha: qinit = O(n), qsel = O(n), qcon = O(1).
esempio mediante un
⇒ O(n),
⇒ O(n),
⇒ O(1),
⇒ O(1);
Corollario 1.2.5
La procedura SPT_S_Dijkstra, su grafi con costi non negativi, ha complessità O(n 2).
26
ROC-00/01 Capitolo 1
Algoritmo SPT_S_heap
La coda di priorità Q è realizzata mediante un heap binario con dizionario; le operazioni
elementari comportano:
- inizializzazione dello heap Q con la sola radice r
⇒ O(n),
- selezione del nodo di etichetta minima: la radice dello heap Q
⇒ O(1),
- rimozione del nodo radice dello heap Q e riordinamento di Q
⇒ O(logn),
- inserzione di un nodo o modifica dell'etichetta
⇒ O(logn);
pertanto si ha: qinit = O(n), qsel = O(logn), qcon = O(logn).
Corollario 1.2.6
La procedura SPT_S_heap, su grafi con costi non negativi, ha complessità O(mlogn).
1.2.5 Algoritmi a selezione su lista (List search)
L'insieme Q viene implementato come una lista, cioè una sequenza di elementi su cui possono
essere effettuate operazioni di rimozione ed inserzione alle estremità della sequenza, chiamate
rispettivamente testa e coda della lista. Si distinguono diversi tipi di liste:
- la fila:
l'inserzione viene effettuata in coda e la rimozione dalla testa (regola FIFO);
- la pila: l'inserzione e la rimozione vengono effettuate in testa (regola LIFO);
- la deque (double-ended queue) o lista a doppio ingresso: l'inserzione viene effettuata sia
in testa sia in coda e la rimozione solo dalla testa.
Le operazioni elementari sulle liste sono:
- inserimento di un elemento come nuova testa della lista,
- inserimento di un elemento come nuova coda della lista,
- rimozione dell'elemento testa dalla lista.
Le liste possono essere realizzate in diversi modi (liste a puntatori, vettori di puntatori,
lineari o circolari, semplici o doppie, ecc.). È sempre possibile realizzare una lista in modo tale
che le operazioni elementari e le operazioni di controllo di appartenenza di un elemento alla lista
e di controllo se la lista è vuota abbiano tutte complessità costante: O(1).
Indichiamo con SPT_L le versioni di SPT nelle quali l'insieme Q è implementato come
lista. Dalla formula di complessità per SPT (1.2.4) si ha che: qinit = O(n), qsel = O(1), qcon =
O(1); pertanto la complessità di SPT_L, anche nel caso di costi negativi è:
(1.2.7)
O(n + γsel + γcon) = O(γcon).
Q può essere realizzata mediante un vettore circolare di puntatori Q[.], ad n+1 componenti;
Q[n+1] punta al primo elemento della lista Q. Inoltre, il puntatore last individua l'elemento di
coda di Q (Q = Ø ⇒ last = n+1 e Q[n+1] = n+1).:
 j,
se j segue i in Q,

se i ∉ Q,
Q[i] =  0,
n+1, se i è l'ultimo elemento di Q.
-
Le operazioni elementari di gestione di Q sono realizzate nel seguente modo:
inizializzazione (Q := {r}):
for i := 1 to n do Q[i] := 0; Q[n+1] := last := r; Q[r] := n+1;
controllo se j ∉ Q :
if Q[j] = 0 then… ;
controllo se Q = Ø:
if last = n+1 then… ;
inserimento di j in coda a Q :
Q[last] := j; Q[j] := n+1; last := j;
inserimento di j in testa a Q :
Q[j] := Q[n+1]; Q[n+1] := j; if last = n+1 then last := j;
27
ROC-00/01 Capitolo 1
-
rimozione di i dalla testa di Q :
i := Q[n+1]; Q[n+1] := Q[i]; Q[i] := 0;
if last = i then last := n+1;
Studiamo ora tre diverse realizzazioni della lista Q: la fila o queue, la lista a doppio
ingresso o deque ed una trasformazione della deque detta 2queue.
Algoritmo SPT_L_queue
La lista Q è realizzata mediante una fila: l'inserzione dei nodi avviene in coda e la rimozione dalla
testa (regola FIFO); si noti che l'aggiornamento dell'etichetta di un nodo appartenente a Q non
influisce sulla posizione dell'elemento nella fila. Analizziamo la complessità di SPT_L_queue; si
può dimostrare che la particolare struttura della fila garantisce che, in assenza di cicli negativi,
nessun nodo sarà inserito più di n-1 volte in Q. Pertanto:
Teorema 1.2.7
La procedura SPT_L_queue ha complessità O(m n).
Dim.
Da quanto appena affermato si ha γmax ≤ n. Quindi γsel ≤ n 2 e γcon ≤ min{nγsel,mγmax } ≤
min{n3,mn} = mn. Dalla (1.2.7) segue la tesi.♦
Osservazione 1.2.2
La procedura SPT_L_queue può essere utilizzata per controllare se un grafo orientato possiede cicli negativi.
Infatti per il teorema 1.2.7 è sufficiente contare le iterazioni eseguite: se dopo n(n-1)/2+1 iterazioni Q risulta non
vuota, allora tutti i nodi presenti in Q appartengono a cicli di costo negativo.
La limitazione discende dal fatto che se si ottenesse un albero Tr dei cammini minimi ogni nodo i sarebbe
estratto da Q non più di γ i-1 volte, dove γ i è il livello di i su T r , salvo per la radice per cui γ r =1. Nel caso
peggiore si ha Tr formato da un cammino con un nodo per ogni livello j=0,1,...,n-1; pertanto si ha
Σ i∈N γi
≤
n(n-1)
+ 1.
2
Algoritmo SPT_L_deque
La lista Q è realizzata mediante una lista a doppio ingresso, o deque; i nodi vengono inseriti in
coda la prima volta (cioè quando l'etichetta scende dal valore M ad un valore finito) ed in testa le
volte successive; la rimozione avviene dalla testa. Questa politica differenziata di inserzione è
dovuta alla seguente osservazione; quando l'etichetta di un nodo i già esaminato viene
ulteriormente migliorata, non sono stati effettuati miglioramenti per le etichette dei nodi
discendenti di i nell'albero corrente: essi pertanto hanno un'etichetta strettamente superiore al
costo del cammino corrente, si inserisce pertanto il nodo i in testa al fine di anticipare la sua
selezione da Q e quindi la correzione delle etichette dei discendenti. Si ottiene pertanto una
politica ibrida LIFO-FIFO.
Si noti che la lista Q può essere interpretata come una coppia di liste Q' e Q" connesse in
serie, vedi figura 1.2.2; Q' conterrà solo i nodi reinseriti in Q mentre Q" conterrà solo i nodi
inseriti per la prima volta in Q.
Q'
Q"
last
Figura 1.2.2
Si rimuoverà il nodo testa di Q" solo se Q'=Ø, pertanto Q' è una pila (stack) e Q" è una
fila (queue). Si può dimostrare che il numero di inserimenti in Q' è esponenziale, cioè che:
28
ROC-00/01 Capitolo 1
γsel = O(2n) e γcon = O(n2n).
Teorema 1.2.8
La procedura SPT_L_deque ha complessità O(n2n).
È possibile riorganizzare Q affinché Q' sia implementata come fila; basta infatti mantenere
un puntatore all'ultimo elemento della porzione Q' di Q, vedi figura 1.2.3. I nodi verranno
inseriti, la prima volta, in coda a Q" (che coincide con la coda di Q), le altre volte in coda a Q'. La
struttura è conosciuta come doppia coda (o 2queue).
Q'
Q"
last of Q'
last of Q"
Figura 1.2.3
Si può dimostrare che il massimo numero di inserimenti dello stesso nodo in Q' è:
γmax = O(n2) e γcon = O(m.n2).
Teorema 1.2.9
La procedura SPT_L_2queue ha complessità O(m.n2).
L'importanza dell'algoritmo SPT_L_deque risiede nel fatto che, pur se la complessità
computazionale nel caso peggiore è esponenziale, su grafi sparsi ha una efficienza
computazionale migliore di molti algoritmi polinomiali. L'algoritmo SPT_L_2queue ha le stesse
prestazioni sperimentali di SPT_L_deque pur avendo una complessità polinomiale.
Nella letteratura scientifica degli ultimi venti anni si possono trovare migliaia di versioni
diverse di algoritmi per il problema dell'albero dei cammini minimi. La maggior parte di essi
sono semplici realizzazioni dell'algoritmo SPT nelle due possibili classi SPT_S e SPT_L; le
maggiori differenze risiedono nel tipo di strutture di dati che vengono utilizzate per realizzare
l'insieme (lista o coda di priorità) Q.
1.2.6 Un algoritmo distribuito per il calcolo dei cammini minimi
Il seguente sistema è conosciuto come equazioni di Bellman:
(1.2.8)
 0,
se j = r,
+c
:
(i,j)
∈
BS(j)},
altrimenti.
min{d

i ij
dj = 
È facilmente dimostrabile che se il grafo è privo di cicli negativi o nulli, la soluzione del
sistema (1.2.8) fornisce i costi minimi dei cammini; inoltre, si possono scegliere gli archi che
forniscono i valori minimi in modo opportuno affinché formino un albero di cammini minimi.
(1)
(1)
Sia d(k)
i il valore dell'etichetta del nodo i all'iterazione k (inizialmente si ha d r = 0 e d i =
M, per ogni i ≠ r); Il processo iterativo dovuto alle equazioni di Bellman è dato, per ogni j ≠ r da:
(1.2.9)
(k)
d(k+1)
j = min{d i +cij: (i,j) ∈ BS(j)};
quando k=n-1 si ha la soluzione delle equazioni (1.2.8). Il processo iterativo si può arrestare
appena si ha, per un k qualsiasi che d(k+1) = d(k).
29
ROC-00/01 Capitolo 1
Le (1.2.9) suggeriscono una computazione parallela di tipo sincrono in cui l'etichetta di
ogni nodo viene calcolata separatamente dalle altre. In generale gli algoritmi di tipo sincrono
sono abbastanza inefficienti e richiedono un coordinamento temporale tra processori per lo
scambio delle informazioni (nel nostro caso il nuovo stato delle etichette).
È possibile organizzare, in modo molto semplice un calcolo distribuito e asincrono dei
cammini minimi. Si supponga di avere a disposizione un processore per ogni nodo del grafo; il
processore P(i), associato al nodo i ∈ N, conosce la porzione di grafo relativa alla BS(i) con i
relativi costi, ed è in comunicazione con tutti i nodi j immediati successori di i stesso, cioè i nodi
terminali degli archi della FS(i).
Inizialmente di = M e il processore P(i) è inattivo, salvo per il processore P(r) che è attivo e
per il quale si ha dr = 0. Il processore P(r) attivo non fa altro che inviare il messaggio <r,dr> ai
processori associati ai suoi immediati successori e si disattiva (si noti che P(r) ha finito la sua
computazione e non si riattiverà più).
Quando un processore P(j) riceve un messaggio <i,di> da un processore P(i), blocca la
coda di arrivo dei messaggi e effettua il normale controllo di rispetto della condizione di
Bellman: se essa è rispettata, il processore riattiva la coda dei messaggi per recepirne, se c'è, uno
nuovo. Se invece si ha che d j > d i+cij, allora pone d j := d i+cij, p j := i e riattiva la coda dei
messaggi.
Appena la coda dei messaggi è vuota, P(j), se ha effettuato almeno un cambiamento di
etichetta, invia il messaggio <j,dj> a tutti i processori associati ai suoi immediati successori e si
disattiva; altrimenti si disattiva senza alcun invio di messaggi.
Pertanto, l'algoritmo associato al processore P(j) può essere riassunto come:
Procedure Distributed_SP_for_j:
begin
if messagequeue ≠ Ø then
begin flag := false;
repeat
select&remove <i,d[i]> from messagequeue;
if d[i] + c[i,j] < d[j] then begin d[j] := d[i] + c[i,j]; P[j] := i; flag := true end
until messagequeue = Ø;
if flag then for each (j,h) ∈ FS(j) do sendmessage(P(h),<j,d[j]>) end
end.
Figura 1.2.4 - La procedura Distributed_SP
Al termine, un processore centrale raccoglie i dati relativi all'etichetta e al predecessore di
ciascun nodo per fornire l'albero dei cammini minimi e i relativi costi minimi.
Temi per progetti
Sono a disposizione i seguenti temi.
- Utilizzo dei costi ridotti nella riottimizzazione di cammini minimi;
- Cammini minimi in reti dinamiche;
- Buckets, Radix heaps e Fibonacci heaps per la classe SPT_S;
- Valori soglia, riordinamenti parziali e altre politiche di inserzione per la classe SPT_L.
30
Fly UP