Appunti di Ottimizzazione Combinatoria e Reti 2008/2009

cli.di.unipi.it

Appunti di Ottimizzzione Combinatoria e Reti

Appunti di Ottimizzazione Combinatoria e Reti2008/2009Daniele Bevilacqua


IntroduzioneIl corso ha l’obiettivo di presentare le tecniche e le idee per riuscire a risolvere o comunquestimare problemi di programmazione lineare intera considerati intrattabili.Nel primo capitolo saranno ripresi dalla ricerca operativa due problemi di flusso su grafo esaranno introdotti nuovi algoritmi particolarmente efficienti per risolverli: questo perché,come emergerà da successivi esempi, molti problemi di ottimizzazione combinatoria possonoessere modellati come, o hanno al loro interno una struttura di, problema di flusso su grafo.Nel secondo capitolo saranno brevemente accennati alcuni problemi di ottimizzazionecombinatoria legata alla progettazione ed alla gestione di reti di comunicazione.Nel terzo capitolo si inizierà l’introduzione alle tecniche di risoluzione di problemi diprogrammazione lineare intera presentando degli algoritmi euristici in grado di fornire unasoluzione ammissibile, e di come poter valutare la bontà della soluzione individuata.Nel quarto capitolo sarà accennata la teoria dei rilassamenti e su come sia possibilemanipolare la struttura dei problemi di programmazione lineare intera per ottenere problemiaffini più semplici da risolvere la cui soluzione possa servire come indicazione generica dellasoluzione del problema di partenza.Infine, nel quinto capitolo si vedrà un algoritmo in grado di utilizzare approcci euristici edinformazioni derivanti dai rilassamenti per risolvere all’ottimo, o con un qualsiasi grado diapprossimazione desiderato, istanze anche rilevanti di problemi di programmazione lineareintera.Dopo ogni argomento introdotto sarà riportato un breve esercizio, mi auguro, chiarificatore:tali esercizi sono stati incontrati durante il corso o fanno parte di esami degli anni passati.Questi appunti sono un semplice riassunto di quanto visto a lezione: spero possano essere utilia chi deciderà di seguire il corso di ottimizzazione combinatoria e reti.Chiaramente, non hanno la pretesa di essere esaustivi né di sostituirsi agli appunti ufficiali delcorso e alle lezioni.Buon studio!Daniele Bevilacqua2


Indice1. Grafi e reti di flusso Pag 31.1 Il problema di flusso massimo Pag 3Esempio Pag 71.2 Il problema di flusso di costo minimo Pag 91.2.1 Richiami teorici Pag 91.2.2 Algoritmo basato su cammini minimi successivi Pag 11Esempio Pag 131.2.3 Algoritmo basato su cancellazione di cicli Pag 16Esempio Pag 172. Routing in reti di comunicazione Pag 182.1 Cammini bicriterio ottimi Pag 182.2 Cammini di costo minimo e hop minimi Pag 19Esempio Pag 193. Euristiche Pag 213.1 Algoritmo euristico per il problema di copertura Pag 22Esempio Pag 223.2 Algoritmo euristico per il problema dello zaino Pag 233.3 Algoritmo euristico per il problema del commesso viaggiatore Pag 25Esempio Pag 263.4 Algoritmo euristico per il problema di copertura su grafo pesato Pag 27Esempio Pag 283.5 Algoritmi di ricerca locale Pag 293.5.1 Ricerca locale per lo zaino binario Pag 303.5.2 Ricerca locale per il ciclo hamiltoniano Pag 313.6 Metaeuristiche Pag 314. Rilassamenti Pag 334.1 Teoria generale Pag 334.2 Il rilassamento continuo Pag 344.3 Il rilassamento per eliminazione di vincoli Pag 354.4 Il rilassamento lagrangiano Pag 36Esempio Pag 384.5 Aspetti algoritmici del rilassamento lagrangiano Pag 40Esempio Pag 415. Algoritmi enumerativi Pag 435.1 Algoritmo Branch’n’Bound Pag 435.1.1 Rilassamenti ed euristiche Pag 455.1.2 Strategia di visita NEXT(Q) Pag 465.1.3 Regole di branching Pag 46Esempio Pag 473


1.Grafi e reti di flussoIn questa sezione verranno presentati degli algoritmi particolarmente efficienti per risolvereproblemi di flusso su grafo.Lo studio dei problemi di flusso è importante perché molti problemi di ottimizzazione sonocaratterizzati, o possono esserlo sotto opportune modifiche, da una struttura di grafo: avere deglialgoritmi per risolvere efficientemente tali problemi tornerà utile nei successivi modelli diottimizzazione combinatoria. Inoltre, come si vedrà più avanti (rilassamenti) tornerà utile laproprietà di integralità del flusso.1.1 Il problema di flusso massimoIl problema di flusso massimo consiste nel determinare la massima quantità di flusso che èpossibile inviare da una (o eventualmente, più) sorgente, tipicamente indicata con s, ad una (o più)destinazione t attraverso il grafo G = (N,A).Il modello è il seguente:max v∑0 ≤ xijxji( j,i)∈BS( i))≤ uij⎧ − v se i = s⎪− ∑ xij= ⎨ v se i = t( i,j)∈FS( i ⎪⎩0altrimenti∀(i,j)∈ Ai ∈ NNel corso di ricerca operativa è stato visto l’algoritmo basato sui cammini aumentanti perindividuare il valore ottimo v.Con un simile approccio al caso pessimo, ad ogni iterazione viene esplorato tutto il grafo, senzaalcuna garanzia di riuscire ad individuare un cammino aumentante. Si introduce allora il concettodi preflusso.Il preflusso mantiene solo i vincoli di ammissibilità, senza tener conto dei vincoli di conservazionedel flusso: si definisce quindi lo sbilancio del nodo i la quantitàei=∑x−∑xjiij( j,i)∈BS( i)( i,j)∈FS( i)Un nodo si dice attivo se e i > 0 , altrimenti è bilanciato.Ad ogni iterazione viene selezionato un nodo attivo e si analizzano solo i nodi adiacenti: in questomodo si evita di prendere in considerazione l’intero grafo, come nel caso dell’algoritmo basato suicammini aumentanti, e si utilizza solo l’informazione locale del nodo attivo.L’algoritmo cercherà poi di bilanciare il nodo spingendone localmente l’eccesso, tentando di farloarrivare a destinazione: per instradare tale eccesso si lascia guidare da etichette associate ai nodi.Una etichetta si definisce valida se rispetta le seguenti proprietà:4


dt= 0( i,j)∈ A : x( j,i)∈ A : xijij< uij> 0 ddii≤ d≤ djj+ 1+ 1Un arco (i,j) si dice ammissibile per i se vale d d + 1. Analogamente, un arco (j,i) si diceammissibile per j se sussiste l’uguaglianza.Di fatto l’etichetta associata ad un nodo è una stima per difetto della lunghezza dei camminiaumentanti da i a t.Si osservi infatti il seguente semplice esempio:i= jVale d i ≤ d1 + 1 ≤ ( d 2 + 1) + 1 ≤ ( d3+ 1) + 2 ≤ ( dt+ 1) + 3 = 0 + 4 = 4 , che è il numero di archi delcammino aumentante.Si nota che la lunghezza del generico cammino aumentante è al più (n-1): una etichetta di valoremaggiore o uguale a n indica che non esistono cammini aumentanti dal nodo i alla sorgente.Questo, come sarà chiaro più avanti, è un invariante dell’algoritmo.Le operazioni effettuate dall’algoritmo sono di 3 tipi:• Push lungo l’arco (i,j), push in avantiVale e i > 0 , ossia i è un nodo attivo. L’arco ( i,j)∈ FS(i)è ammissibile. Viene determinata laquantità θ = min{ e , u − x } cioè il minimo tra lo sbilanciamento del nodo i e la capacitàiijijresidua dell’arco (i,j), e vengono effettuate le seguenti modifiche sul grafo:x = θ , e − = θ,e + = θ .ij+ij• Push lungo l’arco (j,i), push all’indietroVale e i > 0 , ossia i è un nodo attivo. L’arco ( j,i)∈ BS(i)è ammissibile. Viene determinata laquantità θ = min{ e i, x } cioè il minimo tra lo sbilanciamento del nodo i e il flusso attualeijsull’arco (i,j), e vengono effettuate le seguenti modifiche sul grafo:x − = θ , e − = θ , e + = θ .• RelabelNon esistono cammini aumentanti formati da diarchi, perché la stella uscente del nodo i èsatura, oppure gli archi della stella entrante sono tutti vuoti, oppure esistono archi utilizzabilima non ammissibili. Allora l’algoritmo aggiorna l’etichetta del nodo id 1 + min{ d : ( i,j)∈ FS(i)x < u ,( j,i)∈ BS(i)x > 0}i=jij ijijijij5


Lo schema dell’algoritmo è il seguente:beginx := 0; x = u ∀( s,j)∈ FS(S); ETICHETTATURA_VALIDA(G,d); d s= n ;sjsjrepeatseleziona un nodo v con ev> 0 ;if (esiste (v,j) ammissibile) then Push(v,j);else if (esiste (i,v) ammissibile) then Push(i,v);else relabel;until tutti i nodi sono bilanciatiendLa complessità di tale algoritmo è O ( n2 m).L’etichettatura valida può essere realizzata utilizzando una visita a ventaglio al contrario, ossiapartendo dalla destinazione.Nell’inizializzazione dell’algoritmo viene saturata la stella uscente della sorgente e la sua etichettaviene posta uguale ad n: ciò significa che non esistono cammini aumentanti dalla sorgente alladestinazione e questo invariante viene mantenuto per tutto l’algoritmo dato che le etichettepossono solo crescere e mai decrescere. Tale invariante garantisce la correttezza dell’algoritmo:infatti, quando tutti i nodi sono bilanciati, si ha la garanzia che il flusso trovato è quello massimo.Infatti, man mano che l’eccesso viene spinto attraverso il grafo si satureranno sicuramente degliarchi oppure si bilanceranno i nodi: se così non fosse, sarebbe ancora possibile trovare deicammini aumentanti.L’algoritmo è garantito terminare; l’eventuale eccesso dei nodi da cui non esistono camminiminimi verso la destinazione verrà infatti prima o poi rimandato indietro ad effetto dell’operazionedi relabel: infatti, se non si possono utilizzare archi uscenti perché saturi, l’unico modo perdiminuire l’eccesso del nodo attivo è cercare di utilizzare gli archi entranti, effettuando pushall’indietro diminuendo così il valore del flusso entrante. Dato che non c’è alcun bilancio darispettare (solo il valore v che è la variabile da massimizzare) non rimarrà alcun eccesso all’internodel grafo.Una prova tangibile dell’ottimalità del flusso individuato è dato dall’individuazione di un taglio(Ns,Nt) di capacità minima: tale taglio viene automaticamente individuato al terminedell’algoritmo, in quanto faranno parte dell’insieme Ns tutti i nodi il cui valore d’etichetta èmaggiore o uguale a n; d’altra parte è semplice immaginarsi il motivo: se non esistono camminiaumentanti dal nodo i alla destinazione, significa che la sua stella uscente è satura e gli archientranti sono vuoti. Il nodo i entrerà a far parte del taglio Ns, e lo stesso vale per tutti i nodi conetichetta > n.Essendo gli archi uscenti saturi e quelli entranti vuoti, il flusso del taglio vale∑ ∑+x(Ns,Nt)= xij − xij= ∑uij= u(Ns,Nt)= v+ −( i,j)∈A( i,j)∈ A ( i,j)∈Aossia ha raggiunto la sua capacità, quindi è il flusso massimo e v è il valore ottimo.6


Esempio: algoritmo basato su preflussiMassimizzare il flusso relativo al grafo in figura. Sugli archi è riportata la relativa capacità. Lasorgente è il nodo 1, la destinazione il nodo 6.L’algoritmo in fase di inizializzazione satura la stella uscente della sorgente e pone la sua etichettaal valore n. Quindi, con una visita a ventaglio al contrario partendo dalla destinazione creal’etichettatura valida e l’algoritmo inizia selezionando il nodo attivo di etichetta più alta.Eccessi inizialie = ; e = 8; e = 0; e2 4 3 4 5=Etichette inizialid = ; d = d = 2; d = d = 1; d162 3 4 5 6=Esecuzione dell’algoritmo0 . Gli eccessi della sorgente e della destinazione non vengono contati.0.Iterazione Nodo selezionato Operazione Cambiamenti1 2 Push avanti x25= 2;e2= 2; e4= 22 2 Relabel d2= 73 2 Push indietro x 12= 2;e 2= 04 3 Push avanti x 34 = 4;e3= 4; e4= 45 3 Push avanti x35= 3;e3= 1; e5= 56 3 Relabel d3= 77 3 Push indietro x 13 = 7;e 3 = 08 5 Push avanti x 56= 5;e 5= 09 4 Push avanti x 46 = 2;e 4 = 210 4 Relabel d 5 = 211 4 Push avanti x 45 = 2;e4= 0; e5= 212 5 Push avanti x = ; e 056 7 5 =7


Flusso individuato con relativo taglio di capacità minima:NNst= {1,2,3}= {4,5,6}Capacità del taglio = v = 9.Può talvolta verificarsi un effetto, denominato effetto ping pong, per cui due nodi si scambianovicendevolmente unità di flusso finché le loro etichette crescono –lentamente- al punto tale dapoter rimandare l’eccesso alla sorgente. In genere i criteri di selezione dei nodi attivi limitano laprobabilità che questo tale effetto si verifichi; le reali implementazioni dell’algoritmo sono ingrado di riconoscere situazioni del genere e portarle subito alla situazione stabile.8


1.2 Il problema di flusso di costo minimoVerranno proposti e studiati due algoritmi per risolvere il problema di flusso di costo minimo: unobasato sui cammini aumentanti di costo minimo ed uno basato sulla cancellazione di cicli.Il modello è il seguente:min∑0 ≤ xxij∑cij( i,j)∈A−≤ uijxij∑xjiij( j,i)∈A( i,j)∈A= b( i,j)∈ Aii ∈ N1.2.1 Richiami teoriciViene utilizzato come nel caso precedente un flusso rilassato, che qui prende il nome dipseudoflusso, che rispetta i soli vincoli di ammissibilità: analogamente all’algoritmo precedente sicrea quindi uno sbilanciamento nei nodi, ma a differenza del precedente problema qui i nodihanno un preciso bilancio da rispettare.Si definisce quindi lo sbilanciamento del nodo i rispetto (allo pseudoflusso) x comee ( i)=x∑x−∑xjiij( j,i)∈A( i,j)∈A− biSi rappresenta con exil vettore di tutti gli sbilanciamenti dei nodi del grafo.L’algoritmo mantiene i nodi con sbilanciamento in due insiemi distinti: l’insieme dei nodi offerta el’insieme dei nodi domandaOx= { i ∈ N : e ( i)> 0} D = { i ∈ N : e ( i)< 0}xxxDa notare che, rispetto alla rappresentazione classica dei bilanci di un nodo, ad effetto del calcolodello sbilanciamento i nodi offerta hanno un “bilancio” positivo, mentre quelli domanda unonegativo.Chiaramente, se entrambi gli insiemi sono vuoti significa che tutti i nodi sono bilanciati quindi lopseudoflusso, che è ammissibile, mantiene anche i vincoli di conservazione del flusso: è quindi unflusso a tutti gli effetti.Dato un cammino P tra una qualunque coppia di nodi s e t, si dice aumentante se la capacità delcammino è maggiore di 0, ossia+−θ ( P, x)= min{min{( i,j)∈ P : u − x },min{( j,i)∈ P : x }} > 0ijLa capacità del cammino è uguale a 0 solo se un arco attraversato in senso concorde è saturo,oppure se un arco attraversato in senso contrario è vuoto. Dato lo pseudoflusso x, è possibileinviare 0 < θ < θ(P,x) quantità di flusso lungo P passando da x a x(θ) = x + θP.Inviare flusso lungo un cammino aumentante modifica solo lo sbilanciamento degli estremi delcammino:ijij9


⎧ex( i)−θse i = s⎪ex( i)= ⎨ex( i)+ θ se i = t⎪⎩ ex( i)altrimentiSe s=t allora si parla di ciclo aumentante: inviare flusso lungo un ciclo non modifica alcunsbilanciamento. Il costo del cammino (o ciclo) e del flusso valgono rispettivamentec(P)= ∑cij− ∑c+( i,j)∈Pij−( i,j)∈Pcx(θ ) = c(x + θP)= cx + θc(P)I cammini o cicli aumentanti sono determinati utilizzando il grafo residuo: infatti, per ogni s,t, adogni cammino (o ciclo) aumentanti da s a t rispetto ad x in G esiste uno ed un solo cammino (ociclo) orientato da s a t in Gx, ed i cammini hanno lo stesso costo.Si introduce adesso un importante teorema che garantirà la correttezza dell’algoritmo dei camminiminimi: il teorema di decomposizione.Siano dati due qualsiasi pseudo flussi x,x’. Allora esistono k (


1.2.2 Algoritmo basato su cammini minimi successiviL’algoritmo mantiene uno pseudoflusso minimale x e determina ad ogni iterazione un camminoaumentante di costo minimo tra s ∈ Ox, t ∈ Dxper eliminare, al minor costo possibile, losbilanciamento di x. L’uso di cammini aumentanti di costo minimo permettere di mantenere laminimalità dello pseudoflusso. Vale infatti il seguente teorema:Sia x uno pseudoflusso minimale, sia P un cammino aumentante rispetto ad x avente costominimo tra tutti i cammini che uniscono s ∈ Ox, t ∈ Dx. Allora, comunque si scelga0 ≤ θ ≤ θ ( P,x)x(θ ) = x + θPè uno pseudoflusso minimale.Infatti, fissato tale θ ed ottenuto x(θ), sia x’ un generico pseudoflusso avente lo stessovettore di sbilanciamenti, ossia per cui vale ex= e x( θ ).Per il teorema di decomposizione tale x’ può essere ricavato da x nel seguente modo:x' = x + θ 1 P1 + ... + θ nPn+ θ n+1C1+ ... + θ kCme passando ai costi si ottienecx cx + θ c(P ) + ... + θ c(P ) + θ c(C ) + ... + θ c(C )' = 1 1 n n n+1 1k m.Valgono le seguenti osservazioni:o x è minimale, quindi non esistono cicli aumentanti di costo negativo;o x’ ha il vettore di sbilanciamenti di x(θ)=x+ θP. Rispetto ad x quindi cambiasolamente lo sbilanciamento degli estremi di P. Per il teorema di decomposizioneallora tutti i cammini P i sono tra s e t, e P è il cammino di costo minimo; vale quindic( P i ) ≥ c(P);o dato che i cicli non cambiano lo sbilanciamento, e dato che x’ ha lo sbilanciamentodi x(θ), vale ∑θ i= θ .ni=1Valgono quindi le seguenti maggiorazioni:cx' = cx + θ1c(P1 ) + ... + θnc(Pn) + θn+1c(C1)+ ... + θkc(Cm) ≥ cx + θ1c(P1) + ... + θnc(Pn)≥ cx + θ1c( P)+ ... + θnc(P)= cx + ( θ1 + ... + θn) c(P)= cx + θc(P)= c(x + θP)= cx(θ )x(θ) ha il costo minore o uguale di tutti i generici pseudoflussi aventi lo stesso vettore disbilanciamento, quindi è minimale.L’algoritmo ha il seguente schema:beginendINIZIALIZZA(x);caso = “ottimo”;while (g(x)!=0) and (caso != “vuoto”) doif TROVA_CAMMINO_MINIMOthen AUMENTA_FLUSSO;else caso = “vuoto”;11


g(x) è la misura della bontà dello pseudoflusso: x)= ∑ex( i)= −∑g ( e ( i). Quando vale g(x)=0i∈O x i∈Dxsono stati azzerati tutti gli sbilanciamenti dei nodi e quindi lo pseudoflusso minimale è un flussominimale (quindi ottimo) e l’algoritmo termina.Se invece non viene trovato un cammino che unisce un nodo s ed un nodo t significa che non c’èmodo di liberarsi dell’eccesso (ad esempio, il bilancio di un nodo sorgente supera la capacità dellasua stella uscente): allora il problema di partenza è mal posto, e l’algoritmo termina segnalandolo(caso=vuoto).⎧ 0 se cij> 0L’inizializzazione costruisce uno pseudoflusso minimale x ponendo x ij = ⎨, ossia⎩uijaltrimentisaturando gli archi il cui costo è negativo. Questo assicura che nel grafo residuo tutti i costi degliarchi siano positivi: non esistono perciò cicli orientati di costo negativo e quindi, cicli aumentanti inG di costo negativo; non esistendo cicli aumentanti di costo negativo x è uno pseudoflussominimale e l’invariante dell’algoritmo viene rispettato.Il cammino minimo viene individuato applicando l’algoritmo di Bellman. Infine, AUMENTA_FLUSSOinvia sul cammino individuato la massima quantità possibile di flusso, cercando di diminuire il piùpossibile lo sbilanciamento dei nodi.Se i parametri del problema sono a componenti intere, allora il flusso individuato ad ogniiterazione sarà intero e varrà almeno 1: l’algoritmo esegue al più g(x) iterazioni, ossia quellenecessarie per azzerare lo pseudoflusso (se viene sempre individuato un cammino minimoaumentante).La complessità dipende quindi da g(x) stessa, ed ogni iterazione costa O(nm) per l’algoritmo diBellman.g ( x)≤ u + | b | = g .Si può grossolanamente stimare g(x) nel seguente modo: ∑ ij ∑xi( i,j)∈ A:c ij < 0 i∈N: b i < 0La complessità dell’algoritmo è quindi O ( gnm)e si definisce pseudopolinomiale in quantodipende dai parametri di ingresso b , u .iij12


Esempio: algoritmo basato su cammini minimi successiviCalcolare il flusso di costo minimo relativo al grafo in figura. Sugli archi è riportata la relativacapacità ed il costo; accanto ai nodi è indicato il relativo bilancio.Gli sbilanciamenti sono e 2 = e3= 5, nodi offerta, e e 4 = −3;e 6 = −7, nodi domanda.Tutti gli archi hanno costo positivo, quindi non c’è alcun flusso iniziale. Il grafo residuo coincide conil grafo di partenza G. L’applicazione dell’algoritmo di Bellman individua il seguente albero deicammini minimi:I nodi 4 e 6 richiedono flusso: come strategiaviene solitamente scelto il nodo con etichettaminima.Il cammino aumentante individuato è quindic={2-5-6}, su cui è possibile inviare la quantità diflusso θ = min{| e2 |,| e6|, θ ( P,x)}= 5 .Gli sbilanciamenti sono quindi e 2 = 0;e 3 = 5e = − ; e = 2 .4 3 6 −13


Flusso attuale e grafo residuo aggiornato:Si cerca nuovamente un albero dei cammini minimi sul nuovo grafo residuo ottenendo il seguente:Selezionando sempre il nodo con etichettaminima si individua il cammino aumentante apartire da un nodo sorgente (qui il solo nodo 3)ottenendo c={3-6} su cui è possibile inviare θ=2unità di flusso.Gli sbilanciamenti aggiornati sono e = ; e = 33 2 4 −14


Flusso attuale e grafo residuo aggiornato:Partendo dall’unico nodo sorgente si individua il cammino aumentante c={3-6-5-4} su cui èpossibile inviare θ=3 unità di flusso: tutti gli sbilanciamenti vengono azzerati; lo pseudoflussocorrente diventa quindi il flusso ottimo e la situazione finale è la seguente:15


1.2.3 Algoritmo basato su cancellazione di cicliCome precedentemente visto, uno pseudoflusso è minimale se e solo se non esistono cicliaumentanti di costo negativo; ciò suggerisce un differente approccio al problema del flusso dicosto minimo: si determina un flusso ammissibile e si utilizzano cicli aumentanti di costo negativoper ottenere flussi ammissibili di costo inferiore.L’algoritmo termina quando non esistono più cicli aumentanti di costo negativo: il flussoammissibile così determinato è quello di costo minimo, quindi ottimo.Un ciclo è “cancellato” quando viene saturato, facendovi circolare θ(C,x) flusso: esso non risulteràpiù aumentante per il flusso x(θ). Da notare che ciò non significa che non potrà più tornare adessere aumentante per altri cicli individuati successivamente, ma solo che viene cancellatorispetto a x(θ).Come già precedentemente osservato, determinare un ciclo aumentante di costo negativo in Gequivale a cercare un ciclo orientato di costo negativo in Gx: tale problema può essereefficientemente risolto con SPT.L, osservando le etichette al suo termine.L’algoritmo ha il seguente schema:beginendif FLUSSO_AMMISSIBILE thencaso = “ottimo”;while TROVA_CICLO do CAMBIA_FLUSSO;else caso = “vuoto”;Analogamente alle osservazioni fatte sul precedente algoritmo, per dati interi il flusso ad ogniiterazione è intero, e viene determinato θ > 1 ad ogni passo dell’algoritmo.Effettuando le seguenti sovrastime u ' = max{ u } c'= max{ c }, il costo del flusso ottimo èsicuramente –mu’c’ < cx < mu’c’. Dato che la funzione obiettivo decresce al meno di 1 ad ogniiterazione, l’algoritmo effettua O(mu’c’) passi, ognuno di costo O(nm) per l’algoritmo di Bellman.2La complessità dell’algoritmo è quindi O ( m nu'c') ed è nuovamente pseudopolinomiale.Come si vedrà nei prossimi capitoli, questo si definisce un algoritmo di ricerca locale: si parteinfatti da una soluzione ammissibile e, ad ogni iterazione, si provvede a modificarla, senza perderel’ammissibilità, per portarla (il più vicino possibile) al valore ottimo.ijij16


Esempio: algoritmo basato su cancellazione di cicliCalcolare il flusso di costo minimo relativo al grafo in figura. Sugli archi è riportata la relativacapacità,il costo ed il flusso ammissibile iniziale; accanto ai nodi è indicato il relativo bilancio.Il costo iniziale è cx = 40.Guardando il grafo residuo si individua il ciclo 2-5-6 (ne basta uno qualsiasi) di costo 1+2-6 = -3,quindi negativo. La quantità di flusso che è possibile inviare su tale cammino è θ = min{2,1,1} = 1.Cambiando quindi il flusso si passa ad avere costo cx = 40 – 3 = 37 e si ha la situazione seguente:Viene individuato sul grafo residuo un nuovo ciclo, ad esempio 2-5-4 di costo 1+2-4 = -1 su cui èpossibile inviare 1 unità di flusso. Il flusso viene quindi modificato lungo il ciclo di costo negativoindividuato e si passa ad avere costo cx = 37 – 1 = 36.Si continua in questo modo finché sono individuabili cicli di costo negativo. Al termine si dimostrache non ci sono ulteriori cicli applicando l’algoritmo di Bellman ed ottenendo un albero deicammini minimi: se non riesce ad ottenere significa che ci sono ancora dei cicli di costo negativo,quindi il flusso non è ancora ottimo e l’algoritmo non è terminato.17


2. Routing in reti di comunicazioneI modelli della ricerca operativa intervengono efficacemente nelle fasi di progetto, gestione emanutenzione di una rete.Alcuni tipici problemi che si possono presentare riguardano la ricerca di cammini con numero dihop minimo, cammini di affidabilità o portata massima, progetti di reti di comunicazione oproblemi di localizzazione.In questa sezione ci limiteremo ad accenni della teoria dei cammini bicriterio ottimi e all’algoritmoper individuare cammini di costo minimo e minimo numero di hop.2.1 Cammini bicriterio ottimiL’obiettivo è determinare un cammino che sia ottimale rispetto a due criteri distinti. Sia P rsl’insieme dei cammini da r a s: ad ogni P ∈ Prssi associano due valori V 1( P),V2( P)cherappresentano due generiche misure che si ha interesse a minimizzare.Confrontiamo due diversi cammini P’, P’’: si dice che P’ è dominato da P’’ se V1 ( P')≥ V1( P'') eV2 ( P')≥ V2( P'')in cui almeno una delle due disuguaglianze è stretta. In questa situazione si diceche P’’ è preferibile rispetto a P’.Se hanno uguale valore sono equivalenti, mentre se nessuno è preferibile rispetto all’altro si diceche ciascuno è non dominato rispetto all’altro (ad esempio V1 ( P')≥ V1( P'') e V2 ( P')≤ V2( P'') oviceversa).Ciò risulta immediatamente visibile se si rappresentano i valori dei diversi cammini sul pianocartesiano.Il cammino P’’’ è dominato da P’ e P’’. I cammini P’ e P’’ sono non dominati l’uno rispetto all’altro:infatti il cammino P’ è preferibile rispetto al criterio V 1 mentre il cammino P’’ lo è rispetto alcriterio V 2 .NL’insieme dei cammini non dominati Prs= { P ∈ Prs: ∃/ P'∈ Prsche domina P} è detto ancheinsieme delle soluzioni Pareto ottime. Tale insieme ha una importante proprietà: se si ordinano inmodo crescente i cammini rispetto ad un criterio, risulteranno ordinati in modo decrescenteNrispetto all’altro P P , P ,... P } V ( P ) < V ( P ) V ( P ) V ( P ) .rs= {1 2 q 1 i 1 i+ 1 2 i>2 i+118


2.2 Cammini di costo minimo e hop minimiSi ricercano i cammini bicriterio rispetto al criterio del costo complessivo del cammino ed ilnumero di hop (archi) attraversati. Supponendo un grafo privo di cicli negativi, il numero di hopnon sarà mai superiore a (n-1).Per risolvere tale problema si utilizza l’algoritmo SPT opportunamente modificato, detto SPTmultilabel, che associa a ciascun nodo i n diverse etichette d ihh=1..n-1, dove d ihrappresenta ilmigliore costo dei cammini da r a i formati da h archi.Inoltre, si tiene traccia anche dei predecessori P , ossia il nodo che precede j lungo il cammino dar a j formato da h archi.L’algoritmo ha il seguente schema:jhbeginendfor i:=1 to n dofor h:=0 to n-1 doP[i,h] = NULL; d[i,h] = M;d[r,0] = 0; Q={};repeatselect from Q; Q = Q\{};for each (u,v) ∈FS(u) doif d[u,h] + c[u,v] < d[v,h+1] thend[v,h+1] = d[u,h] + c[u,v];P[v,h+1] = ;Q=Q U {};Until Q= {};La complessità è quella del semplice SPT, ossia O(mn).Esempio: algoritmo SPT-multilabel per cammini di costo minimo e hop minimiApplicare l’algoritmo SPT multilabel al grafo in figura per determinare i cammini Pareto ottimi diradice 1 al nodo 5.19


L’algoritmo inizializza tutte le etichette a M ed i predecessori a NULL. Quindi pone l’etichetta delnodo radice a 0 ed inizia selezionando i nodi della sua stella uscente.Iterazione 1, u = (1,2) d 10 + c12= 0 + 1 = 1 < d21quindi d 21= 1, P 21= (1,3) d 10 + c13= 0 + 1 = 1 < d31quindi d 31= 1, P 31= Q= { , }Iterazione 2, u = (2,5) d 21 + c25= 1+4 = 5 < d52quindi d 52= 5, P 52= Q= { , }Iterazione 3, u = (3,2) d 31 + c32= 1+2 = 3 < d 22quindi d 22= 3, P 22= (3,4) d 31 + c34= 1+1 = 2 < d 42quindi d 42= 2, P 42= (3,5) d 31 + c35= 1+3 = 4 < d52quindi d 52= 4, P 52= Q={ , , }Iterazione 4, u = (2,5) d 22 + c25= 3 + 4 = 7 < d53quindi d 53= 7, P 53= Q={ , , }Iterazione 5, u = (4,2) d 42 + c42= 2 + 1 = 3 < d 23quindi d 23= 3, P 23= (4,5) d 42 + c45= 2 + 1 = 3 < d53quindi d 53= 3, P 53= Q= { , , }Iterazione 6, u = Nessun arco nella stella uscente di 5.Q = { , }Iterazione 7, u = (2,5) d 23 + c25= 3 + 4 = 7 < d54quindi d 54 = 7, P 54= Q= { , }Iterazione 8, u = Nessun arco nella stella uscente di 5. Q = {}Iterazione 9, u = Nessun arco nella stella uscente di 5. Q = { }Le etichette dei cammini dalla radice 1 al nodo 5 sono d 51 = M , d52= 4, d53= 3, d54= 7 . Tolte leetichette ancora non inizializzate (cioè, il nodo 5 non è raggiungibile con cammini di un solo arco) ele etichette dei cammini dominati (l’etichetta d 54 ) rimangono le etichette dei cammini d 52 e d 53 ,tra loro Pareto ottimi: infatti, il nodo 5 è raggiungibile con soli 2 archi con un cammino di costo 4,oppure con un cammino di 3 archi a costo minore.20


3. EuristicheDato che in generale i problemi di ottimizzazione combinatoria sono “difficili” dal punto di vistacomputazionale, spesso è necessario sviluppare algoritmi efficienti in grado di fornire una buonasoluzione ammissibile per il problema, cioè non troppo distante dalla soluzione ottima.In generale si utilizzano approcci di tipo greedy, ossia che determinano la soluzione attraverso unasequenza di decisioni localmente ottime, senza mai ritornare sulle decisioni prese.Il generico approccio greedy consiste nell’algoritmo seguente:BeginS = {}, Q = E;repeate = BEST(Q); Q = Q\{e};if S U {e} ∈F then S = S U {e};until Q = { } or MAXIMAL(S);endE rappresenta gli enti del problema, ad esempio gli archi per il TSP o gli oggetti per lo zaino. S è lasoluzione che viene costruita dall’algoritmo euristico.BEST(Q) rappresenta la selezione dell’ottimo locale. L’elemento e scelto deve mantenerel’ammissibilità della soluzione S, condizione espressa da S U {e} ∈F. Infine, l’algoritmo continuafinché l’insieme Q è vuoto oppure viene raggiunta la soluzione massima (MAXIMAL(S)).In generale tali procedure sono implementate ad hoc per ogni distinto problema di ottimizzazione:come per i rilassamenti, che vedremo in seguito, non esistono infatti procedure esatte per ogniproblema; ognuno deve essere accuratamente studiato ed analizzato per individuare il modomigliore per costruire una buona soluzione ammissibile.Nei problemi di massimo l’euristica, se termina, ottiene una soluzione ammissibile che è unavalutazione inferiore al valore ottimo; viceversa, in un problema di minimo, ottiene unavalutazione superiore.Dato l’approccio greedy tale soluzione ammissibile viene trovata in tempo computazionalmenteaccettabile.Di seguito saranno riportate delle euristiche per alcuni tipici problemi di ottimizzazione; di alcunevedremo anche una garanzia sulle prestazioni.L’efficacia di un algoritmo euristico, ossia la bontà della soluzione calcolata, può essere valutato inmodo sperimentale o teorico. La valutazione sperimentale viene effettuata eseguendo l’algoritmosu reali istanze di cui si conosce l’ottimi, esaminando poi le varie soluzioni con metodi statistici(media, massimo, minimo, varianza…). La valutazione teorica è a priori, dimostrandomatematicamente relazioni che forniscono valutazioni generali sul massimo errore compiutodall’algoritmo.Chiaramente lo studio teorico è meno accurato, ma fornisce valutazioni generalmente valide percomprendere il comportamento dell’algoritmo. D’altra parte lo studio teorico è più accurato manon fornisce alcuna garanzia su istanze con caratteristiche diverse.21


3.1 Algoritmo euristico per il problema di coperturaSiano E degli oggetti e F = { F1 , F2,... Fn}sottoinsiemi di E, ossia contenenti alcuni (o tutti) oggetti.Ad ogni insieme è associato il rispettivo costo c i , e l’obiettivo è individuare i sottoinsiemi checoprono interamente l’insieme degli oggetti E minimizzando i costi.Una soluzione ammissibile è una sottofamiglia di F che copre interamente E: eventuali intersezionitra due sottoinsiemi selezionati è sempre una soluzione valida, quindi la condizionesull’ammissibilità della soluzione è sempre verificata. Il MAXIMAL viene raggiunto quando tutto F èstato analizzato oppure quando tutti gli oggetti di E sono stati coperti. L’oggetto e localmentemigliore restituito dalla procedura BEST può essere selezionato in base a 3 criteri:• gli oggetti sono ordinati e selezionati per costi non decrescenti• gli oggetti sono ordinati e selezionati per costi unitari non decrescenti• gli oggetti sono ordinati e selezionati per costi unitari non decrescenti dinamici (ociattualizzati), ossia ad ogni iterazione viene calcolato , ossia i costi diviso laF / F |cardinalità degli oggetti diF i ancora non coperti.|i sIl terzo criterio di selezione è quello che dà chiaramente i risultati migliori, pur pagando il prezzodell’ordinamento ad ogni iterazione.ESEMPIO: problema di copertura, euristica greedy CUDDeterminare una soluzione della seguente istanza del problema di copertura relativa a N={1,2,…6},F i {4,5,6} {2,3,4} {1,2} {2,5,6} {1,5,6} {1,4,6} {3,4,5} {2,4,5,6}c i 1 7 8 4 9 4 9 3Utilizzando l’algoritmo greedy CUD.Iterazione 1CUD calcolato: 1/3, 7/3, 4, 4/3, 3, 4/3, 3, 3/4. Viene selezionato l’insieme F 1 = {4,5,6}di costo 1.Rimangono non coperti gli elementi {1,2,3}.Iterazione 2CUD calcolato: //, 7/2, 4, 4, 9, 4, 9, 3. Viene selezionato l’insieme F 8 = {2,4,5,6}di costo 4.Rimangono non coperti gli elementi {1,3}.Iterazione 3CUD calcolato: //, 7, 8, //, 9, 4, 9, //. Viene selezionato l’insieme F 6 = {1,4,6 } di costo 8.Rimane non coperto l’elemento {3}.Iterazione 4CUD calcolato: //, 7, //, //, //, //, 9, //. Viene selezionato l’insieme F 2 = {2,3,4}di costo 7.Tutti gli elementi sono stati coperto con una soluzione di costo 15.Osservando il problema si nota che l’insieme F 1, facente parte della soluzione, è inclusonell’insieme F 2 anch’esso presente nella soluzione: una soluzione di costo minore (14) vienequindi trovata togliendo l’insieme F 1. La soluzione ottima è S = {1,2,6} di costo 12.22


3.2 Algoritmo euristico per il problema dello zainoIl problema dello zaino consiste nel riempire un contenitore di capacità b con oggetti di pesovalore c i , senza eccedere la capacità e massimizzando il valore totale.Il modello del problema è il seguente:a i e(KP)Maxn∑i=1iin∑i=1a xic xii≤ bx ∈{0,1}La condizione da verificare per l’ammissibilità della soluzione è che l’oggetto selezionato da BESTsia compatibile con la capacità residua dello zaino. Il MAXIMAL viene raggiunto quando tutti glioggetti sono inseriti oppure quando lo zaino è pieno.L’oggetto localmente migliore può essere selezionato in base a 3 criteri:• gli oggetti sono ordinati in base al peso non decrescente: questa soluzione favoriscel’inserzione del maggior numero possibile di oggetti• gli oggetti sono ordinati in base al profitto non crescente: questa soluzione favoriscel’inserzione degli oggetti che hanno il valore maggiore• gli oggetti sono ordinati in base al profitto unitario (rapporto costo/peso), dettoordinamento CUDIl terzo criterio di selezione è in generale quello che dà risultati migliori.Per valutare la bontà dell’euristica CUD si studia il rilassamento continuo del problema (vedere piùavanti) e, avendo quindi un problema di programmazione lineare, si studia il problema duale: lasoluzione del problema duale è infatti una valutazione superiore (in quanto problema di massimo)della soluzione ottima del problema primale:( KP )Maxn∑i=1i∑i=1ina xic xii≤ bx ∈[0,1]( DKP )min yb + ∑ wiya + wiiy ≥ 0, wini=1≥ ci≥ 0Sia h l’indice del primo oggetto che non entra completamente nello zaino. La soluzione ottima delrilassamento continuo e la soluzione del problema duale sono:23


xxx*ih*j= 1b −=∀i< hh∑ − 1i=1aha x= 0 ∀j> hiicy =awhh⎧ ci− yaii


3.3 Algoritmo euristico per il problema del commesso viaggiatoreIl problema del commesso viaggiatore consiste nell’individuare su di un grafo il ciclo hamiltonianodi costo minimo.Il modello del problema è il seguente:min∑i∈Sj∉Sxijx∑ijxij( i,j)∈A∑cij( i,j)∈A≥ 1= 2∈{0,1}xij0/⊂ S ⊂ Ni ∈ N( i,j)∈ AL’algoritmo greedy sceglie ad ogni passo l’arco di costo minimo tra i rimanenti, che porti ad unnodo non ancora visitato (BEST e condizione di ottimalità della soluzione). Il MAXIMAL vieneraggiunto quando tutti i nodi sono stati visitati.L’euristica, che prende il nome di Twice Around MST, dopo aver calcolato l’albero di copertura dicosto minimo procede convertendo ogni arco nella rispettiva coppia orientata, in modo tale cheogni nodo abbia una coppia di archi entranti ed una coppia di archi uscenti: su tale grafomodificato viene ricercato un ciclo euleriano, ossia un ciclo orientato non semplice che includeogni arco una ed una sola volta; riesce a trovarlo in quanto ogni nodo ha un numero pari di archiincidenti.Se il grafo di partenza è completo a questo punto si ha la garanzia di poter trasformare il cicloeuleriano in un ciclo hamiltoniano: si iniziano a visitare i nodi del ciclo euleriano e quando sitrovano nodi già visitati si cerca una scorciatoia verso il primo nodo non ancora visitato, sfruttandola completezza del grafo. Questo, insieme ai costi non negativi degli archi e alla disuguaglianzatriangolare sui costi, garantisce che l’euristica termini e che sia una buona valutazione: se il grafonon è completo non si ha infatti la certezza di poter trovare una scorciatoia dal ciclo euleriano, equindi di ottenere un ciclo hamiltoniano ammissibile.Sia C* il ciclo hamiltoniano ottimo. Rimuovendo un arco si ottiene il cammino P* che ha costominore del ciclo e maggiore o uguale all’albero di copertura di costo minimo T*, cioè* * *c(C ) ≥ c(P ) ≥ c(T ) . Per contro, il ciclo hamiltoniano ottimo ha un costo minore o uguale alciclo euleriano, che a sua volta ha un costo minore dell’albero di copertura con gli archi*** *raddoppiati da cui è stato ottenuto, cioè 2C(T ) ≥ C(E ) ≥ C(H ) ≥ c(C ) dove H* è ilgenerico ciclo hamiltoniano.Z(TSP)− ZTAMSTL’errore relativo commesso dall’euristica RTAMST= può essere quindi stimatoZ(TSP)nel seguente modo:R TAMST*2c(T ) − c(T≤*c(T )*)= 125


ESEMPIO: euristica Twice Around MST per TSPSi individui un ciclo hamiltoniano per il grafo in figura mediante l’algoritmo euristico Twice AroundMST.L’algoritmo calcola l’albero di copertura di costo minino per il grafo di costo 5 e rappresentato infigura:Raddoppiando gli archi dell’albero di coperturasi individua un ciclo euleriano, ad esempioE = (2-4-6-5-6-1-3-1-6-4-2).A questo punto ricerca, se vi sono, degli archiscorciatoia da utilizzare per trasformare il cicloeuleriano E in un ciclo hamiltoniano H.H = (2-4-6-5-1-3-2) di costo 9.Una migliore valutazione inferiore può essere ottenuta calcolando l’M1ST, ossia l’albero dicopertura di costo minimo rafforzato dall’aggiunta dell’arco di costo minimo ancora non facenteparte dell’albero (in questo caso un arco di costo 2): in questo caso, 5+2 = 7 è la valutazioneinferiore al costo del ciclo hamiltoniano ottimo.26


3.4 Algoritmo euristico per il problema di copertura su grafo pesatoSi ha un grafo non orientato, i cui nodi rappresentano dispositivi in grado di controllare i nodiincidenti. L’obiettivo di questo problema è garantire la copertura di tutti gli archi del grafo,minimizzando i costi associati all’installazione dei dispositivi nei nodi.Il modello del problema è il seguente:mini∑i∈Nx + xx ∈{0,1}jc xini≥ 1∀(i,j)∈ APer questo problema si utilizza un differente approccio euristico, detto euristica primale-duale: sistudia infatti il duale per problema rilassato e si utilizzano le soluzione del duale per costruire unasoluzione primale ammissibile.Prima di passare al rilassamento continuo e al rispettivo duale si nota che il vincolo di integritàsulle variabili x può essere sostituito dal vincolo x > 0, in quanto il precedente vincolo e la funzioneobiettivo min garantisce che rimanga comunque non maggiore di 1.Allora il problema duale associato è il seguente:Maxyij∑yij( i,j)∈S( i)yij( i,j)∈A≥ 0∑≤ ci∀i∈ N( i,j)∈ ALe condizioni degli scarti complementari sono y ij ( x i + x j −1)= 0 e xi( ci− ∑ yij) = 0 .( i,j)∈S( i)L’algoritmo cerca ad ogni passo di rispettare la seconda condizione degli scarti complementari,permettendo violazioni nella prima.Valgono le seguenti sovrastime e sottostime: Z( WVC)≥ Z(WVC)= Z(DWVC)≥ in∑y ij( i,j)∈Aquanto la soluzione duale (le y) ed il rilassamento continuo sono una sottostima, essendo unproblema di minimo.Quando un nodo i entra in soluzione vale xi= 1, quindi per rispettare la condizione degli scarticomplementari deve valere ci= y ij. Il costo della generica soluzione S è c ( S)= ∑c ied∑( i,j)∈S( i)ogni variabile y entra al più in due sommatorie, una per il nodo i ed una per il nodo j che sono unitidall’arco (i,j). Vale quindi anche Z( WVC)≤ c(S)≤ 2 .∑y ij( i,j)∈AL’errore relativo commesso dall’euristica può quindi essere stimato e vale R ≤ 1.WVCi∈S27


ESEMPIO: euristica duale-primale per WVCSi determini una soluzione ammissibile per il problema di copertura su grafo pesato rispetto algrafo in figura.L’algoritmo inizia ponendo l’insieme degli archi A = Q ed inizializzando tutte le variabili x e y a 0.Inizia selezionando un arco qualsiasi da Q.Iterazione 1 arco (1,2)y12= min{ c1− y13− y14− y15;c2− y23− y24− y25}= 2 = c2.Quindi x2= 1 il nodo 2 entra in soluzione. Da Q vengono tolti tutti gli archi coperti dal nodo 2,ossia (1,2) (2,3) (2,4) (2,5).Iterazione 2 arco (1,3)y13= min{ c1− y12− y14− y15;c3− y23− y34}= 1 = c1.Quindi x1= 1 il nodo 1 entra in soluzione. Da Q vengono tolti tutti gli archi coperti dal nodo 1,ossia (1,3) (1,4) (1,5).Iterazione 3 arco (4,5)y45= min{ c4− y14− y24− y34;c5− y15− y25}= 2 = c5.Quindi x5= 1 il nodo 5 entra in soluzione. Da Q vengono tolti tutti gli archi coperti dal nodo 5,ossia (4,5).Iterazione 4 arco (3,4)y34= min{ c3− y13− y23;c4− y14− y24− y45}= 1 = c4.Quindi x4= 1 il nodo 4 entra in soluzione. Da Q vengono tolti tutti gli archi coperti dal nodo 4,ossia (3,4).La coda Q è adesso vuota e l’algoritmo termina con la soluzione S = {1,2,4,5} di costo c(S) = 10. Pervalutare l’errore commesso dall’euristica si calcola il costo della soluzione duale = 6.10 − 6 2L’errore commesso è quindi R = = .6 3∑y ij( i,j)∈A28


3.5 Algoritmi di ricerca localeNella trattazione di algoritmi euristici rientrano anche i cosiddetti algoritmi di ricerca locale, basatisu un’idea estremamente semplice: data una soluzione ammissibile, esaminano le soluzioni adessa “vicina” alla ricerca di una migliore. Se viene trovata, allora quella diventa la soluzionecorrente ed il processo di ricerca continua, altrimenti l’algoritmo termina su un ottimo locale (chepuò anche essere un ottimo globale).Un algoritmo di questo tipo è già stato analizzato nella sezione 1.2.3 a proposito del problema diflusso di costo minimo, l’algoritmo basato su cancellazione di cicli: partendo da un flussoammissibile, si effettuavano delle modifiche ottenendo flussi “vicini” di costo migliore fino araggiungere l’ottimo (in quel caso globale).Analogamente agli algoritmi euristici non esiste un approccio valido per ogni problema mapiuttosto uno schema generale da seguire, adattandolo di volta in volta al problema in questione.Il generico algoritmo di ricerca locale ha il seguente schema:beginx = SOLUZIONE_AMMISSIBILE;while σ(x) ≠ x do x = σ(x);end0 1 ki+L’algoritmo genera soluzioni x , x ,... x tali che x1 = σ ( xi0) . La soluzione iniziale x è datadalla procedura SOLUZIONE_AMMISSIBILE e rappresenta una generica soluzione ammissibile,ottenuta ad esempio da un algoritmo greedy.σ(x) rappresenta il processo di ricerca. In genere è implementata come σ(x) = min{c(y): y ènell’intorno di x} oppure σ(x) = min{c(y): y è nell’intorno di x, c(y)


Alcuni esempi di intorni comunemente utilizzati sono:n• F ⊆ { 0,1} , I(x)= { y ∈ F : ∑|x − y | ≤ 1}n• F ⊆ R , I(x)= { y ∈ F : ∑ x − y ≤ ε }n• F ⊆ Z , I(x)= { y ∈ F : ∑|x − y | ≤ 2}iiiiiiiiiDal momento che in generale le soluzioni dei problemi visti sono vettori di {0,1}, dato cherappresentano ad esempio oggetti che stanno o meno in uno zaino, o archi che fanno parte omeno di un cammino, il primo intorno è quello maggiormente utilizzato.In generale comunque si scelgono intorni più specifici per i problemi affrontati, ottenuti studiandoapprofonditamente il modello in questione. Ad esempio, l’intorno utilizzato dall’algoritmo basatosu cancellazione di cicli nel problema del flusso di costo minimo non è immediatamentericonducibile a nessuno dei precedenti.Solitamente la definizione di intorno è spesso implicita nella serie di mosse effettuate pertrasformare una soluzione ammissibile in un’altra.Di seguito sono esposti alcuni approcci generici al problema dello zaino binario e del commessoviaggiatore.3.5.1 Ricerca locale per lo zaino binarioData una soluzione ammissibile, si costruisce una seconda soluzione ammissibile inserendo nellozaino uno degli oggetti non selezionati, o togliendo uno degli oggetti attualmente selezionati.L’intorno utilizzato è I1(x)= { y ∈ F : ∑|x i − y i | ≤ 1}. Tali soluzioni sono al più n, quindi iliprocesso di ricerca locale ha complessità O(n).Si nota fin da subito che questo intorno non permette di migliorare le soluzioni ottenute conl’algoritmo greedy CUD: al termine infatti lo zaino non ha la capacità residua per nessun altrooggetto e la funzione obiettivo non può essere migliorata. Greedy CUD produce un ottimo localeper I1.Per migliorare quella soluzione occorre quindi sviluppare un intorno diverso, basato ad esempio sumosse scambio: si toglie un oggetto dallo zaino e se ne inserisce uno non selezionato. L’algoritmodi ricerca basato su questo nuovo intorno I2ha complessità O ( n2 ) e domina l’intorno I1.Questo non significa che l’intorno I1determinerà necessariamente una soluzione peggiore, masolo che I1ha più minimi locali, quindi l’algoritmo di ricerca ha un rischio maggiore di arrestarsi suuno di essi, mentre un algoritmo basato sull’intorno I2potrebbe proseguire la ricerca.In generale mosse complesse, ottenute concatenando un certo numero di mosse semplici,permettono di vedere le conseguenze delle singole mosse semplici e quindi effettuare mosse chenon sarebbero accettabili da intorni basati direttamente su tale mosse: infatti la mossa di scambioè effettuata concatenando una mossa di rimozione, che peggiora il valore della funzione obiettivo,ed una mossa di inserzione, che può portare ad un miglioramento locale.D’altra parte, realizzare mosse più complesse è più costoso dal punto di vista algoritmico, come siè visto passando dall’intorno I1all’intorno I2.30


3.5.2 Ricerca locale per il ciclo hamiltonianoGli elementi della soluzione sono archi: l’idea per realizzare un algoritmo di ricerca locale per TSP èbasata nuovamente su mosse scambio: si selezionano due archi (i,j) e (h,k) non consecutivi nelciclo e si sostituiscono con gli archi (i,h) e (j,k). Ogni scambio di questo tipo genera una soluzioneammissibile. Come già visto tale approccio ha complessità O ( n2 ) .In genere si utilizzano, anche per altri problemi, intorni dinamici: ad esempio per TSP si possonoeffettuare mosse di k scambi, iniziando con k = 2 ed aumentando se si trovano degli ottimi locali,per poi riprendere con k = 2 appena trovata una soluzione migliore.Le mosse basate su k scambi sono molto efficaci per quanto riguarda il superamento di ottimilocali, ma purtroppo aumentano la complessità dell’algoritmo a O ( nk ) .3.6 MetaeuristicheNota: nel corso di OCR 08/09 la parte riguardante le metaeuristiche non è stata affrontata. Vienequi trattata brevissimamente solo a titolo di completezza.Gli algoritmi utilizzati di ricerca locale sono molto efficienti ma si arrestano tutti su ottimi localirispetto alla funzione intorno utilizzata, perché non sono in grado di migliorare ulteriormente lasoluzione.Esistono dei metodi generali per cercare di determinare un diverso, possibile migliore, ottimolocale.• Metodo Multistart: l’ottimo locale trovato dipende in genere dall’intorno utilizzato e dallasoluzione ammissibile di partenza. Come visto, spesso per gli algoritmi greedy esistono piùmodi di effettuare la scelta dell’elemento localmente ottimo (la procedura BEST): non èirragionevole supporre di avere più di un algoritmo in grado di produrre soluzione iniziali,generalmente diverse. L’algoritmo di ricerca locale viene eseguito sulle soluzioni cosìtrovate, selezionando alla fine la migliore delle soluzioni ottenute. La combinazione di unalgoritmo di ricerca locale e di un’euristica randomizzata prende il nome di metodomultistart. L’idea è semplice ma non particolarmente efficiente: possono essere necessariemolte ripetizioni, in modo tale che risulterebbe più conveniente enumerare tutte lesoluzioni del problema (e spesso, per problemi di piccole dimensioni, può convenire talestrada). Inoltre tale metodo non è in grado di sfruttare l’informazione generata durante lericerche locali precedente per guidare la ricerca locale corrente: infatti per molti problemile soluzioni di buona qualità sono abbastanza “vicine”; aver determinato una buonasoluzione fornisce quindi un informazione della quale il metodo multistart non tiene conto.• Simulated Annealing: brevemente, ricalca lo schema della ricerca locale sostituendo i criterideterministici di selezione del nuovo punto nell’intorno corrente e di accettazione dellamossa con criteri randomizzati.• Ricerca Taboo: il problema fondamentale della ricerca locale consiste nel fatto che se sipermette il peggioramento della funzione obiettivo, bisogna evitare di entrare in un ciclo,31


dato che normalmente x'∈ I(x)⇒ x ∈ I(x') . Infatti, in un problema di minimo, se sipermette di accettare la soluzione x’: cx’ > cx all’iterazione successiva sarà possibilescegliere nuovamente x e ritornarvi. La simulated annealing non ne è immune, mabasandosi su decisioni stocastiche non necessariamente crea dei cicli, o comunque non èdetto che vi rimanga in definitivamente. Tuttavia ciò accade con algoritmi deterministici ebisogna utilizzare tecniche che lo impediscono: ad esempio, mantenere una lista taboo checontiene la descrizione delle mosse di peggioramento della funzione obiettivo per impedirela creazione di cicli.32


4. RilassamentiL’ottimizzazione combinatoria studia i problemi in cui l’insieme ammissibile è definito in termini distrutture combinatoria (ad esempio i grafi). Gli insiemi ammissibili sono discreti e, a differenzadella programmazione lineari, i problemi di ottimizzazione combinatoria sono in genere NP-ardui.E’ quindi importante riuscire a ricondursi a problemi computazionalmente più semplici, adesempio i problemi di flusso visti nel primo capitolo, ed uno strumento per fare ciò sono irilassamenti.4.1 Teoria generaleCiò che differenzia sostanzialmente un problema di programmazione lineare intera da uno diprogrammazione lineare è l’insieme delle soluzioni.Nel caso della programmazione lineare la soluzione ottima viene individuata in un vertice delpoliedro definito dai vincoli del problema: lo spazio delle soluzioni viene esplorato con semplicistrumenti algebrici, che individuano direzioni ammissibili per spostarsi nella ricerca dell’ottimo(metodo del simplesso).Nel caso della programmazione lineare intera i valori ricercati sono discreti e non più continui: nonci sono validi strumenti per guidare la ricerca né per valutare a priori l’ammissibilità di unadirezione di ricerca né l’effettiva ottimalità della soluzione trovata.Da un altro punto di vista, ciò che distingue i due problemi è la convessità dell’insieme dellesoluzioni: convesso nel caso della programmazione lineare, e quindi privo di ambiguità tra minimilocali e minimi globali, e non convesso nel caso della programmazione lineare intera, dove unavolta trovato un minimo locale non si ha modo di stabilire se sia anche il minimo globale, a menodi trovare e valutare anche tutti gli altri minimi locali.Inoltre per i problemi di programmazione lineare è possibile definire un problema dualealtrettanto facile il cui ottimo è il certificato di ottimalità della soluzione primale ammissibile,limitandolo superiormente (teoria degli scarti complementari).Uno dei passi fondamentali alla risoluzione di un problema di ottimizzazione combinatoria è quindila costruzione di valutazioni superiori sul valore ottimo della funzione obiettivo (per problemi dimassimo; valutazioni inferiori per problemi di minimo. In seguito, parleremo con generalità dei soliproblemi di massimo).Ciò permette infatti di certificare l’ottimalità, o almeno stimare la qualità, delle soluzioniammissibili disponibili, ottenute ad esempio con un’euristica, svolgendo la funzione analoga alproblema duale nella programmazione lineare.Se la qualità della soluzione non risulta soddisfacente le valutazioni superiori sono poi uno deglielementi fondamentali per guidare algoritmi in grado di determinare soluzioni ottime, come saràspiegato nel successivo capitolo.Sia P il generico problema di programmazione lineare intera, z( P ) il valore del genericorilassamento e z( P ) il valore della generica euristica. Vale: z( P)≤ z(P)≤ z(P).Come per l’euristica l’efficacia del rilassamento viene valutata misurando il gap relativoz(P)− z(P)G = .z(P)33


Si consideri il generico problema di ottimizzazione combinatoria, espresso come( P)max{ cx : x ∈ X}. Si consideri un secondo generico problema espresso come( P) max{ cx : x ∈ X}e si supponga sia più “facile” da risolvere rispetto a (P): se si crea un qualchetipo di relazione tra i due problemi può essere utile studiare z( P ) ed utilizzare le informazioniderivanti.Se vale:X ⊆ Xcx ≥ cx∀x∈ XAllora segue che z( P ) > z(P). Questo è il generico rilassamento.4.1 Il Rilassamento continuonSi consideri il generico problema di programmazione lineare intera ( P) max{ cx : Ax ≤ b,x ∈ Z } .Eliminando il vincolo di integrità sulle variabili si ottiene il problema di programmazione lineare( P)max{cx : Ax ≤ b}.Questo è il motivo per cui si ha interesse a modellare molti problemi di ottimizzazionecombinatoria secondo la programmazione lineare intera: semplicemente rimuovendone il vincolodi integrità si ottiene un modello di programmazione lineare, che sappiamo essereefficientemente risolubile.Tuttavia non è sempre efficace: in genere i problemi di programmazione lineare intera sono moltopiù espressivi proprio grazie ai vincoli di integrità, mediante i quali è possibile esprimere condizionilogiche.Vincoli del tipo x x ≤ 1, che esprimono una mutua esclusione sull’indice i e j perdonoi+ jcompletamente significato se il rilassamento continuo risolvesse ad esempio ponendo entrambe levariabili a ½ .Analogamente, vincoli del tipo x ≤ Qy esprimono la possibilità di utilizzare ad esempio un arcoijijfino al valore Q se viene utilizzato, e quindi pagato completamente il costo di installazione: ilrilassamento continuo toglie struttura al problema trasformando i costi fissi in costi variabili, chenon è ciò che il modello voleva esprimere.Si osservi in particolare il problema di assegnamento di frequenze:min{∑ y : ∑ x = 1, x + x ≤ 1, y ≥ x ≥ 0,1 ≥ y ≥ 0}ha soluzione ottima (del rilassamento)fffififjf1yfx if mfif= = : il valore della funzione obiettivo è pertanto1 e, essendo un problema di minimo, è una sottostima del valore ottimo del problema di partenza.In pratica il rilassamento continuo dice che è necessario utilizzare almeno 1 frequenza, il che èovvio.Pur essendo sempre efficiente quindi il rilassamento continuo può non essere efficace:distruggendo la struttura fondamentale del modello rischia di generare soluzioni ottime chepossono avere poco o nulla a che fare con le soluzioni del problema originario.f34


Tuttavia è immediato notare che se la soluzione del rilassamento continuo ha componenti intereallora si è risolto all’ottimo il problema di ottimizzazione combinatoria in maniera estremamenteefficiente.Altrimenti, la soluzione ottenuta può essere utilizzata all’interno di tecniche di arrotondamentoper ottenere una buona soluzione ammissibile. Infine, il rilassamento continuo può essereefficacemente utilizzato per le regole di separazione degli algoritmi di enumerazione, comevedremo nel prossimo capitolo.La soluzione duale è un’indicazione dell’importanza relativa dei vari vincoli lineari della soluzione:infatti avere y * i = 0 significa, secondo la teoria degli scarti complementari, che il corrispondentevincolo primale Aix ≤ biè irrilevante ai fini della determinazione della soluzione ottima delrilassamento continuo: può quindi essere utilizzato come euristica sui vincoli del problema più omeno rilevanti per la determinazione della soluzione ottima del problema di programmazionelineare intera.4.3 Il rilassamento per eliminazione di vincoliRilassare il vincolo di integralità può essere rischioso, in quanto distrugge quasi completamente lastruttura del modello rendendo inefficace il rilassamento.Si nota che molti problemi di ottimizzazione combinatoria hanno una struttura che può essereanalizzata per costruire altri tipi di rilassamenti.nSi consideri il generico problema ( P)max{cx : Ax ≤ b,Ex ≤ d,x ∈ Z }.Supponiamo che i vincoli Ax < b siano complicanti, ossia senza di essi (P) diventerebbe facile. Sinconsidera allora il problema ( P′ )max{ cx : Ex ≤ d,x ∈ Z } ottenuto rilassando i vincolicomplicanti.Si nota come il rilassamento continuo è un caso particolare del rilassamento per eliminazione divincoli, in cui i vincoli eliminati sono proprio quelli di integralità. Inoltre, il problema P’ pur essendoconsiderato più facile è sempre un problema di programmazione lineare intera: per questo motivoquesto rilassamento viene anche detto rilassamento combinatorio.Si consideri ad esempio il problema del cammino minimo vincolato:⎧⎪min⎨⎪⎩⎧ −1se i = r⎪∑cijxij: ∑ xji−∑ xij= ⎨ 1 se i = t , ∑ lijxij≤ L,xij∈{0,1}⎪⎩0altrimentiIl vincolo ∑lijxij≤ L risulta complicante, ossia rende il problema NP-arduo. La sua eliminazionelascia invece un problema polinomiale.Chiaramente l’efficacia di questo rilassamento è legato al valore L: per valori grandi il vincolo èinfatti scarsamente rilevante ed è ragionevole attendersi un gap abbastanza contenuto tra lasoluzione ottima e la soluzione del rilassamento; viceversa, per valori abbastanza stringenti è facileimmaginarsi che le soluzioni del rilassamento abbiano poco o nulla a che fare con le soluzionidesiderate.⎫⎪⎬⎪⎭35


In genere per questo tipo di rilassamento occorre studiare attentamente la struttura del problemaper individuare rilassamenti ad hoc: non esiste quindi un metodo valido per qualsiasi problema diottimizzazione combinatoria.Ad esempio rilassando i vincoli di conservazione del flusso si ottiene un particolare problema dizaino, con costi positivi, da minimizzare. La soluzione ottima sarebbe quindi quella con tutte levariabili a 0!4.4 Il rilassamento lagrangianoEsistono altri modi per ottenere limitazioni superiori all’ottimo di un problema di programmazionelineare intera, facendo ricorso a tecniche più raffinate di rilassamento.Un vincolo rappresenta esattamente un divieto: il rilassamento combinatorio rimuove dei vincolisenza tener traccia delle violazioni. E’ possibile invece esprimere un vincolo in funzione obiettivo,associando un costo da pagare nel caso in cui venga violato. La funzione obiettivo cercherà quindidi minimizzare il costo da pagare, ossia di favorire soluzioni che violino il meno possibile il vincolorilassato.nSi consideri il generico problema ( P) max{ cx : Ax ≤ b,Ex ≤ d,x ∈ Z }, dove i vincoli Ax < brisultano essere complicanti. Si rilassano tali vincoli portandoli nella funzione obiettivo ottenendoil problema( Py)max{ cx + y(b − Ax) : Ex ≤ d,x ∈ Zche è detto rilassamento lagrangiano.Se il vincolo rilassato viene rispettato y rappresenta un premio, un valore aggiunto alla funzioneobiettivo; altrimenti rappresenta una penalità, un valore tolto dalla funzione obiettivo in base aquanto il vincolo viene violato.Il problema può essere riscritto comen( P )max{( c − yA)x : Ex ≤ d,x ∈ Z }y+in quanto, una volta fissato y, yb non dipende dalle variabili e può quindi essere portato fuori dalproblema. I nuovi costi (c-yA) sono detti costi lagrangiani, mentre le y sono i moltiplicatorilagrangiani.( P y) rappresenta non un unico problema ma una famiglia di problemi, ognuno per un valoredifferente di y e quindi infinita. Ciascuno di questi problemi fornisce una valutazionepotenzialmente diversa sul valore ottimo del problema: ha senso quindi cercare la migliore diqueste valutazioni superiori, ossia( )min{ z(P ) : y ≥ 0}Dyche è detto duale lagrangiano. Vale z( Py ) ≥ z(D)≥ z(P).n}yb36


(D) può individuare anche una soluzione ottima per (P) ma non è sufficiente in questo caso che lasoluzione sia ammissibile: è necessario che valga anche y(b-Ax) = 0, che ricorda le condizioni degliscarti complementare per la coppia primale-duale di problemi di programmazione lineare.Vale infatti il seguente teorema:Sia x’ una soluzione ottima di ( P y) . Se x’ è ammissibile per (P) e vale y’(b-Ax’) = 0 allora x’ èottima per (P) e y’ è ottima per (D).Infatti, sia x’ una soluzione ammissibile. Vale alloracx' ≤ z(P)≤ z(D)≤ z(P ) = c'x'= cx'+ y'(b − Ax')Se y’(b-Ax’) = 0 allora vale cx’ < z(P) < cx’, ossia x’ è una soluzione ottima per (P).Dato che questa proprietà ricorda il teorema degli scarti complementari non è un caso che (D) siachiamato duale lagrangiano. Inoltre nel caso della programmazione lineare la dualità lagrangianacorrisponde con quella lineare. Infatti:( P) max{ cx : Ax ≤ b,Ex ≤ d}( Py)max{ cx + y(b − Ax) : Ex ≤ d}( D)min{z(Py ) : y ≥ 0} = min{ yb + max{( c − yA)x : Ex ≤ d},y ≥ 0} =min{ yb + min{ wd : c − yA = wE,w ≥ 0}, y ≥ 0} = min{ yb + we : yA + wE = c,y ≥ 0, w ≥ 0}Facendo il duale a questo punto otteniamo nuovamente (P).Nel caso della programmazione lineare intera vale una generalizzazione del precedente risultato.Si nota come per y = 0 si ottiene proprio il rilassamento combinatorio, che è infatti un casoparticolare del rilassamento lagrangiano.Per i successivi risultati conviene esprimere il problema come ( P)max{cx : Ax ≤ b,x ∈ X}dovenX = { x ∈ Z : Ex ≤ d}. Massimizzare una funzione lineare sull’insieme discreto X equivale a farlosul suo inviluppo convesso, ossia z( Py ) = max{ cx + y(b − Ax) : x ∈CONV( X )}. Se E e d hannocomponenti razionali, allora CONV(X) è un poliedro convesso, quindi individuato da un insieme~ ~finito di vincoli lineari CONV ( X ) = { x : Ex ≤ d}.Si definisce allora il rilassamento convessificato ( P~ ) = max{ cx : Ax ≤ b,x ∈CONV( X )} e vale~z ( D)= z(P).Infatti:z( D)= min{ z(Py), y ≥ 0} = min{max{ cx + y(b − Ax) : x ∈CONV( X )}, y ≥ 0}=~~ ~min{ yb + max{( c − yA)x : Ex ≤ d~ }, y ≥ 0} = min{ yb + wd : yA + wE = c,y ≥ 0, w ≥ 0}=~max{ cx : Ax ≤ b,Ex ≤ d~ } = max{ cx : Ax ≤ b,x ∈CONV( X )} = z(P~ )Vale inoltre z( D)≤ z(P).Se i vincoli Ex < d hanno la proprietà di integralità (ossia definiscono un poliedro avente i verticiinteri) allora z ( D)= z(P): infatti, se hanno la proprietà di integralità significa che~ ~Ex ≤ d ≡ Ex ≤ d quindi ( P~ ) = max{ cx : Ax ≤ b , Ex ≤ d } che è proprio il rilassamento continuo.yy37


Si consideri il duale lagrangiano rispetto al secondo blocco di vincoli, ossia( D ') = min{max{ cx + w(d − Ex) : x ∈CONV( X )}, y ≥ 0}Se anche i vincoli Ax < b hanno la proprietà di integralità vale z ( D')= z(P)= Z(D), altrimenti sesolo i vincoli Ex < d hanno la proprietà di integralità vale z ( D')≤ z(P)= Z(D). Per ottenere unavalutazione migliore è quindi necessario che il sottoproblema lagrangiano sia “difficile”, ossia che ivincoli rimanenti non forniscano una descrizione esatta di CONV(X).E’ possibile poi scrivere il problema iniziale nel seguente modo:( P)= max{2Il duale lagrangiano rispetto ai vincoli x’ = x’’ è( x'+ x'') : Ax'≤ b,Ex''≤ d,x'= x'',x'x''∈c Z n(2ccDc)= min{max{(2− w)x':x'∈CONV( X ')} + max{( + w)x'':x''∈CONV( X '')}}nche prende il nome di decomposizione lagrangiana. Chiaramente X ' = { x ∈ Z : Ax ≤ b}enX ''= { x ∈ Z : Ex ≤ d}.Vale quindi z( Dc)= max{ cx : x ∈CONV( X ') ∩ CONV ( X '')}, ossia Z(Dc) < min{Z(D), Z(D’)}.Se uno dei due insiemi di vincoli possiede la proprietà di integrità Z(Dc) coincide con la valutazionefornita dal migliore dei due rilassamenti, mentre può essere strettamente migliore di entrambi senessuno dei due ha la proprietà di integralità. Se invece entrambi i vincoli hanno la proprietà diintegralità il valore fornito dalla decomposizione lagrangiana coincide con quello fornito dalrilassamento continuo.}ESEMPIO rilassamenti applicati ad un semplice problema3 12Si consideri il problema ( P)max{3x1 + x2: x1+ x2≤2, x1≤2, x1x2∈ N }: discutere levalutazioni ottenute dal rilassamento continuo, dai rilassamenti lagrangiani relativi ai due vincoli edalla decomposizione lagrangiana.Rilassamento continuoIl rilassamento continuo è il problema1P ) max{3x+ x : x + x ≤3 , x }.(1 2 1 2 2 1≤2Rappresentando graficamente i vincoli si ottienela seguente regione ammissibile:La soluzione restituita dal rilassamento continuo15è x = ( 2,1)ed il valore ottimo è z ( P)=2.38


Rilassamento lagrangiano rispetto al primo vincolo1Si considera il problema P')max{3x+ x : x ≤ , x ∈CONV( ')}dato che, come(1 2 1 2Xprecedentemente visto, il duale lagrangiano corrisponde al rilassamento convessificato.Rappresentando graficamente i vincoli si ottiene la seguente regione ammissibile:Il rilassamento convessificato individua il triangolo divertici (0,0) (0,1) (1,0). Il rimanente vincolo individuala regione ammissibile rappresentata in figura il cui1valore ottimo è dato da x ' = (12,2). La funzioneobiettivo vale z(D) = 2.Rilassamento lagrangiano rispetto al secondo vincolo3Si considera il problema ( P'') max{3x1+ x2: x1+ x2≤2, x ∈CONV( X '')}.L’inviluppo convesso restituisce il segmento 0, x ) , che intersecato con il rimanente vincolo dà la33soluzione x ' = (0, ) di valore z ( D)=2.'2(2Decomposizione lagrangianaSi considera infine il problema ( Dc)max{3x1 + x2: x ∈CONV( X ') ∩ CONV ( X '')}.L’intersezione dei due inviluppi convessi individua il segmento di estremi (0,0) (0,1), la cuisoluzione ottima è xDc= (0,1)a cui corrisponde il valore di funzione obiettivo z(Dc) = 1, che èanche il valore ottimo di (P).39


4.5 Aspetti algoritmici del rilassamento lagrangianoCome noto i vincoli di un problema di programmazione lineare (intera o meno) definiscono ilpoliedro F delle soluzioni ammissibili. La soluzione ottima è poi caratterizzata da un numero finitodi vincoli: nel caso della programmazione lineare essa si trova su un vertice del poliedro, quindi ècaratterizzata da m-1 vincoli; nel caso della programmazione lineare intera può trovarsi all’internodel poliedro e possono servire molti più vincoli, ma comunque può essere caratterizzata solo da unsottoinsieme di vincoli.Un possibile approccio per risolvere un problema di ottimizzazione combinatoria è quindi creareun generatore di vincoli per individuare quelli che caratterizzano la soluzione ottima. Sia F’ ilpoliedro minimale, ossia per cui la rimozione di una disequazione definisce un poliedro checontiene strettamente F’, che rappresenta il generico problema di programmazione lineare: perindividuare tale poliedro è sufficiente risolvere il problema di separazione, ossia chiedersi se esisteuna disuguaglianza valida che non è soddisfatta dalla soluzione considerata.(0) (0)Genericamente sia A x ≤ b un’approssimazione di F’, ad esempio data dal rilassamento(0)continuo. Se x ∈ F'allora si è trovato l’ottimo del problema, altrimenti esisterà un vincolo(0)dx ≤ δ violato da x .(1) (1)Si considera quindi una nuova approssimazione di F’ data da A x ≤ b doveA(1)=⎡A⎢⎣ d(0)⎤⎥⎦(0)( 1)⎡b⎤, b = ⎢ ⎥⎣ δ ⎦(1) (0)Questo nuovo sistema fornirà una soluzione x ≠ x ed il processo viene ripetuto fino atrovare una soluzione che non viola nessun vincolo.Il generico problema lagrangiano può essere visto come una funzione lagrangiana:ϕ ( y)= z(Py ) = max{ cx + y(b − Ax) : x ∈ X}e (D) può essere equivalentemente formulato come min{ z : z ≥ z(Py ), y ≥ 0}.Si definisce quindi il problema master dualedove( )min{ z : z ≥ cx + y(b − Ax),x ∈ B,y ≥ 0}D BB ⊂ X è un (piccolo) sottoinsieme di soluzioni ammissibili per P ) .Il problema master duale fornisce un modello della funzione lagrangiana, ossia ϕ ( y)≤ ϕ(y). Lasoluzione ottima ( z * , y * ) verrà poi utilizzata per risolvere il problema di separazione P ) : sevale z* ≤ ϕ( y * ) allora le soluzioni ottime x di P ) forniscono un vincolo di (D) violato da( z * , y * ) .Questo è l’algoritmo dei piani di taglio.( *y( yB( *y40


Visto in dettaglio:begindo* *( z , y ) = ( DB ) = min{ z : z ≥ cx + y(b − Ax) : x ∈ B,y ≥ 0} ;*x = ( P ) = max{( c − y A)x : x ∈ };* Xy**ϕ ( y ) = cx + y ( b − Ax);B = B ∪{x};while ( z* < ϕ( y * ) )endESEMPIO applicare l’algoritmo dei piani di taglio al problema propostomax{2xLa base di partenza è B = {(0,0)}.Iterazione 1Con tale base il problema master duale è+ 3x: 2x+ x ≤ 1, x x1 2 1 2 1 2 ∈{0,1}⎡0⎤⎡0⎤( D B ) = min{ z : z ≥ ⎢≥0⎥⎢0⎥ y⎣ ⎦⎣ ⎦* *a cui soluzione è ( z , y ) = (0,0).A questo punto si risolve il problema di separazione[ 2 3] + y(1− [ 2 1] ) = y,0}22[ 2 3] − 0[ 2 1 ])x,x x ∈{0,1}} = max{2 x + 3x: x {0,1} }( P ) = max{(x0 1 21 2 1 2 ∈La cui soluzione è ( x ) = (1,1 ).La funzione lagrangiana vale:⎡1⎤⎡1⎤ϕ ( 0) = ⎢=1⎥⎢1⎥⎣ ⎦⎣ ⎦[ 2 3] + 0(1 − [ 2 1] ) 5Essendoci un gap tra la funzione lagrangiana e la soluzione ottima del master duale, la soluzioneottima del problema di separazione (1,1) entra in base e viene eseguita una nuova iterazione.2}41


Iterazione 2Adesso il problema master duale èz ≥ y( D B ) = min{ z : ⎡1⎤⎡1⎤, y ≥ 0}z ≥ [ 2 3] ⎢ + (1 − [ 2 1]) = 5 − 21⎥ y ⎢1⎥ y⎣ ⎦⎣ ⎦* * 5a cui soluzione è z , y ) = (5 , ) .(3 3A questo punto si risolve il problema di separazione524 42[ 2 3] − [ 2 1 ])x,x x ∈{0,1}} = max{ x + x : x {0,1} }−( P 5 ) = max{(x ∈3La cui soluzione è ( x ) = (0,1).La funzione lagrangiana vale:⎡0⎤ϕ (3)= ⎢ 31⎥⎣ ⎦312⎡0⎤⎢1⎥⎣ ⎦5[ 2 3] + (1 − [ 2 1] ) 35=Essendoci un gap tra la funzione lagrangiana e la soluzione ottima del master duale, la soluzioneottima del problema di separazione (0,1) entra in base e viene eseguita una nuova iterazione.Iterazione 3Adesso il problema master duale è* * 5a cui soluzione è z , y ) = (3, ) .z ≥ y( D B ) = min{ z :z ≥ 5 − 2y, y ≥ 0}⎡0⎤⎡0⎤z ≥ [ 2 3] ⎢ + (1 − [ 2 1]) = 31⎥ y ⎢1⎥⎣ ⎦⎣ ⎦(3Il problema di separazione ( P ) è già stato risolto (( x ) = (0,1)) e la funzione lagrangiana è già5stata valutata ( ϕ ( 3) = 3 ).53Non essendoci più gap tra la funzione lagrangiana e la soluzione ottima del master duale lasoluzione ottima del problema di separazione rispetta tutti i vincoli ed è la soluzione ottima delproblema.31321242


5. Algoritmi enumerativiNel capitolo 3 si è introdotto il concetto di euristica per ottenere delle buone soluzioni ammissibiliin modo efficiente: in un problema di massimo, ciò equivale ad ottenere una soluzione chesottostima il valore della soluzione ottima.Nel capitolo 4 si è introdotta la teoria dei rilassamenti per ottenere della valutazioni su problemiinerenti più semplici da calcolare: in un problema di massimo, ciò equivale ad ottenere dellevalutazioni superiori al valore della soluzione ottima. Da notare che a differenza delle euristiche ilrilassamento non deve necessariamente calcolare una soluzione, in quanto basta comevalutazione superiore il valore della funzione obiettivo del problema rilassato.In generale inoltre né gli algoritmi greedy né quelli di ricerca locale sono in grado di garantirel’ottimalità della soluzione trovata.Gli algoritmi di enumerazione esplorano sistematicamente lo spazio delle soluzioni alla ricerca diuna soluzione ottima: le valutazioni inferiori e superiori vengono sfruttate per ottenereinformazioni che permettano di escludere dalla ricerca aree dello spazio delle soluzioni in cuidimostrabilmente non si trova la soluzione ottima. Le modalità della ricerca fanno sì che al terminedell’algoritmo si abbia la garanzia dell’ottimalità della soluzione trovata, o che comunque si possatrovare una soluzione accurata a piacere.Con euristiche e rilassamenti efficaci ed efficienti gli algoritmi di enumerazione riescono spesso arisolvere in tempi accettabili istanze di dimensioni rilevanti di problemi NP-ardui; tuttavia puressendo efficienti nella maggior parte delle istanze hanno complessità esponenziale in quanto nonsi può escludere a priori l’eventualità di dover esaminare l’intero spazio delle soluzioni. In questocapitolo vedremo unicamente l’algoritmo Branch’n’Bound.5.1 Algoritmo Branch’n’BoundL’algoritmo Branch’n’Bound adotta lo schema divide et impera per risolvere il problema: suddivideinfatti il problema in sottoproblemi “più piccoli” e risolve separatamente ciascuno di essi,eventualmente suddividendoli a loro volta in altri sottoproblemi (eventualmente fino araggiungere un caso base). Infine combina le soluzioni ottenute nella soluzione per il problemaoriginale.Risolvere il generico problema di ottimizzazione combinatoria ( P)max{cx : x ∈ X}significaottenere z ( P)= z(P). Come appena fatto notare, alla valutazione inferiore (euristica) è spessoassociata una soluzione ammissibile x : cx = z(P), mentre della valutazione superiore basta ilvalore della funzione obiettivo del rilassamento.L’insieme delle soluzioni ammissibili X viene suddiviso in X 1, X 2,...X k dove ovviamente X i ⊂ Xe U X i = X . Si considera il sottoproblema ( Pi) max{ cx : x ∈ X i}. Le informazioni ricavate dallairisoluzione dei sottoproblemi guidano la ricerca del valore ottimo, in quanto vale:max{ z(Pi ) : i = 1... k}≤ z(P)≤ max{ z(Pi) : i = 1... k}43


Come precedentemente affermato la suddivisione dello spazio delle soluzioni ammissibili puòeventualmente arrivare a considerare dei casi base: vale X i = { x}⇒ z(Pi) = z(Pi) = cxeX i = {} ⇒ z(Pi) = z(Pi) = +∞ .L’algoritmo Branch’n’Bound costruisce e visita un albero delle decisioni, ossia unarappresentazione dello spazio delle soluzioni: come precedentemente visto a proposito delladefinizione degli intorni, una rappresentazione della soluzione come vettore binario èestremamente utile ed efficace.La radice dell’albero delle decisioni rappresenta il problema (P) originale (il suo intero insiemeammissibile è X), mentre il generico nodo rappresenta il problema ( P i ) definito su X i .Le valutazioni inferiori e superio guidano la visita dell’albero delle decisioni secondo il seguenteschema algoritmo (algoritmo Branch’n’Bound):beginQ={(P)}; z = -∞;repeat(P’) = NEXT(Q); Q = Q\{(P’)};z = RILASSAMENTO(P’);if ( z > z)thenz = EURISTICA(P’);if ( z > z)then z = z ;if ( z > z)then Q=Q U BRANCH(P’);until Q = { };endz rappresenta la miglior valutazione inferiore disponibile: se al termine dell’algoritmo vale ancoraz = -∞ allora X = {}, altrimenti vale z = z(P).Se vale ( z < z)allora nessuna soluzione in quel sottoinsieme dello spazio delle soluzioni ha uncosto migliore della soluzione x corrispondente a z (detta soluzione candidata); si può alloraevitare di esplorare quello spazio delle soluzioni ed il nodo P’ viene potato dalla valutazionesuperiore. Un caso particolare si ha quando lo spazio delle soluzioni ammissibili di P’ è vuoto: in talcaso si dice che il nodo viene potato per inammissibilità. Si nota che i nodi potati, ossia quelli dovela visita viene interrotta, non necessariamente sono foglie dell’albero delle decisioni: non sarebbeinfatti efficiente spingersi fino alle foglie. Una potatura deve essere più precoce possibile perriuscire ad esplorare efficacemente lo spazio delle soluzioni, evitando di generare completamentel’albero. Se il nodo non viene potato si procede risolvendo un’euristica. Se si ottiene una migliorevalutazione inferiore questa viene salvata in z e viene aggiornata la soluzione candidata. Se non c’ègap tra la valutazione inferiore e superiore significa che il sottoproblema P’ è stato risoltoall’ottimo e non è quindi necessario continuare ad esplorare ulteriormente il suo spazio dellesoluzioni ammissibili: si pota il nodo P’ per ottimalità (nelle reali implementazioni dell’algoritmo siha una potatura per ottimalità anche quando la soluzione restituita dal rilassamento, sedisponibile, è ammissibile per il problema P’: si pensi ad esempio ad una soluzione a componentiintere restituita dal rilassamento continuo).Se invece c’è un gap il problema P’ non è stato ancora risolto. Si provvede quindi ad applicare ilcriterio divide et impera suddividendo P’ in ulteriori sottoproblemi e generando per ognuno deisottoinsiemi delle soluzioni ammissibili.44


Al termine di una qualsiasi iterazione dell’algoritmo Branch’n’Bound, sia Q’ l’insieme deipredecessori (nell’albero delle decisioni) dei nodi ancora in Q e sia Q’’ l’insieme dei nodi potati:allora valez( P)≤ max{ z(P') : P'∈Q'∪Q''}Da questo lemma deriva il seguente importante lemma, che garantisce la correttezzadell’algoritmo: al termine di una qualsiasi iterazione si haz ≤ z( P)≤ max{ z,max{z(P') : P'∈Q'}}Quando l’algoritmo termina la coda Q è vuota e Q = {} ⇒ Q'= {}, quindi z è la soluzione ottimain quanto si ha z ≤ z( P)≤ z .L’algoritmo può essere modificato in un’euristica con garanzia sulle prestazioni desideratasemplicemente modificando il controllo ( z > z)in ( z + ε > z).Come già visto per le euristiche ed i rilassamenti, quello proposto dell’algoritmo è soltanto unoschema generale: tale schema dovrà essere adottato ad hoc per ogni problema affrontato. Nellesuccessive sezioni saranno commentati i punti più importanti dell’algoritmo.5.1.1 Rilassamenti ed euristicheI Rilassamenti e le euristiche sono stati affrontati nei capitoli precedenti. Qui si riportano soloalcuni concetti generali legati al loro utilizzo all’interno dell’algoritmo Branch’n’Bound. L’efficienzadell’algoritmo è ovviamente legata all’efficienza e l’efficacia delle valutazioni superiori ed inferiori.Come è noto, le due caratteristiche sono tra loro in contrasto: aumentare l’efficacia spesso va ascapito dell’efficienza.Dal punto di vista dell’efficienza generale è di notevole importanza l’efficacia del rilassamento:infatti, seppur con un costo maggiore, un rilassamento efficace mantiene basso il numero di nodidell’albero delle decisioni effettivamente visitati. Si fa notare che è possibile realizzare algoritmiche non fanno uso di euristiche o rilassamenti, semplicemente modificando dove necessario icondizionali dello schema generale.Infine si osserva che il rilassamento e l’euristica vengono eseguiti per la maggior parte dei nodidell’albero delle decisioni: è quindi importante scegliere tecniche di valutazione che possanocollaborare tra loro. Tra le euristiche ed i rilassamenti che abbiamo visto in questo corso adesempio abbiamo:• Euristica CUD e rilassamento continuo per lo zaino binario• Rilassamento M1ST ed euristica Twice Around MST per il commesso viaggiatoreoltre ad altri esempi non visti, come le tecniche di arrotondamento ed i rilassamenti continui, el’euristica lagrangiana e il rilassamento lagrangiano.Quindi la scelta dell’euristica e del rilassamento impatta notevolmente sull’efficienza complessivadell’algoritmo di enumerazione: è consigliabile quindi scegliere accuratamente euristiche erilassamenti efficaci ed efficienti capaci di collaborare tra loro.45


5.1.2 Strategia di visita NEXT(Q)Come già visto a proposito delle euristiche la strategia di visita (dell’albero delle decisioni) è moltoimportante. Si fa distinzione tra visite topologiche e visite basate sull’informazione.Le visite topologiche scelgono il prossimo nodo da visitare unicamente in base alla posizione diquesto all’interno dell’albero delle decisioni: le strategie più note sono la breadth-first (ottenutaimplementando Q come una coda) e la depth-first (ottenuta implementando Q come una pila). Nelcaso in cui non si disponga di un’euristica efficace la visita in profondità è preferibile, dato checonsente di arrivare il più velocemente possibile ad una foglia e quindi di ottenere velocementesoluzioni ammissibili per iniziare a potare l’albero. Inoltre, è molto semplice da implementare econsente di limitare il numero di nodi attivi mantenuti in memoria.Le visite basate sull’informazione visitano i nodi in base ad informazioni ad essi associate (Q vieneimplementata come una coda con priorità). La strategia più nota è la best-first, che consiste nelselezionare il nodo con la miglior valutazione superiore (rilassamento). In genera una visita diquesto tipo è più complessa da realizzare, in quanto innanzitutto lo schema dell’algoritmo deveessere modificato (infatti vengono prima calcolati i rilassamenti per tutti i nodi presenti in Q escelto quello più promettente), e secondariamente perché è possibile visitare nodidistanti” traloro e quindi potenzialmente con poche informazioni in comune (mentre per le visite topologicheè possibile ottimizzare memoria mantenendo una sorta di informazione differenziale sui problemianalizzati). In generale, nelle implementazioni reali vengono utilizzate tecniche miste.5.1.3 Regole di BranchingUlteriori richieste sulla suddivisione dello spazio delle soluzioni ammissibile possono essere leseguenti:• Partizionamento, ossia Xi∩ Xj= {}∀i,j• Equidivisione, ossia garantire che la cardinalità dei sottoinsiemi siaapprossimativamente uguale• Fare in modo che la soluzione ottima del rilassamento per X’ non sia ammissibileper i rilassamenti utilizzati dai sottoinsiemi ottenuti partizionando X’Queste proprietà non sono strettamente necessarie ma garantiscono una migliore efficienzadell’algoritmo, in quanto garantiscono una rapida decrescita della valutazione superiore edevitano che una stessa soluzione possa essere visitata più volte, con ovvio spreco di risorse.Equisuddividere lo spazio delle soluzioni ammissibili permette poi di considerare tutti i problemiallo stesso livello dell’albero ugualmente difficili (e più facili di quelli del livello superiore).In genere le regole di branching sono definite dalla struttura stessa del problema e delrilassamento (o euristica) utilizzati. Ad esempio, per il caso dello zaino binario il rilassamentocontinuo produce una soluzione con una unica variabile non intera: x h . Il branching viene quindieffettuato suddividendo lo spazio delle soluzioni in una parte che considera non preso l’elementodi indice h ed uno che invece lo tiene nello zaino.Analogamente, per il problema del commesso viaggiatore l’euristica individua un M1ST, ossia unalbero di copertura di costo minimo rafforzato con un arco: poiché un ciclo hamiltoniano ha perogni nodo esattamente due archi incidenti, nell’M1ST ci sarà un nodo con tre archi incidenti: Sutali archi sarà effettuato il branching, suddividendo lo spazio delle soluzioni ammissibili in tre parti,ciascuna riguardante il grafo modificato dove manca uno degli archi in questione.46


ESEMPIO algoritmo Branch’n’Bound per il problema dello zaino binariomax 6x3x+ xx , x11212, x3+ 4x+ 6x, x423, x+ 8x+ 3x5, x634+ 3x+ 3x45∈{0,1}+ 2x5+ 10x+ 9xL’ordine CUD è il seguente: [ 2 1 3 4 5]. L’oggetto di indice 6 viene escluso in fase di preprocessingin quanto il suo peso eccede l’intera capacità dello zaino, pertanto varrà sempre x 6 = 0.L’algoritmi inizia ponendo il problema intero in Q e mettendo z = -∞.Iterazione 1: (P)*La soluzione del rilassamento continuo è x = [1,1,5/6,0,0,0] di valore z = 16 + 2/3.L’euristica CUD ottiene la soluzione ammissibile x = [1,1,0,1,0,0] di valore z = 13. Poiché 13 èmigliore dell’attuale valutazione inferiore (-∞) viene posto z = 13 e x diventa la soluzionecandidata. Poiché inoltre c’è un gap tra la valutazione superiore e quella inferiore di P vieneeffettuato il branching sulla variabile frazionaria.Q = {( x3 = 1),( x3= 0)} .Iterazione 2: ( x 3 = 1)*La soluzione del rilassamento continuo è x = [2/3,1,1,0,0,0] di valore z = 16.L’euristica CUD ottiene la soluzione ammissibile x = [0,1,1,0,0,0] di valore z = 12.Poiché c’è un gap tra la valutazione superiore e quella inferiore viene effettuato il branching sullavariabile frazionaria.Q = {( x3 = 0),( x3= 1, x1= 1),( x3= 1, x1= 0)} .Iterazione 3: ( x 3 = 0)*La soluzione del rilassamento continuo è x = [1,1,0,1,2/3,0] di valore z = 14+1/3.L’euristica CUD ottiene la soluzione ammissibile x = [1,1,0,1,0,0] di valore z = 13.Poiché c’è un gap tra la valutazione superiore e quella inferiore viene effettuato il branching sullavariabile frazionaria.Q = {( x3 = 1, x1= 1),( x3= 1, x1= 0),( x3= 0, x5= 1),( x3= 0, x5= 0)} .Iterazione 4: x = 1, x 1)( 3 1 =*La soluzione del rilassamento continuo è x = [1,0,1,0,0,0] di valore z = 14. Poiché la soluzione delrilassamento continuo è a componenti intere il nodo viene potato per ottimalità. Questa divental’attuale soluzione candidata e vale z = 14.Q = {( x3 = 1, x1= 0),( x3= 0, x5= 1),( x3= 0, x5= 0)} .6≤ 96Iterazione 5: x = 1, x 0)( 3 1 =La soluzione del rilassamento continuo èquindi potato dalla valutazione superiore.Q = {( x3 = 0, x5= 1),( x3= 0, x5= 0)} .*x = [0,1,1,2/3,0,0] di valore z = 14 = z. Il nodo viene47


Iterazione 6: x = 0, x 1)( 3 5 =La soluzione del rilassamento continuo èquindi potato dalla valutazione superiore.Q = {( x3 = 0, x5= 0)} .*x = [1,1,0,2/3,1,0] di valore z = 14 = z. Il nodo vieneIterazione 7: x = 0, x 0)( 3 5 =*La soluzione del rilassamento continuo è x = [1,1,0,1,0] di valore z = 13. Il nodo viene quindipotato dalla valutazione superiore. Si osserva che la soluzione ha componenti intere, per cuipotrebbe anche essere potato per ottimalità. Tuttavia la soluzione è peggiore di quella candidataattuale.Q = {}.L’algoritmo Branch’n’Bound termina (in quanto Q è vuota) determinando la soluzione ottima[1,0,1,0,0,0] di valore 14.48

More magazines by this user
Similar magazines