Contenuto e scopo presentazione Contenuto: • Vengono presentati alcuni algoritmi euristici ed approssimati per la risoluzione di problemi NP-hard. Euristiche ed Approssimazioni Scopo: • fornire le capacità di – risolvere problemi reali difficili di dimensione troppo grande per essere affrontati con algoritmi esatti Versione 06/01/2006 22.21 Raffaele Pesenti Raffaele Pesenti Errori Soluzioni approssimate e algoritmi euristici Quando è possibile (non sempre lo è) è opportuno dare una stima per eccesso dell’errore compiuto accettando la soluzione di un algoritmo euristico rispetto a quella ottima Trovare la soluzione ottima di problemi di ottimizzazione NP-hard può risultare in pratica troppo oneroso, inoltre dato che i parametri del modello considerato possono essere affetti da errori tale sforzo potrebbe essere anche poco rilevante. Nei casi pratici possono essere anche accettate delle soluzioni “buone” che, sperabilmente, non siano lontane dall’ottimo. Errori: dato un problema (F,c; max), detti zopt= {max c(x) : x∈F} il valore della soluzione ottima e zA il valore fornito dall’algoritmo euristico A si definiscono – errore assoluto: EA= zopt - zA – errore relativo: RA= (zopt - zA)/zopt Algoritmo euristico: algoritmo che risolve un problema di ottimizzazione, utilizzando in genere regole di buon senso, e fornisce una soluzione ammissibile ma non necessariamente ottima. Raffaele Pesenti 2 3 Raffaele Pesenti 4 Algoritmi approssimati Algoritmi approssimati Algoritmo ε-approssimato: algoritmo che garantisce un errore relativo non maggiore di ε > 0: Ra ≤ ε Schema di approssimazione: algoritmo che garantisce Ra ≤ ε per qualunque ε > 0 – schema di approssimazione polinomiale: schema di approssimazione con complessità polinomiale nelle dimensioni dell’istanza – schema di approssimazione pienamente polinomiale: schema di approssimazione con complessità polinomiale nelle dimensioni dell’istanza e in 1/ε Raffaele Pesenti 5 Commenti: • Quando esistono conviene applicare algoritmi approssimati, per i quali è calcolabile, per definizione, un limite massimo dell’errore compiuto, rispetto a degli algoritmi euristici basati sul buonsenso, ma per cui non si può fornire un limite massimo dell’errore. • Per alcuni problemi non sono noti algoritmi approssimati, per altri il migliore algoritmo approssimato ha valori di ε grandi (maggiori di 0.5). Inoltre algoritmi euristici con accettabili prestazioni medie vengono a volte preferiti ad algoritmi approssimati (almeno in prima battuta) perché sono più facili da implementare e generalmente più veloci. Raffaele Pesenti Metaeuristiche Tipi di euristiche Affinché una euristica sia efficace deve sfruttare le caratteristiche strutturali del problema che deve risolvere, per questo motivo non esiste una euristica generale. Esistono però degli approcci generali a cui si può fare riferimento per sviluppare euristiche specifiche. Tali approcci vengono detti metaeuristiche. Euristiche costruttive costruiscono una soluzione del problema Euristiche di miglioramento iterativamente a partire da una soluzione del problema cercano di determinarne una migliore nell’intorno di quella data Esempi: metaeuristica costruttive: – greedy – di disaggregazione – lagrangiane metaeuristica migliorativa: – ricerca locale • simulated annealing • tabu search Commenti: in genere le soluzioni fornite dalle euristiche costruttive e quelle utilizzate dalle euristiche di miglioramento sono soluzioni ammissibili. Per certi problemi risulta anche estremamente complesso determinare una prima soluzione ammissibile, allora può convenire rilassare lagrangianamente alcuni vincoli, i.e., determinare una prima soluzione che soddisfi almeno parte dei vincoli e penalizzare il fatto che altri vincoli non siano rispettati. Quindi iterativamente a partire dalla soluzione (non ammissibile ottenuta) cercano di determinarne una che rispetti maggiormente i vincoli nell’intorno di quella data Raffaele Pesenti 6 7 Raffaele Pesenti 8 Metaeuristica greedy Euristiche greedy Metaeuristica greedy 1. inizializzazione: Si ordinano gli elementi e1, e2,..., em che concorrono a comporre una soluzione in modo non decrescente(c1≤c2≤... ≤cm) rispetto ai loro costi (oppure in modo non crescente rispetto ai profitti o comunque in modo monotono rispetto ad una funzione euristica di valutazione). Si pone F0=∅, //insieme degli elementi che compongono la soluzione 2. iterazione: while non si è costruita completamente una soluzione { si sceglie ek, Esempi: • problema dello zaino KP(U,s,c,B, max): si ordinano gli oggetti per densità decrescente c(u)/s(u) e a partire dal primo si prova ad inserire gli oggetti nello zaino lasciando in esso quelli che vi possono essere contenuti, e.g., max zRL= 12x1 +36 x2 +42 x3 +16 x4 + 25x5 3x1 + 10x2+ 14x3 + 6x4 + 10 x5 ≤ 23 xi ∈{0,1} (oggetti già ordinati) soluzione greedy x= [1,1,0,1,0] if Fk-1∪{ek} non viola i vincoli dati Fk=Fk-1∪{ek}, else Fk=Fk-1 } return //Fk è l’insieme degli elementi che costituiscono la soluzione Raffaele Pesenti 9 Raffaele Pesenti 10 Euristiche greedy Euristiche greedy Esempi (cont.): • problema del commesso viaggiatore TSP(G(V,E), c,s,min): euristica detta del nodo più prossimo (nearest neighbor), si parte da un nodo di riferimento (tipicamente il magazzino centrale oppure un estremo del arco meno costoso) ed ad ogni passo si raggiunge il nodo più vicino non ancora visitato. Esempio (supponendo distanze euclidee): Esempi (cont.): Problema di scheduling 1/ri/ΣCi(U,p,r, min): si eseguono immediatamente le operazioni disponibili, se più operazioni sono disponibili si sceglie secondo shortest processing time first. Esempio con tre operazioni: – J1: ri = 0, pi=10 – J2: r2 = 1, p2=1 – J3: r3 = 4, pi=2 ΣC =10+11+13=34 clienti Commenti: non funziona molto bene: i primi archi sono brevi, gli ultimi molto lunghi magazzino: però gli archi molto lunghi sono pochi: nodo iniziale può essere una buona base da migliorare semplice da implementare soluzioni mediamente del 25% superiori al minimo effettivo troppo lento per più di 10.000 nodi Raffaele Pesenti i J1 0 11 Raffaele Pesenti J2 J3 10 11 13 12 Metaeuristiche di disaggregazione Metaeuristiche di disaggregazione Commenti: Metaeuristica disaggregazione • l’aspetto critico di questo tipo di euristiche è come scomporre il problema originale in sottoproblemi; 1. inizializzazione: • purtroppo non esistono regole precise di disaggregazione, ma si devono comunque scegliere: si decompone il problema originale in sottoproblemi, fissandone una gerarchia – sottoproblemi più abbordabili di quello originale, anche se non troppo semplici (vedi in seguito le considerazioni sulle euristiche lagrangiane) 2. iterazione: si determinala la soluzione del/i problema/i gerarchicamente più importante – sottoproblemi la cui soluzione, una volta imposta ai successivi, non renda inammissibili questi ultimi si risolve un sottoproblema alla volta, a partire dal più importante, senza rimettere in discussione le scelte effettuate per ottenere le soluzioni dei sottoproblemi precedenti; Raffaele Pesenti • queste metaeuristiche sono ad esempio spesso utilizzate per i problemi di scheduling. Si decide nell’ordine sull’assegnazione delle operazioni alle macchine, quindi si sequenziano le macchine ed infine si schedula. 13 Raffaele Pesenti 14 Metaeuristiche basate sul rilassamento lagrangiano Rilassamento lagrangiano Rilassamento lagrangiano: nel rilassamento lagrangiano il problema originale P viene formulato come ILP e quindi semplificato imponendo la soddisfazione di un insieme di vincoli come obiettivo (invece che come vincolo). In particolare si pesano i vincoli, utilizzando pesi non negativi in caso di vincoli di disuguaglianza, come nell’esempio seguente. Esempio: Dato il seguente problema di zaino bidimensionale: max z = 25x1 + 20x2 + 15x3 + 12x4 + 10x5 10x1 + 8x2 + 10x3 + 5x4 + 4x5 ≤ 22 7x1 + 5x2 + 5x3 + 3x4 + 7x5 ≤ 14 xi∈{0,1} e il peso 0.3 per il secondo vincolo, si risolve max zRLag (0.3)= 25x1 + 20x2 + 15x3 + 12x4 + 10x5 + 0.3(14 - (7x1 + 5x2 + 5x3 + 3x4 + 7x5)) 10x1 + 8x2 + 10x3 + 5x4 + 4x5 ≤ 22 xi∈{0,1} Commenti: • se la soluzione ottima x* del rilassamento lagrangiano è ammissibile per il problema P non è detto che x* sia anche ottima per P, poiché le due funzioni obiettivo non coincidono • il valore della soluzione ottima zRLag(π ) del problema lagrangiano dipende dai valori dei pesi π assegnati ai vari vincoli. In ogni caso zRLag(π ) ≥ z* la scelta dei pesi ottima π∗ è quella per cui zRLag(π∗) = min{zRLag(π ), π ≥ 0}. • il problema di determinare i pesi ottimi π∗ è detto problema lagrangiano duale poiché vale il seguente teorema di dualità debole min{zRLag(π ), π ≥ 0} = max {z= cx, Ax ≤ b, x ∈ Zn} • la soluzione zRLag(π ) di un rilassamento lagrangiano è quindi un bound sulla soluzione ottima z* di P e può essere utilizzata per valutare la qualità di eventuali soluzioni di P ottenute attraverso euristiche costruttive. Raffaele Pesenti 15 Raffaele Pesenti 16 Rilassamento lagrangiano Relazioni fra i rilassamenti Altri rilassamenti: • oltre il lagrangiano possono essere usati altri tipi di rilassamento (eliminazione, surrogato, decomposizione), ma il rilassamento lagrangiano è il più usato perché è più facile da trattare matematicamente Relazioni di dominanza tra i rilassamenti: • esistono le seguenti relazioni di dominanza tra le soluzioni dei diversi rilassamenti z* ≤ zRS(πS*), zRD(πD*) ≤ zRLag(πLag*) ≤ zRE, zRL • nessuna relazione generale esiste tra zRS(πS*) e zRD(πD*) e tra zRE e zRL • zRLag(πLag*) = zRL quando il poliedro definito dai vincoli non spostati all’obiettivo è un poliedro intero Raffaele Pesenti Difficoltà: • scelta i vincoli da rilassare • calcolo i pesi ottimi • deduzione di una buona soluzione ammissibile per il problema originale a partire da quella ottenuta tramite il rilassamento lagrangiano. 17 Raffaele Pesenti Rilassamento lagrangiano Rilassamento lagrangiano Scelta i vincoli da rilassare: • i vincoli che vengono rilassati devono rendere il problema più facile dell’originale, ma non troppo facile altrimenti i risultati forniti possono ottenersi più banalmente attraverso il rilassamento continuo. Di solito il rilassamento lagrangiano viene applicato quando il banale arrotondamento dei risultati ottenuti tramite rilassamento continuo fallisce; • di solito ci si riconduce a problemi che, benché NP-hard, siano risolti, almeno in modo approssimato, con relativa velocità, e.g., zaino, oppure ci si riconduce a problemi P-easy per cui esistano algoritmi molto più efficienti del simplesso, e.g., albero ricoprente e varianti; • non esiste comunque una regola generale nella scelta dei vincoli, per lo stesso problema può convenire tentare diverse alternative; • si può usare il rilassamento lagrangiano anche quando il problema ha dimensioni tali che anche il rilassamento continuo richiederebbe comunque un tempo eccessivo di soluzione rispetto a quello di un opportuno problema lagrangiano duale. Raffaele Pesenti 18 19 Calcolo i pesi ottimi: • in generale non è ovvia la scelta ottima dei pesi e viene determinata per iterazioni successive aumentando i pesi dei vincoli che risultano violati dalla soluzione ottenuta col rilassamento corrente e diminuendo i pesi dei vincoli rispettati; • esiste una procedura generale di aggiornamento dei pesi, detta metodo del subgradiente, che permette di convergere ai valori ottimi; • per problemi specifici sono sviluppati metodi da aggiornamento dei pesi ad hoc. Tali metodologie sono però difficilmente generalizzabili. Raffaele Pesenti 20 Rilassamento lagrangiano Rilassamento lagrangiano Metodo del subgradiente (continua): • in pratica si usa spesso Metodo del subgradiente: • ad ogni iterazione k i pesi vengono aggiornati come segue tk= λk(zRLag(πk ) – z*)/|| (b – Axk)||2 πk +1= max{0, πk – tk (b – Axk)} dove il massimo è eseguito componente per componente, Ax ≤b è l’insieme dei vincoli rilassati, xk è la soluzione determinata al passo corrente e tk è un opportuno stepsize; • condizioni sufficienti di convergenza dei pesi all’ottimo sono tk→0 , Σk tk→∞ per con z* è un lower bound (se problema di massimizzazione) della soluzione ottima del problema originale e 0< λk ≤2. Il valore λk è posto inizialmente uguale a 2 e viene progressivamente dimezzato se la soluzione del problema lagrangiano non migliora entro un dato numero di passi. Anche il valore z* può essere aggiornato se nelle iterazioni si determinano delle soluzioni ammissibili per il problema originale; • se si giunge a zRLag(πLag*) = z* si è certi di essere all’ottimo, purtroppo questo non sempre accade; k→∞; • il metodo viene comunque fatto terminare dopo un dato numero di iterazioni. Raffaele Pesenti 21 Raffaele Pesenti Rilassamento lagrangiano Metaeuristica di ricerca locale Deduzione di una buona soluzione ammissibile: dato un problema P, con soluzioni ammissibili F, e la soluzione ottima (o sua approssimazione) xLag del problema duale lagrangiano associato, in generale: • xLag ∉ F e non esiste un criterio universale per determinare una buona soluzione in F a partire da xLag; • nelle ipotesi che F ⊆{0,1}n, che 0 ∈ F e che x ∈F implica ∀y t.c. y ≤ x , y ∈ F, allora a partire da xLag si può dedurre una soluzione in F modificando iterativamente in modo greedy da 1 a 0 i valori di alcune componenti di xLag; • i costi ridotti calcolati nel problema duale lagrangiano possono guidare la tale procedura greedy, in quanto sono una stima dei costi/profitti marginali, i.e., della diminuzione del valore assunto dalla funzione obiettivo quando avviene una variazione unitaria delle corrispondenti componenti della soluzione ottima; • ragionamento complementare si può fare nelle ipotesi opposte, i.e., 1 ∈ F e che x ∈F implica ∀y t.c. y ≥ x , y ∈ F, che per esempio valgono nel caso del set covering problem. Raffaele Pesenti 22 23 Metaeuristica RicercaLocale 1. inizializzazione: si genera una soluzione iniziale ammissibile x0 2. iterazione: do { xk+1 = f(xk) } while xk+1 ≠ xk x* = //dove f(xk) è una funzione che data una soluzione ammissibile //ne genera una nuova ammissibile non peggiore //esce dal loop quando la condizione è falsa xk return(x*) Raffaele Pesenti //x* è un ottimo locale 24 Metaeuristica di ricerca locale Metaeuristica di ricerca locale Commenti: • il simplesso è un algoritmo di ricerca locale, data la linearità dei problemi a cui si applica l’ottimo locale a cui giunge è anche ottimo globale; • in generale si determina solo un ottimo locale, se, come spesso avviene nei problemi combinatori, vi sono molti ottimi locali, applicando semplicemente una ricerca locale è molto probabile che venga determinato un ottimo locale lontano dall’ottimo globale; • la funzione f(xk) deve determinare la soluzione successiva rapidamente, quindi in genere si limita a valutare le soluzioni ammissibili appartenenti all’intorno della soluzione corrente xk; • un intorno di x è una funzione che dato x restituisce un insieme di soluzioni ammissibili I(x) t.c. – x ∈ I(x) i.e., x appartiene al proprio intorno – ∀x, y ∈ S, ∃{x0, ..., xr} t.c. x= x0, y= xr, e xs∈ I(xs-1) s=1,...,r i.e., è possibile andare da x a y passando per punti che appartengono uno all’intorno dell’altro. Raffaele Pesenti 25 Commenti: • f(xk) restituisce la prima soluzione migliore che si riesce a determinare. Infatti non conviene esplorare tutto I(xk) per determinare la migliore soluzione dell’intorno, tale ricerca, dovendo essere iterata più volte, potrebbe essere troppo gravosa e sperimentalmente non risulta nemmeno conveniente in termini della qualità di x* ottenuta. Ovviamente nelle iterazioni finali però l’esplorazione di tutto l’intorno sarà comunque necessario; • la complessità di un algoritmo di ricerca locale si esprime in termini dell’onere computazionale necessario per valutare la funzione f(xk) ad ogni iterazione. Infatti il numero di iterazioni, nel caso peggiore, è comunque esponenziale (vedi, e.g., il simplesso); Raffaele Pesenti Metaeuristica di ricerca locale Commenti: • in generale non conviene particolarmente partire da una soluzione x0 buona prima di applicare un euristica di ricerca locale, è infatti probabile di rimanere rapidamente bloccati in un minimo locale; • conviene iterare più volte l’euristica a partire da soluzioni possibilmente molto diverse e scegliere quindi il migliore degli ottimi locali ottenuti; • è comunque sempre opportuno, dopo avere ottenuto una soluzione ammissibile attraverso un’euristica costruttiva, applicare un’euristica di ricerca locale per verificare se la soluzione ottenuta non può essere banalmente migliorata; • a volte prima di applicare una euristica di ricerca locale conviene rilassare lagrangianamente alcuni vincoli del problema, limitandosi a penalizzare il mancato rispetto di alcune condizioni piuttosto che ad imporre le stesse. In questo modo risulta più semplice determinare una sequenza di soluzioni ammissibili per il problema rilassato mentre si cerca di giungere a una soluzione che soddisfi tutti i vincoli originari scegliendo ad ogni passo le soluzioni che localmente minimizzano la violazione dei vincoli. Questo approccio viene applicato quando, e.g., nel set partioning, già determinare l’esistenza di una soluzione ammissibile è NP-completo. Raffaele Pesenti 27 26 Ricerca locale Esempi: problema del commesso viaggiatore TSP(G(V,E), c,s,min): euristica detta 2– opt. Concetto base: ad ogni passo si eliminano due rami, si ricongiungono i due semicircuiti. Algoritmo 2-opt: si parte da un circuito hamiltoniano, si eseguono tutti gli scambi 2–opt (fra tutte le coppie di rami del circuito) che riducono la lunghezza. Efficacia: 8% più del minimo in media Raffaele Pesenti 28 archi da rimuovere 2-opt Circuito iniziale archi da rimuovere Circuito passo 1 Semicircuiti nuovi archi Circuito passo 1 Circuito passo 2 nuovi archi notare l’inversione del verso di percorrenza di un semicircuito Raffaele Pesenti 29 Raffaele Pesenti archi da rimuovere 30 Ricerca locale Esempi (cont.): problema del commesso viaggiatore TSP(G(V,E), c,s,min): euristica detta 3– opt. Concetto base: ad ogni passo si eliminano tre rami, si ricongiungono i tre semicircuiti.Efficacia: 4% più del minimo in media. Si generalizza a k-opt. archi da rimuovere Circuito passo 2 nuovi archi Circuito iniziale Circuito passo 3 ecc.. Raffaele Pesenti Nuovo circuito 31 Raffaele Pesenti 32 Intorni: definizioni e commenti Ricerca locale Esempi (cont.): Problema di scheduling 1/ri/ΣCi(U,p,r, min): ad ogni passo si scambiano di posto due operazioni (anche non necessariamente adiacenti) Scheduling iniziale J1 0 Scheduling dopo scambio J1 con J2 J2 J1 0 1 2 ΣCi =10+11+13=34 J2 J3 10 11 13 J3 Definizioni: • Distanza: date due soluzioni x e x’, la distanza d(x,x’) tra di esse è definita come il numero di elementi che appaiono in una delle due soluzioni ma non in entrambe. Nel caso di x e x’ binarie, d(x,x’) = Σi|xi-xi’|. Ad esempio nel caso del TSP le soluzioni x e x’ sono dei vettori di incidenza sull’insieme E degli archi della rete. In particolare la componente xi è posta a 1 se l’arco i-mo è parte del circuito a 0 nel caso contrario. L’algoritmo 2-opt genera una successione di soluzioni tali che d(xk, xk+1)=4. • Dimensione: la dimensione di un intorno | I(xk) | è definita come il numero degli elementi (soluzioni) che lo compongono. ΣCi =2+12+14=28 12 14 Raffaele Pesenti 33 • Distance-k-neighborhood: intorno che contiene tutte le soluzioni a distanza k dalla soluzione incombente. La dimensione di un distance-k-neighborhood tipicamente cresce in modo esponenziale al variare di k, ordine O(nk). Raffaele Pesenti Intorni: definizioni e commenti 34 Intorni: definizioni e commenti Commenti: • maggiore è la dimensione dell’intorno maggiore è la probabilità di giungere ad una soluzione x* di buona qualità, cresce però l’onere computazionale. Al limite, infatti, l’intorno può comprendere tutte le soluzioni ammissibili. Bisogna quindi cercare un punto di equilibrio tra qualità della soluzione e tempi di calcolo. • negli esempi riportati il numero degli elementi di ogni intorno I(xk) è polinomiale O(n2). e quindi ogni iterazione di ricerca locale rimaneva polinomiale anche se venivano esplorati tutti gli elementi dell’intorno. • quando possibile conviene definire intorni il cui numero di elementi sia esponenziale, ma che abbia una struttura tale che sia possibile determinare l’elemento a costo minimo in tempo polinomiale. • In alternativa, nel caso in cui non si riesca a determinare una soluzione migliore di quella incombente, si possono definire intorni la cui dimensione varia, ad esempio considerando distance-k-neighborhood con k crescenti.. Bibliografia: • R.K. Ahuja, Ö. Ergun, J.B. Orlin, A. P. Punnen, “A survey of very largescale neighborhood search tecniques”, Discrete Applied Mathematics 123 (2002) 75-102. • P. Hansen, N. Mladenović, “Variable neighborhood search: Principle and applications”, European Journal of Operational Research, 130 (2001) 449467. Raffaele Pesenti Raffaele Pesenti 35 36 Esempio Scheduling di m = 10 task su n=3 macchine late tasks EDD schedule total lateness = 18 Raffaele Pesenti 37 Raffaele Pesenti negative circuit improvement total lateness = 11 Raffaele Pesenti 38 best 2-exchange total tardiness = 12 39 Raffaele Pesenti 40 Metaeuristica tabù search Altre strategie di esplorazione dell’intorno Tabu search: • Utilizzando una funzione f(xk) che determina una soluzione successiva non peggiore (o addirittura che determina la soluzione successiva ottima tra quelle appartenenti all’intorno) in generale si rimane intrappolati in un ottimo locale. • Può allora convenire usare una funzione g(xk) che a volte determina una soluzione successiva peggiore della precedente nella speranza di ‘saltare’ fuori dall’ottimo locale. Su questa filosofia si basano, ad esempio, due metaeuristiche di ricerca locale: – tabu search – simulated annealing Raffaele Pesenti la tabu search è una metaeuristica di ricerca locale che permette passi in cui avvengono dei peggioramenti con criteri deterministici. Si definiscono dei criteri di accettazione della soluzione generata a soglia basati non necessariamente solo sul valore della funzione obiettivo. Poiché si accettano anche soluzioni che inducono peggioramenti della funzione obiettivo, per evitare di ritornare su soluzioni già visitate, ad ogni passo viene aggiornata una lista di operazioni vietate (tabù) che riporterebbero su soluzioni già visitate. Raffaele Pesenti 41 Metaeuristica tabù search Metaeuristica tabù search Metaeuristica TabuSearch 1. inizializzazione: si genera una soluzione iniziale ammissibile x0, si pone TabuList = nil, k = 0; 2. iterazione: do { [y1, y2, ..., yn] =g(xk) y = h((y1, y2, ..., yn), TabuList, //genera un insieme di nuove soluzioni alternative xk) //seleziona la migliore alternativa se esiste if (y = nil) {cambiamento = FALSE} function h((y1, y2, ..., yn), TabuList, xk) 1. inizializzazione: z* = ∞, i* = 0, y0= nil; 2. iterazione: for (i = 1; i <= n; i++) { if ((yi not in TabuList) or (f(yi) == TRUE) //valuta se yi non è tabù o soddisfa delle “aspirazioni” //valuta se yi è migliore della soluzione yi* corrente if (cyi < z*) {z* = cyi, i* = i} } else { xk+1 = y; cambiamento = TRUE, aggiorna(TabuList) } k= k+1 } while (cambiamento and k < M) //rimane nel loop se si è verificato un cambiamento di //soluzione e se non si è superato un limite massimo di mosse return //viene restituita la migliore soluzione xk ottenuta Raffaele Pesenti 42 43 return (yi*) Raffaele Pesenti //viene restituita la migliore soluzione yi* ottenuta 44 Metaeuristica tabù search Metaeuristica tabù search Commenti: • Sono ovviamente critiche per algoritmi tabù search la definizione delle funzioni: – g(xk) che determina un insieme di nuove soluzioni nell’intorno di xk, nei metodi più semplici tale insieme è generato in modo casuale, nei metodi più complessi tenendo conto delle statistiche delle soluzioni già visitate e delle caratteristiche strutturali del problema; – h((y1, y2, ..., yn), TabuList, xk) che ad ogni iterazione deve determinare la nuova migliore soluzione; – f(y) che descrive i criteri di aspirazione ovvero l’insieme di quelle condizioni che permettono di violare i tabù; • nello pseudocodice presentato per semplicità concettuale le funzioni g(.) e h(.) sono presentate separatamente ma in molti algoritmi sono fuse assieme; • la tabù search viene applicata con discreto successo anche quando alcuni dei vincoli del problema originale vengono rilassati lagrangianamente. In questo caso i criteri di aspirazione possono prevedere la soddisfazione dei vincoli. Commenti (continuazione): • la TabuList ha una lunghezza massima prefissata (o anche definibile dinamicamente), una volta raggiunto il limite massimo di mosse tabù (in generale non più di una decina) un nuovo tabù può essere immesso nella lista solo dopo averne eliminato uno già presente; • gli algoritmi più avanzati tengono contemporaneamente conto di più TabuList. Possono convivere liste che descrivono una memoria a breve termine e liste che descrivono una memoria a lungo termine (che cioè impediscono la generazione di determinate soluzioni per un più lungo periodo). La memoria a breve termine favorisce una ricerca intensiva di un intorno di soluzioni, la memoria a lungo termine la diversificazione delle soluzioni generate, in questo caso le TabuList possono essere usate anche dalla funzione g(xk). Possono anche convivere liste che tengono conto di aspetti diversi del problema (e.g., in un problema di scheduling l’assegnazione e la sequenziazione delle operazioni); • definire i criteri di aggiornamento delle TabuList è un altro degli aspetti critici delle euristiche tabù search. Raffaele Pesenti Raffaele Pesenti 45 46 Tabù search Tabù search archi dell’albero Esempio*: Problema - minimo albero ricoprente con vincoli aggiuntivi (side constraints): data la rete in figura determinare l’albero ricoprente minimo che soddisfi le seguenti condizioni aggiuntive: – solo uno tra gli archi a, b, f può essere presente – l’arco a può essere presente solo se è presente anche l’arco c a6 d2 f8 b9 c 18 e0 g 12 *tratto dal lavoro di Glover (vedi bibliografia) Raffaele Pesenti a6 b9 d2 e0 g 12 f8 Approccio basato su tabù search • la scelta dell’intorno è basata su scambio di archi • il tabù impedisce di scambiare gli ultimi due archi inseriti • il criterio di aspirazione permette di violare il tabù se si ottiene una soluzione migliore di quella correntemente ottima • i vincoli possono essere violati pagando una penalità di 50 per ogni violazione 47 a6 d2 f8 Raffaele Pesenti c 18 b9 arco escluso dall’albero tramite scambio archi tabù dell’albero passo 0: soluzione generata con algoritmo di Prim trascurando i vincoli. Soluzione correntemente ottima, ma non ammissibile z = 116 c 18 e0 g 12 passo 1: scambio di a con c. Ottimo locale. Soluzione correntemente ottima, z = 28 48 Tabù search a6 b9 d2 a6 d2 f8 c 18 e0 g 12 f8 b9 Metaeuristica simulated annealing c 18 e0 g 12 passo 2: scambio di f con g. Scambio che induce un peggioramento, inevitabile data l’ottimalità della soluzione al passo precedente, z = 32 passo 3: scambio di c con b. Scambio che viola un tabù, ma che viene effettuato in quanto induce una soluzione migliore di quella correntemente ottima. Nuova soluzione correntemente ottima, z = 23. La soluzione corrente è l’ottimo assoluto. Raffaele Pesenti 49 Simulated annealing: • la simulated annealing è un algoritmo per la soluzione di problemi combinatori NP-hard basato sulla metafora della annichilazione dei metalli: si raggiunge uno stato di minima energia non troppo velocemente in modo da evitare che si raggiunga una struttura cristallina finale di energia non minima; • la simulated annealing è una metaeuristica di ricerca locale che permette passi in cui avvengono dei peggioramenti con probabilità che decresce nel tempo; • il tasso di decremento è detto cooling schedule. Raffaele Pesenti Metaeuristica simulated annealing Metaeuristica simulated annealing Metaeuristica SimulatedAnnealing Commenti: • la funzione g(xk) determina una nuova soluzione ammissibile nell’intorno di x k; • la funzione h(Tk) definisce la politica di raffreddamento cooling schedule ; • se g(xk) sceglie con probabilità uniforme un qualunque elemento dell’intorno di xk, se Tk→0 , se tutte le soluzioni sono raggiungibili a partire da qualunque altra soluzione e se o gli intorni hanno tutti la stessa grandezza o la probabilità di scegliere y dato xk è uguale a quella di scegliere xk dato y, allora quando k→∞ la soluzione più probabile a cui converge l’algoritmo è quella ottima. • la difficoltà risiede nel fatto che l’algoritmo converge tanto più lentamente quanto più Tk tende a 0, d’altra parte se Tk non tende a 0, la soluzione ottima non è la più probabile. E’ quindi critica la scelta del cooling schedule, l’algoritmo converge all’ottimo in probabilità solo in tempi esponenziali. • di solito risultano buoni compromessi h(Tk) = 1/log(k) oppure h(Tk) = aTk con 0<a<1. 1. inizializzazione: si genera una soluzione iniziale ammissibile x0 ed una temperatura iniziale T0 2. iterazione: do { cambiamento = FALSE for (i = 0,( i < N) && (cambiamento = FALSE), i++) { y =g(xk) ∆ = cy - cxk //valutazione della soluzione y generata k+1 if (∆ <0) {x = y; cambiamento = TRUE} else (con probabilità exp(-∆ /T k)){ xk+1 = y; cambiamento = TRUE} } Tk+1 = h(Tk) } while cambiamento //esce dal loop quando la condizione è falsa return //viene restituita la migliore soluzione xk ottenuta Raffaele Pesenti 50 51 Raffaele Pesenti 52 Metaeuristica simulated annealing Altre Metaeuristiche Algoritmi genetici, Ant colonies, ... gli algoritmi basati su fenomeni naturali quali la selezione naturale, l’organizzazione di colonie di formiche, ecc... hanno ottenuto qualche successo su problemi specifici, ma non sembrano in generale essere superiori a quelli basati su tabù search ed in seconda istanza sulla simulated annealing. Commenti: • Sia la simulated annealing che la tabu search appaiono promettenti per la risoluzione euristica di problemi difficili quali quelli di scheduling le cui istanze reali attualmente appaiono di dimensione troppo grande per essere affrontate con gli algoritmi esatti disponibili; Reti neurali le reti neurali hanno indubbi successi quando applicate a problemi di riconoscimento o di ottimizzazione e controllo continuo. Viceversa i risultati ottenuti della loro applicazione al campo dei problemi combinatori sono, allo stato attuale, non ancora competitivi in termini di onere computazionale e di qualità con quelli ottenuti con altre tecniche. • in generale però la simulated annealing converge lentamente ed è applicata solo quando altre euristiche falliscono. Raffaele Pesenti 53 Raffaele Pesenti Euristiche e approssimazioni specifiche Ipotesi Commesso viaggiatore: nel seguito vengono presentate euristiche o algoritmi di approssimazione ed esatti specifiche per il problema del commesso viaggiatore diverse da quelle già viste in precedenza. Procedure che costruiscono un circuito hamiltoniano: inserimento doppio albero ricoprente Christofides risparmi Procedure che migliora un circuito hamiltoniano dato: K-opt (già viste) Lin – Kernighan Raffaele Pesenti 54 55 • disuguaglianza triangolare: il percorso diretto tra due nodi non è più costoso di qualunque indiretto: cij ≤ cik + ckj Per i problemi logistici tale ipotesi è pressoché sempre verificata. Nel seguito si assume sempre che • tutti i costi siano non negativi • valga la disuguaglianza triangolare (che i TSP siano metrici) • tutte le distanze siano simmetriche Raffaele Pesenti 56 Premessa Tipi di euristiche Si risolvono in modo esatto in pochi minuti TSP di centinaia di nodi, in un ora o poco più TSP di 1000 nodi. Quando allora utilizzare euristiche invece che algoritmi esatti? • quando le dimensioni del problema sono eccessive rispetto a quelle risolvibili attraverso algoritmi esatti • quando i problemi, anche se limitate dimensioni, devono essere risolti in tempi estremamente brevi costruttive – costruiscono un circuito hamiltoniano di miglioramento – partono da un circuito hamiltoniano e ne producono uno migliore • quando i dati del problema sono approssimati e quindi non vale la pena cercare la soluzione esatta • quando si risolvono problemi simili, ma non identici a quelli affrontati dagli algoritmi esatti. Questi ultimi sono molto meno generalizzabili delle euristiche Raffaele Pesenti 57 Raffaele Pesenti Nodo più prossimo Nearest Neighbor 58 Esempio C A Algoritmo base parte da un nodo di riferimento (tipicamente il magazzino centrale oppure un estremo del arco meno costoso) passa al nodo più vicino B Variante: a doppia crescita D E Raffaele Pesenti 59 Raffaele Pesenti distanze euclidee 60 Esempio Nodo più prossimo Nearest Neighbor C A Euristica Nodo più Prossimo B Percorso non ottimo. Il percorso ottimo, nel caso di distanze euclidee, non contiene incroci. D Commenti: non funziona molto bene: i primi archi sono brevi, gli ultimi molto lunghi però gli archi molto lunghi sono pochi: può essere una buona base da migliorare semplice da implementare errore di approssimazione < ½ ceil(log(n)) + ½ soluzioni mediamente del 25% superiori al minimo effettivo complessità computazionale O(n2) E Raffaele Pesenti 61 Raffaele Pesenti 62 Esempio Inserimento Matrice distanze A A 0 B 85 C 47 D 57 E 87 Algoritmo base si parte da un circuito parziale si inseriscono nuovi nodi Regole di inserimento (errore medio, errore massimo): – nodo più vicino (20%, 200%) – nodo più lontano (10%, ceil(log(n))+1) – inserimento più economico (17%, 200%) – inserimento casuale (11%, ceil(log(n))+1) Raffaele Pesenti B 85 0 43 52 38 C 47 43 0 48 58 D 57 52 48 0 32 E 87 38 58 32 0 Si noti la simmetria della matrice che implica che le distanze tra i nodi non dipendono dai versi di percorrenza. 63 Raffaele Pesenti 64 C Esempio Esempio A Euristica Inserimento Nodo più Lontano B Passo 2) Si cerca il nodo più distante da entrambe i nodi A ed E, cioè il nodo per cui sia massima la massima distanza da A ed E. Si confrontano quindi le distanze dei seguenti nodi: • B: BA = 85, BE = 38, distanza massima BA = 85 • C: CA = 47, CE = 58, distanza massima CE = 58 • D: DA = 57, DE = 32, distanza massima DA = 57 Il nodo più distante è B. Infatti, BE è il valore massimo tra 85, 57 e 57. D E Passo 1) I nodi a distanza massima sono A ed E. AE = 87. Si forma un circuito parziale A-E-A da A ad E e ritorno da E a A. A-E-A è lungo 87 + 87 = 174. (continua) Raffaele Pesenti 65 Raffaele Pesenti 66 Esempio Esempio (continuazione) Si inserisce il nodo B nel circuito parziale. Data la simmetria delle distanze e' indifferente dove avviene l'inserzione. Si supponga di inserire B nel percorso di andata da A ad E. In questo caso si risparmiano i 87 Km da A ad E, ma si pagano i 85 Km da A a B e gli 38 da B ad E. L'aumento complessivo e' di 85 + 38 - 87 = 36 Km. Il nuovo percorso e' A-B-E-A lungo 85 + 38 + 87 = 210. C Euristica Inserimento Nodo più Lontano A B D E Raffaele Pesenti 67 Raffaele Pesenti 68 Esempio Esempio Euristica Inserimento Nodo più Lontano C Passo 3) Si cerca il nodo più distante da i nodi del circuito parziale corrente, cioè dai nodi A, B ed E. In altre parole, si cerca il nodo r cui sia massima la massima distanza da A, da B e da E. Si confrontano quindi le distanze dei seguenti nodi: • C: CA = 47, CB = 43, CE = 58, distanza massima CE = 58 • D: DA = 57, DB = 52, DE = 32, distanza massima DA = 57 Il nodo più distante è C. CB è il valore massimo tra 58 e 57. Si inserisce il nodo C nel circuito parziale. Bisogna decidere se conviene inserire C tra A e B, oppure tra B ed E, oppure infine tra E e A. A B D E (continua) Raffaele Pesenti 69 Raffaele Pesenti 70 Esempio Esempio (continuazione) Si fanno tutti i tentativi: • C tra A e B: si risparmiano i 85 Km da A a B, ma si pagano i 47 Km da A a C e i 43 da C ad B. Incremento totale 47 + 43 - 87 = 3; • C tra B e E: si risparmiano i 38 Km da B ad E, ma si pagano i 43 Km da B a C e i 57 da C ad E. Incremento totale 43 + 58 - 38 = 63; • C tra E e A: si risparmiano i 87 Km da E a A, ma si pagano i 58 Km da E a C e i 47 da C ad A. Incremento totale 58 + 47 - 87 = 18. Conviene quindi inserire C tra A e B in modo da incrementare al minimo la lunghezza del percorso parziale. Il nuovo percorso parziale è A-C-B-E-A lungo 47 + 43 + 38 + 87 = 215. C Euristica Inserimento Nodo più Lontano A B D E Raffaele Pesenti 71 Raffaele Pesenti 72 Esempio Esempio Passo 4) Non rimane che inserire D nel circuito parziale. Bisogna decidere se conviene inserire D tra A e C, oppure tra C e B, oppure tra B ed E, oppure infine tra E ed A. Si fanno tutti i tentativi: • D tra A e C: si risparmiano i 47 Km da A a C, ma si pagano i 57 Km da A a D e gli 48 da D ad C. Incremento totale 57 + 48 - 47 = 58; • D tra C e B: si risparmiano i 43 Km da C a B, ma si pagano i 48 Km da C a D e gli 52 da D ad B. Incremento totale 48 + 52 - 54 = 46; C Euristica Inserimento Nodo più Lontano A B D E (continua) Raffaele Pesenti 73 Raffaele Pesenti 74 Esempio Esempio (continuazione) • D tra B e E: si risparmiano i 38 Km da B ad E, ma si pagano i 52 Km da B a D e i 32 da D ad E. Incremento totale 52 + 32 - 38 = 58; • D tra E e A: si risparmiano i 87 Km da E a A, ma si pagano i 32 Km da E a D e i 57 da D ad A. Incremento totale 32 + 57 - 87 = 2. Conviene quindi inserire D tra E e A in modo da incrementare al minimo la lunghezza del percorso parziale. Il percorso finale e' A-C-B-E-D-A lungo 47 + 43 + 38 + 32 + 57 = 217. C Euristica Inserimento Nodo più Lontano A B D E Raffaele Pesenti 75 Raffaele Pesenti 76 Doppio albero ricoprente Esempio Concetti base: • albero una rete: con numero di rami pari al numero di nodi meno 1 senza circuiti connesso un albero ricoprente minimo è l’albero di lunghezza minima che tocca tutti i nodi. Sia c(MST) il costo di tale albero. C Euristica Inserimento Nodo più Lontano A B D E • ogni percorso hamiltoniano è un albero il cui costo è certamente non inferiore al costo dell’albero ricoprente minimo Risultato finale Raffaele Pesenti 77 Raffaele Pesenti Doppio albero ricoprente Doppio albero ricoprente • ogni circuito hamiltoniano è composto da un percorso hamiltoniano a cui è stato aggiunto un arco. Il costo del circuito hamiltoniano minimo, c(TSP) è certamente non inferiore al costo dell’albero ricoprente minimo: c(MST) ≤ c(TSP) • da un albero ricoprente minimo si può generare un circuito che visiti, eventualmente più volte, tutti i nodi. Basta percorrere tutti gli archi nei due sensi ritornano indietro solo quando non ci sono alternative. Un circuito così ottenuto ha un costo 2c(MST), il cui valore è certamente non inferiore a quello del circuito hamiltoniano minimo: c(MST) ≤ c(TSP) ≤ 2c(MST). • se vale la diseguaglianza triangolare, è possibile ridurre il circuito ottenuto al passo precedente ad un circuito hamiltoniano di costo non superiore c(CH) ≤ 2c(MST), basta seguire il circuito, saltando i nodi già visitati. Si ottiene un circuito per cui vale c(MST) ≤ c(TSP) ≤ c(CH) ≤ 2c(MST). Raffaele Pesenti 78 79 Algoritmo: si parte da un albero ricoprente minimo, si raddoppia gli archi per avere un giro completo, si ricava un circuito hamiltoniano. Efficacia: • al peggio 100% più del minimo infatti un albero ricoprente minimo non è più lungo del minimo circuito hamiltoniano, • 38% in media. Raffaele Pesenti 80 Esempio Esempio C B C B D D A A albero minimo E E Raffaele Pesenti 81 Esempio Raffaele Pesenti 82 C Esempio C taglio dei nodi già visitati, percorso B-E-D-A-C-B primo percorso B-E-D-A-D-C-D-E-B B D B D E A NB: si giungeva ad un risultato peggiore partendo dal percorso B-E-D-C-D-A-D-E-B E Raffaele Pesenti A 83 Raffaele Pesenti 84 Christofides Esempio C Concetti base: • ordine di un nodo: numero degli archi incidenti. Algoritmo: si parte da un albero ricoprente minimo, si connettono al meglio i nodi di ordine dispari (matching), si ricava un circuito hamiltoniano. B Efficacia: • 50% più del minimo nel peggiore dei casi. Questa è la migliore approssimazione per TSP metrici non euclidei. • 10 – 20% in media. D A E Raffaele Pesenti 85 Esempio Raffaele Pesenti 86 Esempio C nodi dispari: B, D, A, C C primo circuito: B-E-D-A-C-D-B archi di matching: BD, CA B B D D A albero minimo in nero A E E Raffaele Pesenti 87 Raffaele Pesenti 88 Esempio Risparmi C circuito migliorato: B-E-D-A-C-B Algoritmo: si parte con n – 1 circuiti parziali da un nodo arbitrario, per ogni coppia di circuiti parziali si calcola quanto si risparmierebbe fondendoli assieme, si fondono i due circuiti parziali più convenienti. B Efficacia: 10% più del minimo in media, ordine log(n) nel caso peggiore. D A E Raffaele Pesenti 89 Raffaele Pesenti Tipi di euristiche 90 Lin – Kernighan Concetto base: • k – opt con k variabile. costruttive – costruiscono un circuito hamiltoniano Algoritmo: si effettua k – opt, si valuta se effettuare (k+1) – opt. di miglioramento – partono da un circuito hamiltoniano e ne producono uno migliore Efficacia: 1% in più dell’ottimo in media. Raffaele Pesenti 91 Raffaele Pesenti 92 Bibliografia • P. Serafini, Ottimizzazione, Franco Angeli, Milano, I, 2000 • F. Glover, “Tabù Search: a Tutorial”, Interfaces,20:4, 1990, pp. 74-94 • M. L. Fisher, “An Application Oriented Guide to Lagrangian Relaxation”, Interfaces,15:2, 1985, pp. 10-21 • K. A. Smith, “Neural Networks for Combinatorial Optimization: A Review of More Than a Decade of Research”, INFORMS Journal on Computing, 11:1, 1999, pp. 15-34. Raffaele Pesenti 93