Gestione della produzione e della supply chain Logistica distributiva Paolo Detti Dipartimento di Ingegneria dell Informazione Università di Siena
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Se non si impongono particolari condizioni su come scegliere gli archi entranti ed uscenti, il simplesso può non terminare in un numero finito di iterazioni Il problema si ha in caso di degenerazione: l operazione di passare da un albero ricoprente ad un altro è detta operazione di pivot. Un operazione di pivot si dice degenere se l incremento di flusso nel ciclo di pivot è. Si noti che ciò può accadere solo se l albero ricoprente è degenere (non tutti gli archi nell albero sono liberi). In questi casi, l algoritmo potrebbe entrare in un ciclo infinito di operazioni di pivot degeneri.
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Ad ogni ciclo di pivot non degenere il valore della funzione obiettivo diminuisce di c kl δ, dove (k,l) è l arco entrante, c kl il suo costo ridotto e δ> l incremento (o decremento) di flusso lungo il ciclo. Per cui, se il problema ha soluzione ottima finita, il numero di cicli di pivot non degeneri è finito e l algoritmo termina. Il numero di cicli di pivot degeneri può essere però infinito.
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Questo fenomeno di ciclaggio può essere evitato se durante l algoritmo si utilizzano particolari alberi ricoprenti chiamati alberi ricoprenti fortemente connessi (strongly feasible spanning trees) Definizioni (equivalenti) di albero ricoprente fortemente connesso:. Un albero ricoprente è fortemente connesso se ogni arco con flusso uguale al lower bound punta verso il nodo radice (nodo ) e se ogni arco con flusso uguale all upper bound punta in verso opposto. Un albero ricoprente è fortemente connesso se a partire da ogni nodo è possibile inviare un flusso positivo verso il nodo radice utilizzando solo gli archi dell albero e senza violare i bound sugli archi.
Un algoritmo per il flusso a costo minimo: il simplesso Definizioni (equivalenti) di albero ricoprente fortemente connesso. Un albero ricoprente è fortemente connesso se ogni arco con flusso uguale al lower bound punta verso il nodo radice (nodo ) e se ogni arco con flusso uguale all upper bound punta in verso opposto. Un albero ricoprente è fortemente connesso se a partire da ogni nodo è possibile inviare un flusso positivo verso il nodo radice utilizzando solo gli archi dell albero e senza violare i bound sugli archi. (,3) (,) (3,3) 3 4 (3,6) (,3) 6 (3,4) (,) i (x i, u i ), l i = albero non fortemente connesso (,) (,) (3,) 3 4 (6,6) (,3) (,4) 7 8 (4,6) (,) 9 6 7
Un algoritmo per il flusso a costo minimo: il simplesso Supponendo che fra ogni coppia di nodi esista un cammino diretto in cui ogni arco ha capacità infinita e scegliendo una struttura ad albero iniziale T nel modo seguente: aggiungi in T l arco (, ) a capacità infinita, se il nodo è un nodo fornitore (a()>) o di transito a()=b()= con un flusso pari a a() aggiungi in T l arco (, ) a capacità infinita, se il nodo è un nodo domanda (b()>) con un flusso pari a b() inserisci tutti gli altri archi nell insieme L (a flusso nullo) l insieme U è vuoto si ottiene un albero ricoprente fortemente connesso Si noti che un albero ricoprente non degenere è fortemente connesso
Un algoritmo per il flusso a costo minimo: il simplesso Durante un operazione di pivot, la seguente regola di selezione dell arco uscente dall albero permette di passare da un albero ricoprente fortemente connesso ad un altro Selezione arco uscente L arco uscente da selezionare è l ultimo arco blocking incontrato visitando il ciclo di pivot secondo l orientamento del ciclo a partire dal nodo apice (,3) (,) (3,3) 3 4 (3,6) (,3) 6 (3,4) (,) i (x i, u i ), l i = (,3) (,) (3,3) 3 4 (3,6) (,3) 6 (3,4) (,) Nodo apice Ciclo di pivot (degenere) 7 8 (4,6) (,) 9 7 8 (4,6) (,) 9 (,)
Un algoritmo per il flusso a costo minimo: il simplesso Selezione arco uscente L arco uscente da selezionare è l ultimo arco blocking incontrato visitando il ciclo di pivot secondo l orientamento del ciclo a partire dal nodo apice (nodo del ciclo più vicino al nodo radice) i (x i, u i ) (,3) (,) (4,6) (3,3) 3 4 (3,6) (,3) 6 7 8 9 (,) (3,4) (,) (,) Nodo apice Ciclo di pivot (degenere) archi blocking: (,3) e (7,) arco selezionato: (7,) Il flusso lungo il ciclo non varia
Un algoritmo per il flusso a costo minimo: il simplesso Il nuovo albero ricoprente è fortemente connesso. Infatti: i (x i, u i ) (,3) (4,6) (3,3) 3 4 (3,6) W Nodo apice (,3) W 7 8 9 k (,) l (3,4) 6 (,) (,) Archi di W : poiché (,7) è l ultimo arco blocking è possibile inviare flusso positivo sugli archi di W verso il nodo radice Per gli archi di W valgono le seguenti considerazioni: ) Se il ciclo di pivot non era degenere, allora è stato inviato un flusso positivo lungo gli archi di W. Tale flusso può ora essere rinviato indietro verso il nodo radice; ) Se il ciclo di pivot era degenere, allora nessun flusso è stato modificato nel ciclo (e nell albero). Quindi se prima dagli archi di W si poteva inviare flusso positivo verso la radice, lo si può fare anche ora. c.d.d.
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Ad ogni ciclo di pivot non degenere il valore della funzione obiettivo diminuisce di c kl δ dove (k,l) è l arco entrante e δ> l incremento di flusso lungo il ciclo. Per cui se il problema ha soluzione ottima finita, il numero di cicli di pivot non degeneri è finito Con alberi ricoprenti fortemente connessi, è possibile mostrare che il numero di cicli di pivot degeneri, che si hanno tra due cicli di pivot non degeneri, è finito.
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Supponiamo che l arco entrante (k,l) abbia c kl <, e che entri con un valore del flusso pari al lower bound generando un ciclo di pivot degenere. Poiché l albero di partenza è fortemente connesso, posso inviare flusso, attraverso gli archi dell albero, da ogni nodo verso la radice. i (x i, u i ) (,3) (,) (4,6) (3,3) 3 4 (3,6) (,3) 6 7 8 9 (,) k l (3,4) (,) (,) Nodo apice Di conseguenza, se il ciclo è degenere, l arco (blocking) uscente deve trovarsi necessariamente tra il nodo apice ed il nodo k. Nell esempio, esce l arco (7,).
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo Si noti che, la rimozione dell arco (7,) partiziona i nodi dell albero di partenza in due sottoalberi: T ={,,3,4,,6,8,} che contiene la radice e T ={7,9}. i (x i, u i ) (,3) (,) (4,6) (3,3) 3 4 (3,6) (,3) 6 7 8 9 (,) k l (3,4) (,) (,) Calcolo dei nuovi potenziali ai nodi: c ' i, i, π = c π( i) + ( ) = ( i, ) T La preservazione della condizione π( ) = Implica che i potenziali dei nodi in T non cambino, mentre i potenziali dei nodi in T subiscono una riduzione di c kl = c 9,. Dato che c 9, <: prima dell'aggiunta dell'arco (9,): π(9) = c 9, + π() c ' 9, dopo: c ' 9, = c 9, π(9) + π() = π(9) = c 9, + π() prima dell'aggiunta dell'arco (9,): π(7) = c 9,7 + π(9) = c 9,7 + c 9, + π() c ' 9, dopo: π(7) = c 9,7 + π(9) = c 9,7 + c 9, + π()
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo In ogni ciclo degenere con c kl <, quindi, i potenziali dei nodi possono solo diminuire. Dato che il potenziale di un nodo è un valore intero e non può scendere sotto nc, con C = max e n= V, abbiamo che il numero ( i, ) A { ci, } di cicli degeneri è finito. i (x i, u i ) (,3) (3,3) (3,6) (,3) 3 4 (3,4) 6 (,) (,) 7 8 (4,6) (,) 9 (,) k l Si può dimostrare infatti che se π( ) =, il potenziale del nodo k rappresenta il costo per inviare una unità di flusso dal nodo al nodo k lungo gli archi dell albero. Tale valore non può essere inferiore ad nc.
Un algoritmo per il flusso a costo minimo: il simplesso Convergenza dell algoritmo L argomento si può applicare anche se l arco entrante (k,l) ha c kl >, ed entra con un valore del flusso pari all upper bound, generando un ciclo di pivot degenere. In questo caso il ragionamento si può ripetere invertendo il senso di percorrenza del ciclo. i (x i, u i ) (,3) (3,3) (3,6) (,3) 3 4 (3,4) Anche in questo caso si dimostra che i potenziali dei nodi possono solo diminuire. 6 (,) (,) 7 8 (4,6) (,) 9 (,) k l
Un algoritmo per il flusso a costo minimo: il simplesso Complessità del simplesso Sebbene non esista una versione polinomiale del simplesso, esistono delle varianti dell algoritmo, come il simplesso duale (che impiega O(m 3 log n) operazioni, con m= A e n= V ), che sono polinomiali nella dimensione dell istanza. Esistono inoltre molti altri algoritmi che consentono di risolvere un problema di flusso a costo minimo in tempo polinomiale.
Un algoritmo per il flusso a costo minimo: il simplesso Connessioni con l algoritmo del simplesso per la Programmazione Lineare un problema di flusso a costo minimo può formularsi come il problema di PL, P: minc T x Ax x x L algoritmo del simplesso passa da una soluzione di base (vertice del poliedro) ad un altra fin quando non raggiunge una soluzione ottima (se esiste). Una soluzione di base per P è definita da tre insiemi (H, L, U) dove: - H è l insieme delle variabili in base; - L è l insieme delle variabili fuori base, il cui valore è pari al lower bound; - U è l insieme delle variabili fuori base, il cui valore è pari all upper bound. = u l b
Un algoritmo per il flusso a costo minimo: il simplesso Connessioni con l algoritmo del simplesso per la Programmazione Lineare E possibile mostrare la corrispondenza uno-ad-uno tra soluzioni di base e alberi ricoprenti della rete G Ogni colonna della matrice A è associata ad un arco di G ed è della forma A i = e i e dove =... Si noti che le righe di A sono linearmente dipendenti, la matrice A ha quindi al massimo rango V - (e faremo vedere che se G è connesso ha esattamente rango V -) e i
Un algoritmo per il flusso a costo minimo: il simplesso Corrispondenza tra alberi ricoprenti di G e soluzioni di base della matrice A Sia T un albero ricoprente di G 3 4 B = (,) (3,) (3,) (,4) 3 4 Ordiniamo i nodi (cioè, le righe della matrice) secondo l ordine inverso dato dalla visita in profondità dell albero (a partire dal nodo radice). Si noti che in tale ordinamento ogni nodo appare prima dei suoi predecessori. Gli archi sono ordinati visitando i nodi secondo l ordinamento sopra riportato, e, per ogni nodo, selezionando l unico arco incidente ad esso sul cammino verso il nodo radice
Un algoritmo per il flusso a costo minimo: il simplesso 3 4 B = 3 4 (,) (3,) (3,) (,4) Nuovo ordinamento dei nodi: 4---3- Nuovo ordinamento degli archi: (,4) - (,) - (3,) - (3,) Nota: la matrice B (B senza la riga ) è una matrice triangolare inferiore B ' = 4 3 (,4) (,) (3,) (3,)
Un algoritmo per il flusso a costo minimo: il simplesso Il procedimento vale in generale Le righe e le colonne di una matrice di incidenza nodi-archi relativa ad un albero ricoprente possono essere riordinate per ottenere una matrice triangolare inferiore. Infatti: Sia T un albero ricoprente, sia i un nodo e sia il predecessore di i nel cammino minimo dalla radice al nodo. Supponiamo che (i,) sia in T (supponiamo che (,i) sia in T ). L ordinamento dei nodi assicura che è visitato dopo i. Quindi, la colonna A i, avrà (avrà -) in riga r, corrispondente al nodo i, ed un - (un ) in una riga dopo r, corrispondente al nodo. c.d.d. Il determinante di una matrice triangolare inferiore è pari al prodotto degli elementi della diagonale principale (che nel nostro caso sono o ) Quindi: det( B' ) = ± cioè, B è una base di A
Un algoritmo per il flusso a costo minimo: il simplesso Corrispondenza tra soluzioni di base della matrice A e alberi ricoprenti di G Data una soluzione di base, sia B la base di A corrispondente. Ogni base B di A ha V - colonne che corrispondono ad V - archi di G Sia G il sottografo di G formato da questi V - archi. Per assurdo, supponiamo che G contenga un ciclo W. Dato un senso di percorrenza del ciclo, sia W l insieme degli archi concordi e sia W l insieme degli archi discordi con tale senso di percorrenza. Si ha A i, A i, (i, ) W (i, ) W = (e i e ) (e i e ) = (i, ) W (i, ) W Che è assurdo perché le colonne di B sono linearmente Indipendenti. Quindi, una base di A corrisponde ad un albero ricoprente. Esempio: (,) + (,4) (3,4) (,3) = 3 4