Capitolo 3 Algoritmi Genetici Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici Capitolo 3 3.1 Breve storia della computazione evolutiva 3.1.1 Algoritmi Evolutivi Molti problemi computazionali riguardano la ricerca di una soluzione tra un numero infinito di possibili alternative, tanto che non è proponibile l’idea di valutarle una per una. Alcuni ricercatori hanno osservato che l’evoluzione biologica può essere un’ottima fonte d’ispirazione per chi si propone di risolvere questo genere di problemi. L’evoluzione, infatti, può essere vista come un metodo di ricerca in un insieme di innumerevoli soluzioni possibili: le soluzioni candidate sono tutte le possibili sequenze genetiche, mentre le soluzioni desiderate sono quelle sequenze che danno luogo ad organismi particolarmente adatti al loro ambiente cioè organismi con una forte capacità di sopravvivere e di riprodursi. Col termine generico di Algoritmi Evolutivi si indica una gamma di sistemi di risoluzione dei problemi basati sull’utilizzo del calcolatore affini ai processi evolutivi. Essi comprendono gli Algoritmi Genetici (AG), la Programmazione Evolutiva, le Strategie Evolutive, i Sistemi Classificatori e la Programmazione Genetica [Cerruti, 2002]. In genere gli algoritmi utilizzati nelle varie discipline operano l’individuazione di un massimo o di un minimo globale in uno spazio finito di ricerca sulla base di vincoli sullo spazio delle soluzioni. Da un punto di vista formale possiamo dire che dato un elemento X appartenente a uno spazio cartesiano D ( ∈ N ) e data una funzione: f :D→R (3.1) detta funzione obiettivo, allora la ricerca dell’ottimo globale è la ricerca di un X* che massimizza (o minimizza) tale funzione, cioè 27 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici X * ∈ D e ∀X ∈ D : f ( X ) ≤ f ( X *) (3.2) Fattori come la presenza di più punti di massimo o minimo locale, vincoli sul dominio dello spazio, la non linearità dei vincoli, possono rendere la ricerca molto difficoltosa, per cui il problema non è risolvibile in tempi accettabili. Si fa allora uso degli Algoritmi Evolutivi, tecniche di ricerca parallela euristiche e stocastiche che richiedono tempi di convergenza molto minori. Da qui la distinzione tra i metodi “forti” e quelli “deboli”. I primi sono orientati alla soluzione di un problema specifico, sulla base della conoscenza del dominio particolare e della rappresentazione interna del sistema in esame. I metodi deboli utilizzano poca conoscenza del dominio, non sono orientati a un target specifico ma risolvono una vasta gamma di problemi. Gli Algoritmi Evolutivi sono algoritmi di ricerca euristici, considerati metodi deboli. Tuttavia è stata ultimamente introdotta la nuova tipologia dei metodi deboli evolutivi che hanno inizialmente poca conoscenza del dominio, ma che durante la loro evoluzione acquistano maggiore consapevolezza del problema, implementando alcune caratteristiche dei metodi forti (“intelligenza emergente”). Gli Algoritmi Evolutivi si concentrano sul legame esistente tra genitori e figli. Il processo di ricerca è un ciclo che, a partire da una popolazione iniziale, genera altre soluzioni candidate ed elimina dall’insieme delle soluzioni quelle meno buone. Ad ogni passo del ciclo viene manipolato un intero insieme di soluzioni candidate, dette individui, le quali formano la cosiddetta popolazione. Ogni individuo della popolazione rappresenta una codifica di una soluzione candidata. Su ognuno di essi vengono applicati due operatori genetici, chiamati mutazione ed incrocio, seguendo una certa probabilità [Catallo, 2004]. Ogni individuo ha una certa capacità di risolvere il problema che si sta trattando, misurata per mezzo di una funzione detta fitness. Sulla base della qualità degli individui viene applicato il principio della “riproduzione” e della “sopravvivenza” del più adatto per comporre la generazione successiva. Inizializzazione Mutazione Ricombinazione Selezione Soluzione Figura 3.1: Schema di un Algoritmo Evolutivo 28 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.1.2 Gli Algoritmi Genetici (AG) Tra la fine degli anni ‘50 e l’inizio degli anni ‘60 i ricercatori nel campo del computazione evolutiva cominciarono a interessarsi ai sistemi naturali nella convinzione che potessero costituire un modello per nuovi algoritmi di ottimizzazione per la ricerca della soluzione tra un numero enorme di alternative [Mitchell, 1998]. Gli organismi possono essere considerati ottimi risolutori di problemi, poichè sono in grado di sopravvivere nel loro ambiente, sviluppare comportamenti ed abilità che sono il risultato dell’evoluzione naturale dimostrando di poter interagire con un ambiente mutevole come teorizzato per la prima volta da Charles Darwin nella sua opera “L’origine delle specie” [Darwin, 1864]. L’evoluzione biologica è assimilabile a un metodo di ricerca all’interno di un grandissimo numero di soluzioni, costituite dall’insieme di tutte le sequenze genetiche i cui risultati, le soluzioni desiderate, sono organismi altamente adattati, dotati di forte capacità di sopravvivenza e di riproduzione. L’evoluzione di una specie è regolata quindi da due processi fondamentali: la selezione naturale e la riproduzione che determina la ricombinazione del materiale genetico dei genitori generando un’evoluzione molto più rapida di quella che si otterrebbe se tutti i discendenti contenessero semplicemente una copia dei geni di un genitore, modificata casualmente da una mutazione. Si tratta di un processo ad alto grado di parallelismo: non opera su una specie per volta, ma mette alla prova e cambia milioni di specie in parallelo. L’AG seleziona le soluzioni migliori e le ricombina con diverse modalità affinché esse evolvano verso un punto di ottimo. Il ciclo completo è ripetuto fino al raggiungimento di un dato criterio di arresto. Un Algoritmo Genetico è una tecnica di ricerca stocastica che opera su una popolazione di individui e che codifica le possibili soluzioni di un dato problema [Jiang, 2003]. Gli AG hanno quindi questi punti di forza: W possibilità di risolvere problemi complessi senza basarsi sulla forma delle funzioni obiettivo; W capacità di auto-modificazione in base al mutamento del problema; W capacità di simulare alcuni fenomeni data una struttura e modalità operative affini con quelle dell’evoluzione biologica. 29 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici I primi tentativi di progettazione di strumenti di ottimizzazione, le Strategie Evolutive di Rechemberg e la Programmazione Evolutiva di Fogel, Owens e Walsh, non produssero risultati interessanti, poichè i test di biologia dei primi anni ‘60 mettevano in risalto l’operatore della mutazione, piuttosto che il processo riproduttivo per la generazione di nuovi geni. A metà degli anni ‘60 un progresso significativo fu segnato dalla proposta di John Holland, i cui Algoritmi Genetici sottolinearono per la prima volta l’importanza della riproduzione e dell’evoluzione [Holland, 1992]. L’utilizzo di questi algoritmi oggi è essenzialmente legato alla programmazione dell’intelligenza artificiale in robotica, alla biocomputazione, a particolari problemi di gestione e sistemi di ottimizzazione in ingegneria. 30 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.2 Evoluzione naturale ed artificiale: la terminologia 3.2.1 L’evoluzione naturale La combinazione delle ipotesi darwiniane con la genetica ha dato luogo a principi che costituiscono le basi della genetica delle popolazioni. Le modalità di azione del principio darwiniano della selezione naturale possono essere così riassunte: W la terminologia utilizzata si ispira direttamente agli studi sull’evoluzione naturale e biologica; W una popolazione è definita come un gruppo di individui della stessa specie, che operano e si incrociano nello stesso luogo; W l’evoluzione naturale agisce sul materiale genetico di un individuo e non sulle sue caratteristiche fisiche, il fenotipo. Ogni cromosoma è composto da geni, ognuno dei quali codifica una particolare proteina che determina le caratteristiche specifiche dell’organismo. Le posizioni dei geni all’interno del cromosoma sono dette locus e le diverse configurazioni delle proteine sono dette alleli. La maggior parte degli organismi presentano più di un cromosoma, il cui insieme è detto genoma. Per genotipo si intende l’insieme dei geni del genoma. Il risultato finale dell’evoluzione fetale, cioè l’individuo, è detto fenotipo. Ogni variazione che promuove l’adattamento di un individuo emerge dal patrimonio genetico, non da ciò che i genitori avranno eventualmente appreso durante la loro vita; W la selezione naturale favorisce la riproduzione degli individui che migliorano l’adattabilità all’ambiente mutevole ed elimina gli individui dalla minore potenzialità riproduttiva. Dal punto di vista genetico, la selezione naturale promuove quelle particolari combinazioni genetiche che danno vita a un organismo più efficiente, selezionando il genotipo, non il fenotipo; W la riproduzione (incrocio) è il nucleo centrale del processo evolutivo: la variabilità generazionale di una specie è determinata dalla ricombinazione genica e dalle piccole mutazioni casuali del codice genetico. La variabilità è una condizione essenziale dell’evoluzione; 31 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici W l’evoluzione naturale opera su intere popolazioni attraverso processi ciclici e generazionali determinati esclusivamente dalle contingenze ambientali e dalle interazioni fra i vari organismi. L’evoluzione si basa quindi sui seguenti meccanismi: W mutazione di alleli: fonte primaria di variabilità genetica; W flusso genico: variazione delle frequenze degli alleli, dovuta ai movimenti migratori di alcuni individui, con conseguente introduzione o rimozione di genotipi; W deriva genetica: variazioni imprevedibili nelle frequenza degli alleli nel caso in cui una popolazione abbia un piccolo numero di componenti. 32 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.2.2 L’evoluzione artificiale e il modello di Holland Nella terminologia degli Algoritmi Genetici il cromosoma codifica una soluzione candidata di un dato problema di ricerca. Il modello originario di Holland si basa su una popolazione di n stringhe di bit di lunghezza fissata l (n, l ∈ Ν), generate in modo casuale. Ogni stringa (genotipo) è la codifica binaria di una soluzione candidata (fenotipo). Nei casi in cui la codifica del cromosoma rappresenti direttamente una soluzione candidata, come in alcune applicazioni in cui il cromosoma è una stringa di numeri reali anzichè di bit, anche i termini genotipo e fenotipo possono coincidere. Nelle applicazioni comuni si utilizzano individui a un singolo cromosoma, quindi i termini genotipo, cromosoma e individuo sono equivalenti. Ogni locus in un cromosoma ha due possibili alleli: 0 e 1. Ogni cromosoma può essere pensato come un punto dello spazio di ricerca delle soluzioni candidate. L’AG manipola le popolazioni dei cromosomi e ha bisogno in genere di una funzione di idoneità (una fitness) che assegni un punteggio a ogni cromosoma della popolazione corrente. Questa dipende dal suo grado di capacità di risolvere il problema che si sta trattando. In generale la funzione di fitness si presenta nelle forma seguente: F = f ( x1 , x 2 ,...., x n ) (3.3) Tramite questa funzione, ad ogni genotipo g i della popolazione iniziale P(t = 0) è associato un valore Fi = F ( g i ) che rappresenta la capacità dell’individuo di risolvere il problema dato. Per determinare il valore di adattività, la funzione di fitness riceve in input un genotipo, lo decodifica nel corrispondente fenotipo e lo testa sul problema dato. Una volta conclusa la fase di valutazione degli individui della popolazione iniziale, si genera una nuova popolazione P (t + 1) di nuove n soluzioni candidate applicando gli operatori di selezione, crossover, mutazione e inversione. 33 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.3 Codifica dei problemi per un Algoritmo Genetico Come per tutti i metodi di ricerca, il modo in cui le funzioni candidate sono codificate è uno dei fattori principali del successo di un Algoritmo Genetico. L’ottimizzazione di tali modelli è tipicamente difficoltosa a causa dell’esistenza potenziale dei minimi locali multipli nello spazio di ricerca. Si assume che una possibile soluzione per un problema possa essere rappresentata come un set di parametri (detti geni) i quali sono uniti insieme per formare una stringa di valori (spesso chiamata cromosoma). La maggior parte delle applicazioni usano per codificare le soluzioni candidate stringhe di bit di lunghezza e ordine prefissati. Sono tutt’ora di studio nuovi approcci per ridurre il numero delle funzioni fitness richieste da un GA per l’ottimizzazione dei problemi ([Gantovnik, 2003]). Le aggiunte proposte al GA rendono la ricerca più efficace e veloce migliorando il valore di fitness di generazione in generazione. Le codifiche più comuni sono: W codifiche binarie, cioè le stringhe di bit, sono le più comuni per ragioni storiche. Nei primi studi Holland si concentrò su questo tipo. Sono state studiate numerose estensioni, ma risultano tuttavia innaturali e a volte inutili per molti problemi; W codifiche a più caratteri e a valori reali, per molte applicazioni è più naturale formare i cromosomi con un alfabeto formato da molti caratteri o molti numeri reali. Queste ultime hanno mostrato risultati migliori rispetto alle codifiche binarie; W codifiche ad albero, la popolazione non è costituita da stringhe di bit, ma da programmi che quando vengono eseguiti si evolvono, si combinano, si riproducono o mutano per dar luogo ad altri programmi che costituiscono le soluzioni migliori di un determinato problema. Questi programmi vengono codificati con una struttura ad albero in cui i nodi interni sono funzioni e le foglie sono i simboli terminali del programma. Ogni nodo ha un unico arco entrante, tranne uno particolare, chiamato radice, che non ha archi entranti. Ogni nodo può avere zero o più archi uscenti e i nodi senza archi uscenti sono detti foglie. 34 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici Radice Campo Cammino Sottoalbero Figura 3.2: Codifica ad albero Le codifiche ad albero hanno parecchi vantaggi tra cui il fatto di potersi muovere in spazi di ricerca illimitati. Questa assenza di limiti può anche essere svantaggiosa, gli alberi possono crescere senza controllo, impedendo la formazione di soluzioni candidate strutturate in maniera più gerarchica. Inoltre più gli alberi sono estesi, più risultano di difficile interpretazione. Tuttavia le codifiche ad albero, insieme al miglioramento locale, costituisco due dei metodi che hanno dimostrato miglioramenti notevoli in efficienza di calcolo per i problemi di ottimizzazione, dal momento che utilizzano le informazioni dei punti precedentemente analizzati nelle ricerche successive. L’operatore di crossover è la forza trainante dell’algoritmo: si prendono a caso due sottoalberi da individui selezionati in base alla loro fitness e si ricombinano dando vita a due alberi figli, con parametri che fissano limiti sulla dimensione massima degli alberi della popolazione. Sarà la fitness, penalizzando gli alberi che non rispettano le condizioni, a favorire la crescita di alberi corretti. Il percorso della valutazione della funzione di fitness con l’aiuto dell’albero binario consta in vari passi: dopo che una nuova generazione è stata creata tramite i funzionamenti genetici, è cercato un albero binario per ogni nuova iterazione. Se ciò accade, il valore di fitness è richiamato dall’albero binario senza condurre un’analisi. Altrimenti, la fitness ottenuta è basata su un’analisi esatta. Questa nuova 35 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici struttura ed il relativo valore di fitness allora sono inseriti nell’albero come nuovo nodo [De Lucia, 2001]. Una proprietà rilevante di questa codifica è dovuta alla versatilità dei dati che possono essere richiamati, modificati ed inseriti rapidamente nel processo. Nel GA standard, una nuova popolazione può contenere le proprietà che sono già state incontrate nelle generazioni precedenti, soprattutto verso la conclusione del processo di ottimizzazione. La procedura di memoria elimina la possibilità di ripetere un’analisi che potrebbe essere costosa. L’estensione dello spazio di ricerca (lo spazio di tutte le funzioni che soddisfano la grammatica definita dall’utente) e la minore efficienza della mappatura in memoria della rappresentazione utilizzata fanno sì che la programmazione genetica richieda un elevato carico computazionale e un’elevata occupazione di memoria. Ne segue un utilizzo minore rispetto agli Algoritmi Genetici e la necessità di realizzare un’implementazione parallela di questi algoritmi su ambienti di tipo distribuito. 36 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.4 Parametri degli AG 3.4.1 Selezione Una volta scelta la codifica, la successiva operazione che viene compiuta è la selezione che guida la ricerca verso gli individui migliori che promuovono la convergenza. La selezione dei genitori ha il compito di allocare opportunità riproduttive a ciascun individuo. Questo funzionamento effettua un rapporto tra alta velocità di convergenza e l’alta probabilità di individuazione dell’optimum globale nei problemi complessi [Alba, 2003]. Gli schemi più importanti di selezione usati sono: W metodo proporzionale, all’interno di una popolazione, ad ogni individuo è associata una probabilità di selezione legata alla fitness. L’operatore di selezione genera un numero casuale c ∈ ]1,0[ che determina quale individuo verrà scelto. L’individuo selezionato viene copiato dalla popolazione e introdotto nel cosiddetto mating pool (“piscina di accoppiamento”), dove gli individui migliori hanno molta probabilità di essere copiati più volte, mentre i peggiori potrebbero non essere copiati affatto [Lazzerini, 2002]. Sotto un severo schema di riproduzione, la dimensione della mating pool è uguale a quella della popolazione. Dopo di ciò, coppie di individui vengono tirati fuori “dalla piscina” e fatti accoppiare. Esso è così riempito di n copie degli individui selezionati, al tempo P(t = 0) . Questo viene ripetuto finché lo spazio rimane vuoto. La nuova popolazione è ottenuta con gli operatori di crossover, mutazione e inversione; W metodo della roulette, è il metodo più comune. Ad ogni individuo si assegna una fetta di una ruota di una roulette e la grandezza di questa fetta è proporzionale all’idoneità dell’individuo. La ruota viene azionata N volte, dove N è il numero di individui della popolazione. Ad ogni iterazione, all’individuo prescelto è concesso di essere tra i genitori della generazione successiva. Il metodo può essere implementato in questo modo: sommare i valori attesi di tutti gli individui della popolazione. La somma si indica con T; ripetere N volte le seguenti istruzioni: scegliere un intero casuale r tra 0 e T, passare in rassegna tutti gli individui della 37 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici popolazione, sommando mano a mano i valori attesi, fino a che la somma non è maggiore o uguale a r. L’individuo il cui valore atteso porta la somma sopra questo limite, è prescelto [Mitchell, 1998]; W metodo stocastico universale: con popolazioni relativamente piccole, il numero dei discendenti effettivamente assegnati a ogni individuo spesso si discosta di molto dal valore atteso (con la roulette si potrebbe addirittura assegnare tutti i discendenti all’individuo peggiore). In questo caso si itera una sola volta ma con N puntatori posti a egual distanza che servono per selezionare gli N genitori. 3.4.2 Crossover Il crossover è una metafora della riproduzione in cui il materiale genetico dei discendenti è una combinazione di quello dei genitori, cioè il meccanismo da cui fra tutti gli individui accoppiati sono scambiate informazioni per formare due nuovi individui. All’interno del mating pool sono scelti a caso due individui, detti genitori, e un punto di taglio, detto punto di crossover. L’incrocio è attivato secondo valori scelti di probabilità, che è presa tipicamente intorno a 0,90. Le tecniche di incrocio maggiormente utilizzate sono: W crossover one point: è applicato n/2 volte per ottenere n discendenti in base ad una prefissata probabilità p. Le porzioni di genotipo alla destra del punto di crossover sono scambiate generando due discendenti. Nel caso in cui il crossover non sia applicato, i discendenti coincidono con i genitori [Hasançebi, 2000]; Figura 3.3: Schema di un crossover one point 38 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici W two points crossover: l’incrocio in un punto tratta alcune posizioni in modo preferenziale, poiché i segmenti scambiati tra due genitori contengono sempre gli estremi della stringa. Per ovviare a ciò si usa l’incrocio in due punti in cui si scelgono a caso due posizioni e si scambiano i segmenti compresi; W multi- point crossover fornisce uno scambio disperso di caratteristiche dei genitori tanto più evidente quanti più tagli vengono effettuati; W crossover uniforme prevede che per ogni coppia di genitori si genera una stringa binaria della stessa lunghezza chiamata maschera. Il discendente viene generato copiando il bit del padre o quello della madre a seconda che nella corrispondente posizione della maschera vi sia uno 0 o un 1. 3.4.3 Mutazione Questo operatore è ispirato alla rara variazione di elementi del genoma degli esseri viventi durante l’evoluzione. In base a una probabilità piccola p, viene cambiato il valore dei bit di ogni individuo (da 0 a 1 e viceversa). Figura 3.4: Schema di una mutazione Come in natura, la mutazione aggiunge un “rumore” o una certa casualità all’intera procedura, in modo da assicurare che partendo da una popolazione generata casualmente non vi siano punti dello spazio delle soluzioni che non vengano esplorati. 3.4.4 Inversione In base a una fissata probabilità p, sono scelti casualmente due punti nella stringa che codifica l’individuo e inverte i bit tra le due posizioni. 39 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici Figura 3.5: Schema di un’inversione Su una popolazione iniziale numerosa è difficile stimare quali valori della probabilità di crossover e della probabilità di mutazione daranno le migliori prestazioni. Dipende dal tipo di problema. Generalmente la probabilità di crossover è tra il 60 e l'80%, mentre quella di mutazione oscilla fra 0,1-1%. Se le probabilità che un individuo sia selezionato per la riproduzione sono proporzionali alla sua fitness è probabile che, in seguito a crossover, gli individui migliori vengano ricombinati, con la conseguente perdita del cromosoma migliore. Per evitare ciò e accelerare i tempi di convergenza si può “clonare” l’individuo migliore di una generazione. Attraverso tale tecnica, detta elitismo, mantenendo un alto numero di popolazioni, è possibile clonare più individui nella successiva generazione, mentre per gli altri si procede in modo classico. 40 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.5 Gli altri settori degli Algoritmi Evolutivi 3.5.1 La Programmazione Evolutiva La Programmazione Evolutiva (Evolutionary Programming, EP) è una strategia stocastica di ottimizzazione simile agli AG. Si basa sulla definizione della popolazione, fitness e la selezione dei migliori, ma mentre questi principalmente nei GA cercano di simulare gli operatori di crossover e mutazione come avvengono in natura, la Programmazione Evolutiva si concentra sul legame esistente tra genitori e figli. Il metodo di base consiste in tre passi: scegliere una popolazione iniziale a caso (maggiore è il numero di individui, più velocemente si arriverà alla convergenza); ogni individuo viene copiato in una nuova popolazione e a ciascun figlio viene applicata una mutazione seguendo una certa probabilità; viene calcolato la fitness di ogni individuo e tramite un torneo con selezione stocastica vengono scelte N possibili soluzioni. L’obiettivo degli EP è la previsione della prossima configurazione del sistema, non attraverso l’operatore di crossover (come negli AG), ma affidandosi esclusivamente alla mutazione: la mutazione altera lo stato iniziale, modifica la transizione o cambia uno stato interno. La caratteristica fondamentale di questo tipo di algoritmi è che i figli hanno un comportamento simile a quello dei genitori. 3.5.2 Le Strategie Evolutive Le Strategie Evolutive sono tecniche simili alla precedente, ma sviluppate originariamente per problemi di ingegneria civile e strutturale. La principale differenza consiste nel fatto che nella EP gli individui sono selezionati per la mutazione con una certa probabilità proporzionale alla fitness come accade negli AG, mentre in questo caso gli individui peggiori vengono scartati deterministicamente. Il metodo di ottimizzazione si basa sulla scelta di una strategia che viene poi applicata a una popolazione. Le due principali sono note come Strategia Plus (m+l) e Strategia Comma (m,l). Nel primo caso i genitori possono partecipare alla selezione nella generazione successiva, mentre 41 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici nel secondo solo i figli possono essere selezionati, mentre i genitori muoiono. m rappresenta il numero di individui nella popolazione, mentre l il numero di figli concepiti per ogni generazione. Un individuo nella popolazione consiste di un genotipo che rappresenta un punto nello spazio di ricerca (cioè lo spazio delle possibili soluzioni). A ciascun punto vengono associate: W delle variabili oggetto xi sulle quali verranno applicati gli operatori di crossover e mutazione fino a che non viene raggiunta una soluzione ottima del problema; W delle variabili di strategia Si che determinano la “mutuabilità” di xi. Esse rappresentano la deviazione standard di una distribuzione Gaussiana (0, Si). Con un valore uguale a zero i genitori produrranno in media dei figli simili a loro. Questa strategia funziona perché prima o poi verranno favoriti gli individui che hanno un buon valore della funzione obiettivo e che probabilmente ricombinandosi tra loro formeranno figli migliori. Il valore della funzione obiettivo f(x) rappresenta il fenotipo (fitness) di cui si terrà conto nella selezione. Nella strategia Plus i migliori m individui su (m+l) sopravvivranno e diventeranno genitori nella generazione successiva, mentre nella Comma la selezione avviene solo tra i figli. 3.5.3 I Sistemi Classificatori I Sistemi Classificatori sono operatori che lavorano in un ambiente dal quale ricevono input che classificano secondo una serie di regole dai quali generano output di istruzioni da eseguire. Le istruzioni sono del tipo if...then. 3.5.4 La Programmazione Genetica La tecnica della Programmazione Genetica è simile a quella degli Algoritmi Genetici, ma in questo caso, la popolazione non è costituita da stringhe di bit, ma da programmi che quando vengono eseguiti si evolvono, si combinano, si riproducono o mutano per 42 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici dar luogo ad altri programmi che costituiscono soluzioni migliori di un determinato problema. Questi programmi vengono codificati con una struttura ad albero in cui i nodi interni sono funzioni e le foglie sono i simboli terminali del programma. Lo spazio di ricerca è costituito da tutti i programmi composti dai terminali e dalle funzioni definite per uno specifico problema. La Programmazione Genetica ha un grado di complessità maggiore rispetto agli Algoritmi Genetici, poiché la progettazione richiede la selezione di molti più parametri, come la generazione della popolazione iniziale, l’insieme delle funzioni e terminali di base, il tipo di selezione, la dimensione della popolazione e il numero massimo di generazioni, il criterio di terminazione. L’operatore di crossover è la forza trainante dell’algoritmo: si prendono a caso due sottoalberi da individui selezionati in base alla loro fitness e si ricombinano dando vita a due alberi figli, con parametri che fissano limiti sulla dimensione massima degli alberi della popolazione. Altri operatori, quali la mutazione, la permutazione, l’editing, l’incapsulamento e la decimazione sono usati in casi particolari. Sarà la fitness, penalizzando gli alberi che non rispettano le condizioni, a favorire la crescita di alberi corretti. Se gli Algoritmi Genetici ottimizzano una soluzione definita e parametrizzata dall’utente, e quindi l’ottimizzazione opera sulla rappresentazione dei parametri di una funzione la cui struttura è nota, nella Programmazione Genetica si opera a un livello superiore, poichè l’utente definisce gli elementi di una grammatica (operatori e simboli terminali) utilizzati per generare funzioni che devono evolversi. L’ottimizzazione della fitness consiste allora nella manipolazione del codice stesso delle funzioni e non solo dei parametri. L’estensione dello spazio di ricerca (lo spazio di tutte le funzioni che soddisfano la grammatica definita dall’utente) e la minore efficienza della mappatura in memoria della rappresentazione utilizzata fanno sì che la programmazione genetica richieda un elevato carico computazionale e un’elevata occupazione di memoria. Ne segue un utilizzo minore rispetto agli Algoritmi Genetici e la necessità di realizzare un’implementazione parallela di questi algoritmi su ambienti di tipo distribuito. 43 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.6 Altre tecniche di ricerca Molte tecniche di approccio generale sono state inventate per problemi di ricerca [Cerruti, 2002]. Come i GA, assumono che il problema sia definito da una funzione di fitness, che deve essere massimizzata. Ci sono varie tecniche di ottimizzazione, le più conosciute sono: W metodo del gradiente: si utilizzano le informazioni sul gradiente della funzione per guidare la direzione della ricerca. La funzione deve essere però continua, altrimenti non ne può essere calcolata la derivata. In generale questi metodi sono detti di hillclimbing (scalata) e nel caso di funzioni con un solo picco (unimodali), meno per funzioni multimodali, non è detto che il primo picco scalato sia il più alto. Nella figura seguente abbiamo un esempio del problema: partendo da un punto a caso X, con movimenti verso l’alto (uphill) è localizzato il massimo B, ma A e C non sono localizzati; Figura 3.6: Schema dell’ hillclimb W ricerca casuale: l’approccio è una ricerca casuale o enumerata. I punti nello spazio di ricerca sono scelti a caso o in qualche maniera sistematica, e il loro valore calcolato; W ricerca Iterata: si combina il metodo del gradiente con quello della Ricerca Casuale, in cui i punti dello spazio di ricerca sono scelti a caso. Trovato il picco, la scalata 44 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici riparte da un altro punto scelto a caso. La tecnica ha il pregio della semplicità e dà buoni risultati con funzioni che ovviamente non hanno molti massimi locali. Tuttavia, poiché ogni prova è isolata, non si ottiene una figura complessiva della forma del dominio e mentre la ricerca casuale progredisce, si continuano ad allocare lo stesso numero di prove sia in regioni dove sono stati trovati alti valori di fitness, sia in regioni con basso valore di fitness. Un Algoritmo Genetico, invece, opera a partire da una popolazione iniziale casuale e compie tentativi nelle regioni con più alto fitness. Potrebbe essere uno svantaggio se il massimo si trova in una piccola regione circondata da regioni con basso fitness. Ma questo tipo di funzione è difficilmente ottimizzabile con qualsiasi metodo; W Simulated Annealing (temperatura simulata): è una versione modificata dell’hillclimbing. Iniziando da un punto scelto a caso nel dominio, viene fatto un movimento casuale: se questo porta a un punto più alto allora è accettato, se ci porta ad un valore più basso è accettato con una probabilità p(t), dove t è il tempo. All’inizio il valore di p(t) è vicino a 1, ma tende gradualmente a zero. Inizialmente ogni movimento è accettato, ma la “temperatura” si riduce e la probabilità di accettare un movimento negativo diminuisce. A volte i movimenti negativi sono necessari per evitare massimi locali, me se sono troppi possono allontanarci dal massimo. In generale, questa tecnica lavora con una sola soluzione candidata per volta, non costruisce una figura complessiva dello spazio di ricerca e non sono salvate le informazioni dei precedenti movimenti per guidarci verso la soluzione [Catallo, 2004]. 45 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici 3.7 Vantaggi e svantaggi degli AG Una prima distinzione degli AG, rispetto alle normali procedure di ricerca ed ai più classici algoritmi d’ottimizzazione numerica, può essere fatta sulla base delle seguenti motivazioni: W svolgono ricerche all’interno di una popolazione di punti di una regione dello spazio di ricerca e non nel singolo punto; W le leggi che regolano il passaggio da un punto all’altro del dominio (regole di transizione) sono di tipo probabilistico e non deterministico; W valutano le informazioni contenute direttamente nella funzione obiettivo e non le derivate parziali o altre conoscenze ausiliarie; W lavorano con una codifica dei parametri e non con i parametri in sé e per sé. L’Algoritmo Genetico sfrutta le regioni ”bersaglio” dello spazio delle soluzioni, poiché in generazioni successive, attraverso la riproduzione ed il crossover, aumenta progressivamente il numero delle stringhe che si trovano in quelle regioni [Cavanna, 2004]. In un normale problema di statistica, in cui sono applicati opportuni algoritmi matematici (un esempio sono i metodi di Montecarlo), si dovrebbero valutare decine di campioni tratti da migliaia o milioni di regioni per ottenere il valore adattivo di ciascuna di queste. L’Algoritmo Genetico invece riesce ad ottenere lo stesso risultato con un numero di stringhe di gran lunga inferiore. Questo sorprendente comportamento è dovuto al fatto che una singola stringa appartiene a tutte le regioni in cui appare almeno qualcuno dei suoi bit. Per esempio, la stringa [11011001] appartiene alle regioni 11******, 1******1, **0**00* 46 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici e così via, dove il segno di asterisco indica che il valore di un bit non è specificato. Le regioni più grandi, quelle cioè con un numero elevato di bit non specificati, saranno rappresentate da una elevata percentuale di tutte le stringhe di una popolazione. Così, un Algoritmo Genetico che manipola una popolazione di poche migliaia di stringhe, di fatto dispone di campioni di un numero molto più grande di regioni. E’ proprio questo parallelismo implicito, che conferisce all’Algoritmo Genetico il suo vantaggio fondamentale rispetto ad altri procedimenti utilizzati per la risoluzione di problemi, in quanto può esplorare e sfruttare moltissime regioni nello spazio di ricerca, pur manipolando un numero relativamente piccolo di stringhe. Inoltre l’Algoritmo Genetico contribuisce a risolvere un enigma che ha eluso fin qui i metodi convenzionali di risoluzione di problemi. Per localizzare l’ottimo, una solida tecnica di crossover può utilizzare due strategie: esplorazione (exploration) per esaminare le aree dello spazio di ricerca, e sfruttamento (exploitation). Queste richieste sono contraddittorie e un buon algoritmo di ricerca deve trovare un buon compromesso tra le due [Herrera, 1999]. Una ricerca puramente casuale è buona per l’esplorazione, ma non fa nessuno sfruttamento, mentre un metodo puramente di scalata (hillclimb) va bene per lo sfruttamento, ma fa poca esplorazione. La combinazione di queste due tecniche può essere abbastanza efficace, ma è difficile sapere dove si trova l’equilibrio migliore, cioè quanto sfruttamento bisogna fare prima di arrendersi. Holland ha dimostrato che un GA combina le due strategie allo stesso tempo e in un modo ottimale. Sebbene questo sia teoricamente vero, in pratica ci sono problemi inevitabili. Holland infatti ha fatto certe semplificazioni: W la popolazione è infinita; W la funzione fitness riflette accuratamente l’utilità della soluzione; W i geni in un cromosoma non interagiscono significativamente. La prima condizione non può essere mai verificata in pratica e a causa di ciò il funzionamento del GA sarà soggetto ad errori stocastici. Un problema del genere, che si trova anche in natura è quello della deriva genetica (genetic drift). Anche in assenza di qualsiasi pressione di selezione (cioè la funzione fitness è costante), i membri della popolazione continueranno a convergere verso qualche punto nello spazio di ricerca. Questo succede a causa dell’accumulo di errori stocastici. Se un gene diventa 47 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici predominante nella popolazione, allora ha la stessa probabilità sia di diventare più che meno dominante nella generazione successiva. Il tasso di deriva genetica produce un limite inferiore alla velocità con la quale un GA può convergere verso la soluzione corretta. Così, se il GA sta sfruttando l’informazione del gradiente nella funzione fitness, la funzione fitness fornisce un’inclinazione sufficientemente grande per contrastare ogni deriva genetica. Il tasso di genetic drift, può essere anche ridotto introducendo la mutazione. Se la mutazione è troppo elevata, le informazioni del gradiente non possono essere sfruttate adeguatamente. La seconda e la terza condizione possono essere verificate su funzioni test che si comportano bene in laboratorio, ma sono difficili da soddisfare nel mondo reale. Gli Algoritmi Genetici sono particolarmente indicati per quelle regioni del dominio caratterizzate dall’avere parecchi punti di massimo o minimo locali dove quindi il metodo del gradiente facilmente rischierebbe di focalizzarsi su un estremo locale, oppure caratterizzate da zone piatte a gradiente nullo che rendono difficoltosa la ricerca dell’estremo. Figura 3.7: Visualizzazione di una funzione obiettivo 48 Università degli Studi di Pavia Facoltà di Ingegneria Algoritmi Genetici Gli Algoritmi Genetici sono sicuramente il paradigma evoluzionistico più comunemente utilizzato, sia per le caratteristiche della rappresentazione che consente di realizzare implementazioni particolarmente efficienti degli operatori genetici, sia per la quantità di problemi d’ottimizzazione le cui soluzioni possono essere rappresentate in modo immediato ed efficace con stringhe binarie. Considerando le applicazioni dei metodi d’ottimizzazione ai problemi d’ingegneria civile, si può affermare che i più usati sono tradizionalmente quelli di ricerca del gradiente. Con tale approccio esistono difficoltà legate alla scelta di una funzione di costo differenziabile e continua e nel fatto di considerare la non linearità. Comparato con quello del gradiente, il metodo degli Algoritmi Genetici è invece in grado di ottenere un valore ottimale dalla complessa e possibile discontinuità dello spazio delle soluzioni, in quanto la funzione di prestazione di costo è la sola informazione richiesta per questo tipo di problema; infatti gli Algoritmi Genetici non richiedono la riformulazione del problema in una forma più adatta a differenza del metodo del gradiente. Nel campo civile gli AG sono molto utili quando si vogliono identificare i parametri strutturali di un edificio nel quale si evolve un danno. Essi servono, ad esempio, per identificare i valori di smorzamento da introdurre nel modello matematico che si usa per svolgere l’analisi strutturale, ma il problema che si presenta è quello di scegliere una buona funzione di costo in modo da ottenere soluzioni ottimali ed accettabili. 49