Ricerca Operativa Ivan Zivko Introduzione • La Ricerca Operativa (“Operations Research”) è una branca della matematica applicata che usa modelli matematici per analizzare e risolvere problemi decisionali complessi. • La OR entra in causa quindi se bisogna prendere una decisione!! Possibilmente quella migliore, o ottima! Infatti si parla di problemi di ottimizzazione. Introduzione • Se bisogna scegliere tra più possibilità la OR ci deve dire qual è la soluzione ottima o, se non è possibile in modo esatto, almeno una soluzione molto vicina a quella ottima. Introduzione • La OR trova le sue origini alla fine degli anni ‘30 con l’avvento della seconda guerra mondiale, per assegnare in modo efficace le risorse limitate alle diverse operazioni: – Posizionamento dei radar – Approvvigionamento delle truppe – Scelta dei bersagli – …. Introduzione • I settori in cui viene applicata oggi la OR sono molti: – Economia (ottimizzare le risorse,…) – Ingegneria (reti di trasporto,…) – Logistica – Scienze – Matematica – Strategia militare – …. Modelli e Sistemi decisionali Il modello e il sistema • Il modello matematico è una rappresentazione della realtà tramite un linguaggio matematico. • Modelli descrittivi: – Modello del sistema solare di Copernico. – Modello dell’atomo di Bohr. – …. • Modelli decisionali( o di ottimizzazione): – Come suddividere i turni di lavoro in fabbrica. – Come pianificare degli investimenti. – ….. Il modello e il sistema • Se la realtà è esattamente descrivibile con un modello decisionale, allora si parla di modelli analitici. • Se la realtà è molto complessa e i dati non sono conosciuti in modo certo allora si parla di sistema, che potrà essere descritto tramite un modello di simulazione. Il modello e il sistema • Esempio di sistema: la rete di trasporti milanese. – Ha alcuni elementi certi: i bus, i conducenti, i controllori, gli orari,…. – Ma ha anche alcuni fattori imprevisti: nervosismo del conducente, ingorghi, …. Classificazione dei modelli • I modelli vengono classificati a dipendenza delle caratteristiche del problema, che emergono rispondendo alle seguenti 3 domande: – Chi decide? -> numero dei decisori (uno o più?) – Quali obiettivi? -> numero di obiettivi (uno o più?) – Quali informazioni? -> informazioni certe (determinate) o informazioni incerte (ambiente stocastico) Classificazione dei modelli • Le possibili combinazioni di queste tre caratteristiche (uno o più decisori, uno o più obiettivi, ambiente determinato o stocastico) porta alla classificazione di 8 tipi di modelli analitici. • Esempi: – + decisori: teoria dei giochi – + obiettivi: programmazione a molti obiettivi – Dati incerti: programmazione stocastica – 1obiettivo e 1 decisore: programmazione matematica Approccio al problema • Per prendere una decisione in risposta a un problema decisionale si procede in 5 fasi. FASE 1 • Problema FASE 2 • Modello FASE 3 • Algoritmo FASE 4 • Software FASE 5 • Soluzione Approccio al problema FASE 1 • Problema • Parlare col committente. • Individuare gli elementi fissi e quelli che possono variare -> vincoli. • Raccogliere i dati se possibile, altrimenti generarli in modo casuale. Approccio al problema FASE 2 • Modello • Costruzione del modello matematico: – Astrazione e schematizzazione del problema. – Dai dati ricavare le informazioni che serviranno per giungere ad una decisione. Approccio al problema FASE 3 • Algoritmo • Scelta della procedura (algoritmo) per risolvere il modello: – Determinare una sequenza finita di istruzioni che ci daranno i dati in uscita. • A dipendenza della difficoltà del problema l’algoritmo potrà essere: – Esatto (garantisce la soluzione ottima) – Euristico (buona soluzione anche se non ottimale) – Approssimato (valore vicino a quello ottimo entro una certa soglia). Approccio al problema FASE 4 • Software • Implementare l’algoritmo in un linguaggio di programmazione (eventualmente creare un interfaccia grafica facile da usare per il committente). Approccio al problema FASE 5 • Soluzione • Analisi dei risultati ottenuti: verificare cioè possibili incoerenze e determinare se si tratta di un problema nel modello (magari non rispecchia il problema reale), nell’algoritmo o nell’implementazione del software. Modelli di programmazione matematica Modelli di PM • 1 decisore, 1 obiettivo • Nella formulazione di un modello di PM ci sono 3 punti fondamentali: – Individuare le decisioni (cosa devo decidere?), determinare cioè le variabili decisionali. – Determinare l’obiettivo da ottimizzare, creare cioè la funzione obiettivo (dipende dalle variabili). – Definire le soluzioni ammissibili, stabilire cioè i vincoli(o regole) che il risultato deve soddisfare. Esempio: la compilation ideale • Si vuole realizzare un CD con 800 MB di capacità. Però non ci stanno tutte le canzoni, quindi devo sceglierne alcune basandomi sull’indice di gradimento e sull’ingombro. Canzone (x) Gradimento Ingombro Nothing else matter 9 200 Gagnam Style 5 250 American Idiot 7 190 Imagine 9 180 Hanno ucciso l’umo ragno 7 220 Numb 8 230 Esempio: la compilation ideale • L’obiettivo è chiaramente ottenere il CD con il massimo gradimento. • Cosa devo decidere?-> se una canzone fa parte(1) o no(0) del CD. • La funzione obiettivo deve rappresentare il gradimento (che bisognerà massimizzare). • Il vincolo è che lo spazio totale delle canzoni non superi 800 MB. Esempio: la compilation ideale • Quindi la funzione obiettivo sarà: max f ( x) 9 x1 5 x2 7 x3 9 x4 7 x5 8 x6 • Le variabili decisionali x possono essere 1(la canzone c’è) oppure 0(la canzone non c’è): xi 0;1 • Il vincolo in questo caso è: 200 x1 250 x2 190 x3 180 x4 220 x5 230 x6 800 Modelli di PM • In generale nei modelli di PM abbiamo una funzione da minimizzare o massimizzare: max f ( x) oppure min f ( x) • Con x che sono le variabili decisionali e poi un insieme di vincoli che ci dicono quali sono le soluzioni ammissibili. Esempio 2: il pranzo migliore • Una persona con livelli bassi di ferro nel sangue ha per pranzo tre tipi di cibo con i seguenti valori nutritivi per 1 g: Cibo Ferro (g) Chilocalorie Carne 0.15 2.2 Verdura 0.30 0.5 Pasta 0.02 3.5 Esempio 2: il pranzo migliore • La persona desidera assumere la maggior possibile quantità di ferro. • Però la persona non vuole neanche ingrassare, e al massimo desidera mangiare 500 Kcal. • Inoltre ogni tipo di cibo deve essere presente almeno con 50g. Esempio 2: il pranzo migliore • Formuliamo il modello: max f ( x) 0.15 x1 0.30 x2 0.02 x3 2.2 x1 0.5 x2 3.5 x3 500 x1 50 x2 50 x3 50 Modelli di PM • Per risolvere i modelli in generale se è possibile si usano metodi analitici, che portano a una soluzione esatta, ma magari impiegando troppo tempo. • Oppure si possono usare metodi di simulazione o metodi euristici, che portano una soluzione più velocemente, anche se magari non è la migliore. Classificazione di metodi(algoritmi) • Metodo esaustivo: cerca la soluzione esaminando tutte le possibilità (forza bruta). • Metodo euristico: cerca la soluzione per tentativi. • Metodo iterativo: ripete un certo numero di volte la stessa azione, e se converge si avvicina sempre di più alla soluzione. • Metodo stocastico: simula un comportamento casuale cercando di prevedere la soluzione basandosi su delle probabilità. Trattamento dei dati Tempo e memoria di calcolo • Abbiamo visto come si può ricondurre un problema a un modello, e fatto ciò si potrebbe passare alla ricerca di una soluzione. • La soluzione potrà essere trovata applicando un algoritmo che in genere viene implementato attraverso un programma. Ma la domanda che vogliamo porci adesso è quando l’algoritmo è efficiente? Tempo e memoria di calcolo • L’efficienza dipende da due fattori fondamentali: – Tempo di calcolo necessario per giungere alla soluzione (deve essere un tempo utile). – Quantità di memoria impiegata (deve essere compatibile con le risorse del calcolatore). Tempo e memoria di calcolo • Esempio: il problema del commesso viaggiatore. Nel suo giro il commesso deve toccare 50 città (compresa quella di partenza), e desidera trovare il percorso più breve da seguire. Per fare ciò calcola tutte le lunghezze di tutti i percorsi possibili, che però in totale sono: 49 48 ..... 2 1 49! 6 10 62 Tempo e memoria di calcolo • Esempio: il problema del commesso viaggiatore. Supponendo di disporre di un calcolatore di buona potenza esso impiegherebbe circa 1040 secoli di tempo per fare tutti i calcoli! • Un tale metodo esaustivo, o di forza bruta è inefficiente in questo caso! Tempo e memoria di calcolo • Esempio 2: vogliamo rappresentare le relazioni di scambio postale tra gli 8000 comuni d’Italia. Potremmo per esempio costruire una matrice 8000x8000 i cui elementi rappresentano il volume di scambio tra i vari comuni. • Sarebbe una matrice con 64 milioni di celle! Anche se tecnicamente possibile sarebbe inefficiente! • Conclusione: non è sufficiente determinare un algoritmo corretto, occorre che sia praticabile! Tempo e memoria di calcolo • Esempio 3: un azienda effettua trasporti di pacchi tra quattro ditte A, B, C e D. Nella seguente matrice è indicato il numero di pacchi da recapitare da ogni ditta verso le altre: A A B C D 0 2 0 0 B 0 0 5 0 C 7 0 0 0 D 0 0 0 0 Tempo e memoria di calcolo • Esempio 3: Vediamo che ci sono 24 informazioni, delle quali molte inutili. • Con una struttura a lista risparmiamo notevolmente spazio: AB 2 BC 5 CA7 Complessità computazionale • Per esprimere in modo più preciso e quantitativo l’efficienza di un algoritmo si ricorre alla nozione di complessità computazionale (si parla di complessità di tempo e di complessità di memoria). Complessità computazionale • La variabile indipendente è la dimensione dei dati in ingresso, visto che il tempo di risoluzione dipende da essa. • Oss.: il numero di bit necessari per codificare un intero n si può calcolare con: I log 2 n • Dove I quindi è la dimensione dei dati. Complessità computazionale • La complessità temporale di un algoritmo non si può esprimere in funzione del tempo impiegato, perché si perderebbe in generalità! (cambia a dipendenza del calcolatore). • Si esprime invece in funzione del numero di operazioni elementari (addizioni, sottrazioni, moltiplicazioni, divisioni e confronti) necessari per arrivare alla soluzione. Esempio: algoritmo di ordinamento bubble sort • Vogliamo ordinare una lista di n numeri in modo crescente. 1. Si confronta il 1° e il 2° numero, se il secondo è inferiore li scambio di posto. Poi si passa a confrontare il 2° e il 3° e si fa la stessa cosa. Si continua così fino a confrontare gli ultimi due. In fondo così avremo il più grande, facendo n-1 confronti (operazioni). Esempio: algoritmo di ordinamento 2. Si procede di nuovo come al punto 1 arrivando fino al penultimo numero. Così gli ultimi due sono ordinati. Qui si è fatto quindi n-2 confronti. 3. Si continua così fino a che si dovrà confrontare solo i primi due. Esempio: algoritmo di ordinamento • Nel caso peggiore (che è quello che ci interessa) la quantità di operazioni sarà: n n 1 (n 1) (n 2) ... 3 2 1 2 • Con 100 numeri prevediamo quindi: 100 99 4950 operazioni 2 • Se un PC ci mette circa 0.000016s per un operazione, per eseguire questo algoritmo ci metterà circa: 4950 0.000016 0.0792 s Esempio 2: cammino minimo • Ci sono 4 città collegate fra di loro con strade come segue (se compare distanza ∞ non c’è collegamento): 13 1 4 30 8 25 32 2 ∞ 3 • Vogliamo trovare il minimo cammino possibile che passi da tutte le città una sola volta. • Ci sono 4! modi di ordinare le città, e quindi di percorsi, eliminiamo quelli uguali ma rovesciati e arriviamo a 12. Esempio 2: cammino minimo • Usiamo anche qui un metodo esaustivo: Percorso Lunghezza [1 2 3 4] ∞ [1 2 4 3] 65 [1 3 2 4] ∞ [1 3 4 2] 87 [1 4 2 3] ∞ [1 4 3 2] ∞ [2 1 3 4] 63 [2 1 4 3] 46 [2 3 1 4] ∞ [2 4 1 3] 75 [3 1 2 4] 70 [3 2 1 4] ∞ Esempio 2: cammino minimo • A questo punto notiamo che il percorso minimo è [2 1 4 3]. • Per farci un idea della complessità temporale consideriamo solo il tempo necessario per generare tutte le permutazioni possibili. • Se le città sono n i cammini da considerare sono: n! 2 Esempio 2: cammino minimo • Vediamo come cresce il numero di cammini al crescere delle città Città (n) Percorsi (n!/2) 2 1 5 60 7 2520 15 653837184000 20 1216451004000000000 25 775560522000000000000000 Esempio 2: cammino minimo • Se per generare un solo percorso il PC impiega 0.00002 secondi, per generarne n ne impiega: Città (n) Durata 10 38 secondi 15 158 giorni 20 804000 anni 25 341 età dell’universo • E non abbiamo neanche calcolato il tempo necessario per fare le somme necessarie per trovare le lunghezze dei percorsi. Complessità computazionale • Per avere una stima della complessità di un algoritmo, anziché determinare il numero esatto di operazioni elementari è più utile determinare con che rapidità esse crescono all’aumentare dei dati in entrata (ad es. il numero di città). • Per esempio nel caso dei percorsi esse aumentavano velocemente (n!/2). Complessità computazionale • Sia f(n) la funzione che rappresenta il numero di operazioni in funzione dei n dati. Se esiste una costante k e una funzione g(n) per la quale, con n abbastanza grande, vale: f ( n) k g ( n) diremo: f (n) O( g (n)) Complessità computazionale • Nel caso dell’algoritmo di ordinamento bubble sort la funzione era: • Quindi vale: n(n 1) f ( n) 2 n(n 1) n n n 2 n 2 2 2 2 2 Complessità computazionale • Possiamo dire quindi: n(n 1) 2 O(n ) 2 • La complessità computazionale in questo caso è quindi O(n2). Complessità computazionale • Nel caso dell’algoritmo del cammino minimo la funzione era: n! f ( n) 2 • Possiamo dire quindi: n! O(n!) 2 • La complessità computazionale in questo caso è quindi O(n!). Complessità computazionale • In generale un algoritmo si può dire efficiente se è di complessità polinomiale o logaritmica. • Un algoritmo sarà invece inefficiente se di complessità fattoriale o esponenziale. Complessità computazionale • Di seguito avete una tabella che mostra l’evoluzione di alcune funzioni di O-grande all’aumentare dei dati in entrata n: n ln(n) n n*ln(n) n^2 e^n n! n^n 1 0 1 0 1 2.718282 1 1 2 0.693219 2 1.386438 4 7.389056 2 4 3 1.098726 3 3.296179 9 20.08554 6 27 4 1.386438 4 5.545752 16 54.59815 24 256 5 1.609605 5 8.048024 25 148.4132 120 3125 6 1.791945 6 10.75167 36 403.4288 720 46656 7 1.946112 7 13.62278 49 1096.633 5040 823543 8 2.079657 8 16.63726 64 2980.958 40320 16777216 9 2.197452 9 19.77707 81 8103.084 362880 3.87E+08 10 2.302824 10 23.02824 100 22026.47 3628800 1E+10 I Grafi Grafi • In diversi problemi di ricerca operativa risulta utile spesso usare i grafi per rappresentare i vari elementi del problema e le relazioni che intercorrono tra essi. • Possono essere usati laddove le alternative possibili siano un numero finito. Grafi • Un grafo è un insieme di nodi collegati da segmenti (eventualmente orientati) detti archi. D A B C E Grafi: definizioni • Arco - I nodi A e B si dicono adiacenti. A B • Arco orientato – A è adiacente a B ma non viceversa. A B • Auto-Anello. A Grafi: definizioni • Grafo orientato: tutti gli archi sono orientati. B A D C Grafi: definizioni • Grafo completo:ogni nodo è collegato a tutti gli altri. A C B D • Se il grafo dovesse essere orientato allora è completo solo se per ogni coppia di nodi esiste l’arco che va dal 1° al 2° ma anche l’arco che dal 2° val 1° . Grafi: definizioni • Sottografo: è grafo che fa parte di un grafo più grande. A C B D Grafi: definizioni • Cammino: è una sequenza di archi in cui la fine di un arco coincide con l’inizio di un altro, a parte naturalmente per il 1° e l’ultimo nodo. A D C B Grafi: definizioni • Ciclo o circuito: è un cammino in cui il nodo iniziale corrisponde a quello finale. A B C • Grafo aciclico: non contiene cicli. B A C Grafi: definizioni • Grafo connesso: esiste un cammino per ogni coppia di nodi. E A D B C Grafi: definizioni • Albero: è un grafo di solito non orientato, connesso e aciclico. E B A D C Grafi: definizioni • Grado di un nodo: se il grafo non è orientato è il numero di archi che lo toccano, se invece è orientato si distingue in grado entrante e grado uscente. A • Il grado di un grafo completo equivale al grado di uno qualsiasi dei suoi nodi. Grafi: definizioni • Grafo pesato: è un grafo in cui gli archi hanno un peso (costo) specifico. 5 A B D 5 4 C 7 Grafi: definizioni • È possibile rappresentare algebricamente i grafi mediante opportune matrici. • Matrice di adiacenza: è una matrice nxn in cui l’elemento è 1 se due nodi sono adiacenti e 0 se non lo sono. Esempio: A A B C D 0 1 1 0 B 1 0 0 0 C 0 0 0 1 D 0 0 1 0 Grafi: definizioni • Matrice dei pesi: è una matrice in cui indichiamo i pesi dei archi. Esempio: A A B C D B C 4 7 10 3 1 D • Se l’elemento è vuoto vuol dire che non c’è l’arco. Ottimizzazione su grafi Introduzione • Spesso un problema di ottimizzazione e il relativo metodo di risoluzione si possono rappresentare bene con un grafo. • Si tratta di cercare tra tutti i grafi che soddisfano le condizioni quello migliore. • Vediamo due metodi deterministici usati in questi casi: metodo di Dijkstra e metodo di Kruskal. Metodo di Dijkstra • Consideriamo il seguente problema: determinare il costo minimo per trasferirsi da una città a tutte le altre in un certo territorio. Rappresentiamo i dati in una matrice: A B C D E A B C D E 0 10 2 8 9 0 5 3 4 3 7 0 5 2 8 3 5 0 1 6 3 2 0 Metodo di Dijkstra Metodo di Dijkstra Metodo di Dijkstra • Il metodo di Djikstra si potrebbe così riassumere: 1. Creare tutti gli archi che partono dal nodo iniziale agli altri indicando i costi. 2. Asteriscare il/i nodo/i con costo minimo. 3. Verificare se dal nodo asteriscato agli altri nodi il costo è inferiore che non direttamente dal 1° . 4. Tornare al punto 2. 5. Fermarsi quando tutti i nodi sono asteriscati. Metodo di Kruskal • Il metodo di Dijkstra serviva a cercare il cammino minimo da un punto iniziale a tutti gli altri. • Un problema più esteso può essere invece quello di cercare un albero di supporto minimo, cioè un grafo che colleghi tutti i punti in modo che la lunghezza totale sia minima. • Ciò è utile per esempio per creare una rete ferroviaria, un sistema di distribuzione dell’acqua di una città, oppure un circuito elettronico. Metodo di Kruskal • Esempio: quanti alberi di supporto con 3 nodi ci sono? B A B C B A C A C • Teorema di Cayley: con n nodi, il numero possibile di alberi di supporto è n2 n Metodo di Kruskal • Per esempio volendo creare un albero di supporto per una rete ferroviaria di 22 città le possibilità sarebbero 2220; è chiaro che un metodo esaustivo non è applicabile. • Sfrutteremo invece un metodo che usa un grafo non orientato, cercando di usare gli archi che costano di meno, senza creare cammini ciclici e in modo che da ogni nodo si possa arrivare a tutti gli altri. Metodo di Kruskal • Il metodo di Kruskal è definito dai seguenti passi: 1) Considerare i costi di tutti gli archi e ordinarli in senso crescente (se i costi di 2 archi sono uguali l’ordine è indifferente). 2) Scegliere, tra quelli non ancora considerati, il lato di costo minimo e inserirlo nell’albero di supporto se il suo inserimento non determina un ciclo, altrimenti eliminarlo. 3) Ripetere il passo 2 finché non sono stati inseriti n-1 archi. Metodo di Kruskal • Esempio: nella seguente matrice sono indicate le distanze tra 5 città. Si vuole creare una rete ferroviaria di costo minimo. Usiamo il metodo di Kruskal. A A B C D E B C D E 0 22 21 50 45 * 0 17 30 23 * * 0 25 34 * * * 0 19 * * * * 0 Metodo di Kruskal • Esempio: Ordiniamo gli archi dal minore al maggiore. [ B, C ] 17 [ D, E ] 19 [ A, C ] 21 [ A, B ] 22 [ B, E ] 23 [C , D ] 25 [ B, D ] 30 [C , E ] 34 [ A, E ] 45 [ A, D ] 50 • Esempio: Metodo di Kruskal Metodi euristici Introduzione • Abbiamo visto che spesso si presentano problemi con complessità computazionale di tipo esponenziale, e per i quali quindi una soluzione ottima è difficile da trovare. Si parla di problemi NP-difficili. • Sono perciò di grande importanze gli algoritmi euristici, i quali privilegiano la velocità di esecuzione piuttosto che la precisione della soluzione. Introduzione • Gli algoritmi euristici sono quindi metodi che generano una soluzione ammissibile in un tempo ragionevole, soluzione che però non necessariamente è ottima. Algoritmi greedy • I più semplici metodi euristici sono gli algoritmi greedy (=ingordi). Consistono nel cercare la soluzione per iterazioni successive, effettuando ogni volta la scelta più favorevole compatibile con i vincoli. • Difetto degli algoritmi greedy: non tengono conto delle ripercussioni delle scelte intermedie nel determinare la soluzione finale. Algoritmi greedy • Gli algoritmi di Dijkstra e Kruskal che abbiamo visto, sono algoritmi di tipo greedy, tuttavia sono esatti, differentemente dalla maggior parte di questi algoritmi. • L’algoritmo con cui abbiamo cercato di risolvere il problema del commesso viaggiatore (TSP) nella serie 2 (“nearest neighborhood”) è un altro esempio di metodo euristico greedy, in quel caso non esatto. Algoritmi greedy • Esempio: algoritmo nearest neighborhood. Cerchiamo di risolvere un problema TSP con questo algoritmo partendo dal punto 1. 5 7 3 1 2 4 8 6 Algoritmi greedy • Esempio: si nota il difetto dell’ultimo arco, che aumenta di molto il percorso. 5 7 3 1 2 4 8 6 Algoritmi greedy • Esempio 2: algoritmo nearest insertion. In questo caso si parte da una coppia di nodi, e man mano si aggiunge il nodo più vicino creando sempre un 5 7 ciclo. 3 1 2 4 8 6 Algoritmi greedy • Esempio 2: algoritmo nearest insertion. 5 7 3 1 2 4 8 6 Algoritmi greedy • Gli algoritmi greedy hanno il vantaggio di essere semplici, e quindi di solito sono facili da implementare; inoltre in genere sono di rapida esecuzione. • Per questi motivi spesso i metodi greedy sono il punto di partenza per algoritmi basati sulla ricerca locale. Algoritmi greedy • Esempio 3: si hanno dei pesi da impachettare in contenitori uguali, con portata di 11 Kg. Si vuole disporre tutti i pesi utilizzando meno contenitori possibili. Vediamo tre metodi per risolvere il problema: – Metodo dell’inserimento del successivo (NF) – Metodo dell’inserimento del primo che ci sta (FF) – Metodo dell’inserimento del primo che ci sta dalla lista ordinata (FFD). Algoritmi greedy • Esempio 3: Metodo dell’inserimento del successivo (NF). Si mette il 1° peso, se ci sta anche il 2° lo si mette, se no si apre una nuova scatola. • Pesi in Kg: 1, 5, 7, 6, 4, 8, 10, 2, 7, 3 Algoritmi greedy • Esempio 3: Metodo dell’inserimento del primo ce ci sta (FF). Si mette il 1° peso, poi si scorre la lista cercando se c’è un altro peso che ci sta, quando non ci stanno altri pesi si apre una nuova scatola. • Pesi in Kg: 1, 5, 7, 6, 4, 8, 10, 2, 7, 3 Algoritmi greedy • Esempio 3: Metodo dell’inserimento del primo ce ci sta dalla lista ordinata(FFD). Si mette gli elementi in ordine decrescente e poi si procede uguale al metodo FF. • Pesi in Kg: 10, 8, 7, 7, 6, 5, 4, 3, 2, 1 Ricerca locale • Le tecniche di ricerca locale fanno anch’esse parte dei metodi euristici, e consistono principalmente in due punti: – Si prende una soluzione ammissibile qualsiasi. – Si prova a migliorarla iterativamente cercando altre soluzioni “vicine”, facendo piccole trasformazioni. • Spesso la soluzione ammissibile iniziale la si ottiene da un algoritmo greedy. Ricerca locale • Esempio 1: metodo 2-scambio per il problema del commesso viaggiatore. Si parte da una soluzione iniziale ottenuta per esempio con il nearest neighborhhod. Poi si scambiano due archi utilizzati con due archi inutilizzati e si verifica se la soluzione è stata migliorata. Ricerca locale • Esempio 1: proviamo il metodo considerando la seguente matrice dei pesi. 0 10 3 7 5 10 0 8 6 2 3 8 0 4 3 7 6 4 0 9 5 2 3 9 0 • Esempio 1: Ricerca locale Ricerca locale • Esempio 2: considera il seguente problema dello zaino, in cui si vuole massimizzare il valore degli oggetti da inserire, evitando che il peso superi i 6 Kg. max z 13x1 7 x2 6 x3 9 x4 5 x5 4 x1 3x2 2 x3 3x4 x5 6 x j 0;1 per j 1,...,5 Ricerca locale • Esempio 2: vediamo il rapporto valore-peso dei 5 oggetti: 13 7 6 9 5 x1 : 3.25, x2 : 2.3, x3 : 3, x4 : 3, x5 : 5 4 3 2 3 1 • È chiaro che bisogna scegliere gli oggetti col miglior rapporto valore-peso, perciò mettiamoli in ordine decrescente, e inseriamo nello zaino i migliori che ci stanno: x5 , x1 , x4 , x3 , x2 • Inserendo i primi due oggetti si arriva gia al peso massimo di 6 Kg. Ricerca locale • Esempio 2: la soluzione greedy in questo caso sarà: SOLUZIONE Z X’=(1,0,0,0,1) 18 • Per visitare l’intorno di questa soluzione iniziale usiamo come mossa lo scambio di un oggetto inserito nello zaino con un altro non inserito, a patto che la capacità dei 6 Kg non venga superata. Ricerca locale • Esempio 2: nell’intorno con questa mossa troviamo le seguenti soluzioni ammissibili: SOLUZIONE Z (1,0,0,0,1) 18 (0,1,0,0,1) 12 (0,0,1,0,1) 11 (0,0,0,1,1) 15 (1,0,1,0,0) 19 • Pertanto la soluzione x’’=(1,0,1,0,0) permette di migliorare la soluzione da 18 a 19. Ricerca locale • Se proviamo ad applicare di nuovo la mossa dello scambio non troveremo soluzioni migliori. • La soluzione che abbiamo trovato è un massimo locale, ma non è detto che sia anche il massimo globale. • Verifica che se consideriamo come mossa la modifica di al massimo un oggetto, senza modificarne altri, riusciamo a trovare una soluzione migliore per l’esempio 2. Ricerca locale • Il difetto principale degli algoritmi di ricerca locale è quello di potersi arrestare in ottimi locali, magari molto peggiori rispetto all’ottimo globale. • L’esito dipende quindi fortemente dal nodo dal quale si decide di partire! Ricerca locale Fonte: http://www.okpedia.it/ricerca_hill_climbin g Algoritmi Metaeuristici • Per non rimanere intrappolati in ottimi locali bisogna esplorare perciò regioni diverse nello spazio delle soluzioni, accettando perciò anche la possibilità di incorrere in soluzioni peggiori. • I metodi che cercano di andare oltre gli ottimi locali sono detti algoritmi metaeuristici o metaeuristiche. Simulazione Introduzione • Simulare significa fare degli esperimenti che riproducono una situazione reale, la quale magari sarebbe troppo costosa o impossibile da riprodurre in modo controllato. • Esempi: simulatori di volo; simulazione di terremoti; simulazione del clima o della crescita di una popolazione;…. Introduzione • Si distingue in due diversi modi di simulazione: – Nel primo la funzione obiettivo del modello non è esprimibile analiticamente, perciò si fa una serie di prove cambiando le condizioni, vedendo a che risultati porta. – Nel secondo invece i dati sarebbero talmente tanti da essere impossibili da raccogliere, perciò si conducono numerosi esperimenti usando dati casuali (generati col metodo Montecarlo). Simulazione • Esempio 1: volendo reinserire il lupo nei boschi si desidera ottenere informazioni su come si potrebbe sviluppare la popolazione. Definiamo: – n= num. di nuovi nati (da 0 a 1 anno) – p=num. di giovani esemplari (da 1 a 2 anni) – s=num. di esemplari adulti (sopra i 2 anni) • Indichiamo con N, P, S rispettivamente i nuovi nati, i giovani e gli adulti dell’anno successivo. Simulazione • Esempio 1: i fattori che influiscono sono i seguenti: – Gli esemplari da 1 anno in su contribuiscono all’incremento con 2 lupetti ciascuno. – I nuovi nati hanno una chance di sopravvivere del 50%. – I giovani hanno una chance del 55% di essere in vita l’anno successivo. – Gli adulti hanno una chance del 60% di essere in vita l’anno successivo. Simulazione • Esempio 1: il numero di esemplari dell’anno successivo possono essere calcolati rispetto a quelli dell’anno precedente: N 2 ( p s) P 0.5 n S 0.55 p 0.6 s Simulazione • Esempio 1: Simulazione • Esempio 2: vedi simulazione in Scilab del lancio del dado fornito dal docente. Simulazione • Nel secondo tipo di simulazioni abbiamo detto invece che si necessita di generare dei valori a caso che si distribuiscono in teoria come il fenomeno studiato. • Ma come fa il calcolatore a produrre dei numeri casuali? Numeri a caso • Per ottenere una sequenza di numeri casuali da 1 a 100 si potrebbe riempire un urna di 100 palline numerate ed estrarne una, leggere il risultato e reinserirla. Quindi ripetere l’operazione. • Una sequenza si considera casuale se i valori sono distribuiti uniformemente, senza addensarsi intorno a zone particolare (es.: pioggia che cade per terra), e non è prevedibile. Numeri a caso Numeri a caso • A volte una sequenza pur essendo distribuita uniformemente può non essere casuale: 3,4,5,6,7,3,4,5,6,7,3,4,5,6,7,3,4,5,6,7,….. • Una sequenza di numeri casuali generati dal calcolatore con un metodo matematico si dice pseudo-casuale (o falso-casuale). Numeri a caso • Tutti i linguaggi di programmazione hanno una funzione per generare numeri casuali. • Di solito tale funzione è basata su metodi detti di congruenza. Vale la funzione recursiva: r0 rk 1 rk mod M dove α,β e M sono numeri naturali; M non è divisibile per i primi due. Metodo Monte Carlo • In realtà è una classe di metodi che prende il nome dalla sede di un famoso casinò, dal fatto in particolare che nei giochi che vi vengono fatti il caso ha una grande importanza. • La capacità di generare numeri pseudo-casuali è perciò qui importantissima. Metodo Monte Carlo • L’idea è quella di studiare il comportamento di un sistema simulandolo attraverso elementi estratti a caso, ma che per un grande numero di prove tendono ad un certo risultato, appunto quello del sistema. • Oppure si può cercare di approssimare un certo numero, per esempio può essere usato per calcolare aree di figure che non si potrebbero calcolare in modo esatto. Metodo Monte Carlo • Esempio 1: calcolo dell’area di un lago. Metodo Monte Carlo • Esempio 1: generiamo punti a caso che cadono nel rettangolo del quale conosciamo l’area. Metodo Monte Carlo • Esempio 1: se quindi conosciamo l’area del rettangolo, che indichiamo con A, allora un’approssimazione dell’area del lago sarà la percentuale dei punti dentro il lago sul totale moltiplicata per A. ALAGO nopunti nel lago o A n punti totale • È chiaro che più alto sarà il numero di punti generati e più accurata sarà l’approssimazione. Metodo Monte Carlo • Esempio 2: Un azienda “pony-express” ha raccolto i dati sulla spedizioni di pacchi in base ai giorni della settimana, e ha raccolto le medie giornaliere e gli scarti tipo. Lunedì Martedì Mercoledì Giovedi Venerdi Sabato Media 480 400 350 440 380 450 Scarto 50 43 38 47 35 50 Metodo Monte Carlo • Esempio 2: a partire da questi dati, si ha a disposizione un modello sul quale eseguire una simulazione su diverse settimane (più sono e più lo scenario si avvicinerà alla realtà). • Per esempio con Scilab si può generare dei valori a caso ma che abbiano come valore medio e scarto tipo i valori che decidiamo noi. Scilab: comando “grand” • Per generare una matrice mxn di valori in un intervallo da A a B in modo uniforme si usa: --> grand(m, n, “unf”, A, B) • Se poi si vogliono numeri interi allora si può usare “uin” invece che “unf”. Scilab: comando “grand” • Ad esempio: -->R=grand(200,1,"unf", 1, 10); -->histplot(10,R) Scilab: comando “grand” • Per generare invece una matrice mxn di valori con una distribuzione normale (o gaussiana) con media A e deviazione standard B si scrive: --> grand(m, n, “nor”, A, B) Scilab: comando “grand” -->R=grand(200,1,"nor", 12, 1.5); -->histplot(10,R) Scilab: comando “grand” • Ci sono diverse altre distribuzioni di dati possibili: – Esponenziale: “exp” – Binomiale: “bin” – Poisson: “poi” – ….