La giraffa e il suo collo: una questione di fascino
Da una ricerca relativamente recente pubblicata su Science sembra che le giraffe abbiano il collo lungo per selezione sessuale, non solo perché si sono allenate a mangiare le foglioline in cima agli alberi come tutti crediamo.
Lo so, anche io quando l’ho scoperto ho pensato ‘La mia vita è una bugia’.
In particolare pare che le giraffe con un collo più lungo risultino favorite nella lotta per l’accoppiamento. E si sa, chi vince fa i figli, e i suoi figli hanno i suoi geni di collo lungo.
Questo è in sintesi il funzionamento dell’evoluzione, ed è anche il motivo per cui moltissimi uccelli hanno colori ridicoli (abbiamo tutti pensato almeno una volta Ma che cavolo di tattica di sopravvivenza è essere visibili a centinaia di metri di distanza?) o – peggio – cose che rendono a dir poco scomodo scappare dai predatori. Vero, pavone?
Ma che c’entra questo con l’ottimizzazione di impianto?
Beh, la strategia che la natura utilizza per selezionare gli individui favoriti si può sfruttare per identificare gli scenari migliori in una simulazione di impianto.
L’algoritmo genetico, quando la natura insegna
In particolare, esiste un algoritmo utile per l’ottimizzazione di scenari e sistemi che sfrutta proprio il meccanismo della selezione naturale.
Si chiama algoritmo genetico, e si ispira al modo con cui i geni si propagano da genitori a figli.
Un ripasso evoluzionistico estremamente accurato
Siamo intorno ai 6-7 milioni di anni fa. I nostri amici giraffoidi vivono una vita felice tirandosi combattendo in giro per le praterie. C’è in particolare una giraffa che ha il collo più lungo, e nel modo specifico di combattere vince più spesso contro gli altri maschi, e ha più probabilità di fare figli.
I suoi figli, più diffusi rispetto a quelli degli altri, ereditano il suo gene di collo più lungo. Come il padre prima di loro, anche i figli nella lotta contro gli altri giraffi vinceranno più spesso. In particolare, chi dei figli del primo giraffo ha sviluppato una mutazione che ha il collo ancora più lungo, avrà una probabilità più alta di fare ancora più figli.
Altre giraffe sono meno fortunate e sviluppano mutazioni che non aiutano – capita. Queste tendenzialmente non arriveranno a fare figli nel duro cerchio della vita.
Man mano che passa il tempo, il gene collo-lungo diventa sempre più preponderante in quanto sempre più spesso giraffe dal collo lungo vinceranno i combattimenti e faranno altri figli. Questo non vuol dire che le giraffe dal collo più corto saranno completamente escluse dai giochi, solo avranno una probabilità peggiore di fare dei figli.
Questa spiegazione è talmente corretta e scientifica che immagino penserete io l’abbia copincollata da Wikipedia, ma giuro che l’ho scritta tutta da sola.
Ottimizzazione come selezione di caratteristiche favorevoli
Cosa succede quindi alle popolazioni di giraffe?
Succede che, man mano che passano le generazioni, le giraffe hanno sempre più probabilità di avere un collo lungo, ed essere più performanti nell’obiettivo finale che in natura è sempre riuscire a generare eredi prima di morire in modo brutale.
Se ampliamo il concetto, si può dire che l’evoluzione seleziona gli individui migliori in base ad un indicatore preciso di performance, e in ultima istanza i geni più performanti in quello specifico obiettivo.
Lo fa avendo milioni di anni a disposizione e testando diverse mutazioni casuali negli eredi. Generazione dopo generazione, le mutazioni più favorevoli sono naturalmente selezionate.
Sapete ad esempio che l’occhio si è selezionato nella sua forma caratteristica tantissime volte in tantissimi animali diversi? Questo è un esempio di evoluzione convergente, perché avere un occhio che ti dice dove stanno i predatori o le prede è un ottimo modo per rimanere vivi più a lungo e fare figli che ereditino quella mutazione favorevole.
Genetica e selezione naturale, in matematichese
Traduciamo il processo di selezione naturale in matematichese, così da poterlo utilizzare per ottimizzare qualsiasi cosa.
Prima di tutto, dobbiamo trovare una rappresentazione dei geni e degli individui, e di come i geni si tramandano generazione dopo generazione.
I geni
Nell’algoritmo genetico, i geni rappresentano una singola variabile.
I geni sono sempre insiemi di 0 e di 1 (gli alleli), posso usare un singolo valore per rappresentare una variabile (se la variabile è ad esempio binaria: o c’è o non c’è), oppure posso usare una combinazione di 0 e di 1 che rappresentano combinati una variabile numerica più complessa (ad esempio un numero continuo). Come l’encoding dei floating point.
Gli individui, le popolazioni, le generazioni
La combinazione di molti geni diversi (e quindi molte variabili diverse) rappresenta un individuo, o cromosoma. Insiemi di individui diversi rappresentano una popolazione.
La generazione è la rappresentazione di una popolazione di figli (children o offsprings) che derivano tutti da genitori (parents) di una stessa popolazione. E’ più complicato da spiegare che da immaginare.
Le mutazioni
Combinando i geni di individui insieme, è possibile generare individui differenti che ereditano una parte di caratteristiche dal genitori 1 e una parte dal genitore 2. Per garantire che si esplorino sempre nuove combinazioni potenzialmente migliori, si introduce sempre una mutazione, ovvero una modifica casuale di un numerello nei geni che influenza tutto il risultato.
Fitness e figliolanza
Per decidere chi è più forte e potrà fare più figli si valuta la fitness, un indicatore che valuta la capacità di un certo individuo nel portare a termine un compito.
La fitness può essere ad esempio la capacità di non cadere, o nel caso delle giraffe, di vincere nei combattimenti.
Chi ha fitness migliori, farà più figli e farà in modo che i suoi geni vincenti si trasmettano di più.
Dove si usa?
Nel deep learning gli algoritmi genetici sono spesso utilizzati per ottimizzare gli iperparametri degli algoritmi, in modo da trovare modelli ottimizzati e super performanti.
E negli impianti?
Facciamo conto quindi di trattare il nostro sistema allo stesso modo. Vogliamo ottimizzare un impianto di cottura che prevede una prima parte di impasto, una seconda di essiccazione e una terza di cottura in forno.
Ci sono 4 setpoint che possono essere regolati, vogliamo trovare la regolazione che minimizza il consumo di energia massimizzando la qualità del prodotto. Come facciamo?
Funzione obiettivo
Prima di tutto, abbiamo identificato l’obiettivo: minimizzare il consumo. Traduciamo questo obiettivo in matematichese: consumo di gas per forno ed essiccatore per costo del gas, consumo dell’impastatrice per costo dell’energia elettrica, volume di scarto prodotto per mancato guadagno da scarto. Questa diventa la nostra fitness, che deve essere minimizzata.
Modelli di simulazione
A questo punto, creiamo una serie di modelli di previsione data-driven che possano rappresentare il consumo di gas del forno e dell’essiccatore, l’assorbimento dell’impastatrice e il volume di scarti in base ai dati che avrò domani. Cosa avrò domani? Sicuramente i piani di produzione, le ricette, il forecast meteo. In più, possiamo ipotizzare le regolazioni dei 4 setpoint delle macchine, che quindi inseriamo nella lista degli input.
I modelli stimano quindi il consumo di gas dei due componenti, il consumo di energia elettrica e il volume di scarto in base a come regolo i 4 setpoint e alle condizioni al contorno (ad esempio temperatura o umidità prevista, ricetta e così via).
Senza modelli non posso valutare la mia fitness. I modelli in particolare simulano il sistema in diverse condizioni operative, quelle che verranno ottimizzate dall’algoritmo genetico
I vincoli
Nella regolazione di impianto, ci sono alcuni scenari che non si possono percorrere: non posso accendere il forno a 670°C se il suo massimo è 550°C, non posso accendere e spegnere l’essiccatore 4 volte all’ora perché si romperebbe il sistema, e una volta che l’impastatrice è accesa deve fare un ciclo completo di due ore.
Si definiscono quindi tutti i vincoli di impianto, in modo che gli scenari simulati si possano escludere quando non garantiscono questi vincoli.
L’algoritmo genetico
L’ultimo pezzetto è un algoritmo genetico, che copia dalla natura il modo con cui vengono selezionati gli individui migliori come abbiamo visto nel paragrafo sopra.
Prima di tutto, ogni setpoint diventa un gene, ogni combinazione di setpoint diversi un individuo. Ci sono individui con combinazioni di geni migliori, che quindi fanno migliorare l’obiettivo, e valori peggiori, che ci allontanano dall’obiettivo. Ci sono poi combinazioni di geni vietate, perché rompono uno o più vincoli.
Ottimizziamo!
Generazione 0. L’ottimizzatore crea un numero di individui N, con delle combinazioni casuali dei geni (i setpoint). Per ognuno di questi, calcola la funzione obiettivo. Più la funzione obiettivo è buona, più probabilità di fare figli avrà quell’individuo.
Generazione 1. L’ottimizzatore crea un secondo pool di individui dalla combinazione di individui della generazione precedente, selezionati in base alla probabilità associata prima. Più gli individui avevano geni buoni – setpoint che abbassano il costo globale del processo – , più probabilità hanno di essere selezionati.
Gli individui con i migliori setpoint e le funzioni di costo più basse faranno molti eredi, che erediteranno i buoni geni e li modificheranno con mutazioni casuali come hanno fatto le nostre giraffe. Cosa sono le mutazioni casuali? Semplificando tantissimo, sono lievi variazioni ai valori dei geni – che rappresentano i setpoint.
Generazione 2. Di nuovo, agli individui generati si associa una probabilità di fare figli, e di nuovo gli individui che spingono in giù il costo complessivo che è la nostra funzione obiettivo vincono. Questi individui non saranno copie del loro genitori, ma saranno quegli individui le cui mutazioni hanno sono ancorappiù migliori per il raggiungimento dell’obiettivo.
Dalla generazione 3 in poi il gioco si ripete. Man mano che il tempo passa, il sistema identificherà una strada da percorrere per trovare i geni che minimizzano la funzione obiettivo, in questo caso il costo del processo. La strada si interrompe quando la funzione obiettivo, invece di continuare a scendere, comincia a risalire. Si è raggiunto un minimo.
Perchè usare un algoritmo genetico?
Il funzionamento dell’algoritmo genetico, che cerca un minimo o un massimo, è simile ad altri sistemi più semplici e veloci, di steepest descent o hill climbing (a seconda se cercano un minimo o un massimo).
La differenza fondamentale, che li rende più solidi e interessanti, è che l’algoritmo genetico fa una ricerca globale su tutte le combinazioni potenzialmente utili, e riesce a trovare il minimo globale invece che locale. Questo ci garantisce una migliore performance e soluzioni più stabili nel tempo
Come le giraffe
Quindi, i meccanismi di selezione naturale che hanno fatto allungare il collo alle giraffe possono essere sfruttati per trovare la combinazione di setpoint migliore per minimizzare il costo o massimizzare la qualità di un processo.