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 è
n2
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”
– ….