Gli algoritmi genetici rappresentano uno dei tentativi più affascinanti compiuti dall’informatica moderna: trasformare il principio biologico dell’evoluzione in un metodo di calcolo. Introdotti da John Holland nella seconda metà del Novecento, questi sistemi appartengono all’area dell’ottimizzazione evolutiva e si fondano su un’idea tanto semplice quanto profonda: invece di costruire direttamente una soluzione, si lascia che essa emerga attraverso un processo di selezione, mutazione e adattamento.
In altre parole, non si programma il risultato finale in modo rigido. Si crea piuttosto un ambiente competitivo nel quale molte possibili soluzioni convivono, si modificano, falliscono, sopravvivono o si combinano tra loro. È un approccio che richiama in modo quasi speculare i meccanismi descritti dalla teoria della selezione naturale.
La teoria evolutiva prevede infatti alcuni concetti chiave che è utile ricordare.
Il primo è la variazione. Negli organismi viventi esistono differenze ereditarie continue tra individui: mutazioni genetiche, ricombinazioni, alterazioni casuali che introducono nuove possibilità biologiche. Senza variazione, l’evoluzione sarebbe immobile, incapace di esplorare strade differenti.
Vi è poi l’ereditarietà: i tratti vantaggiosi tendono a trasmettersi alle generazioni successive. Una caratteristica utile non rimane confinata al singolo individuo ma si propaga lentamente all’interno della popolazione.
Infine interviene la selezione naturale. I tratti che aumentano la fitness — cioè la capacità di sopravvivere e riprodursi — diventano progressivamente più frequenti, mentre quelli svantaggiosi tendono a dissolversi nel tempo.
Ma la natura introduce anche un elemento spesso trascurato: nessun tratto è vantaggioso in senso assoluto. Ogni caratteristica dipende dal contesto. Un pelo folto rappresenta un vantaggio nelle regioni fredde, ma può diventare un peso in un clima caldo. Una grande massa corporea può essere utile in certi ecosistemi e disastrosa in altri. L’evoluzione non produce perfezione universale; produce adattamento locale.
Questa stessa architettura concettuale riappare, in forma astratta, negli algoritmi genetici.
Qui gli individui non sono organismi biologici ma soluzioni candidate a un problema. Ogni soluzione viene rappresentata come una sequenza di parametri, spesso chiamati “geni”, che descrivono una possibile configurazione del sistema.
La variazione è introdotta tramite mutazione — piccole modifiche casuali dei parametri — e tramite crossover, cioè la combinazione di porzioni appartenenti a soluzioni differenti. Due “individui” computazionali possono quindi generare una nuova soluzione erede, contenente caratteristiche provenienti da entrambi.
L’ereditarietà emerge dal fatto che le soluzioni più efficaci contribuiscono maggiormente alla generazione successiva, trasmettendo parte della propria struttura. La selezione naturale viene invece sostituita da una funzione matematica detta fitness function: essa valuta quanto una soluzione sia adatta rispetto all’obiettivo richiesto.
Le soluzioni migliori hanno maggiore probabilità di essere mantenute e replicate; quelle peggiori vengono progressivamente eliminate.
Anche in questo caso i “tratti” sono condizionali. Una soluzione non è buona in senso assoluto, ma solo rispetto ai vincoli e alla funzione obiettivo del problema considerato. Cambiando il contesto, cambia immediatamente ciò che viene considerato vantaggioso.
È proprio qui che emerge il fascino teorico degli algoritmi genetici: essi non cercano direttamente la perfezione, ma simulano un processo di adattamento continuo. La soluzione finale non viene progettata in modo esplicito; emerge gradualmente dall’interazione tra casualità e selezione.
In sintesi, gli algoritmi genetici replicano il meccanismo evolutivo in forma computazionale: popolazioni di soluzioni evolvono iterativamente, guidate da variazione, selezione e adattamento al contesto, fino a convergere verso configurazioni sempre più efficaci.
Tuttavia, nonostante il loro valore concettuale e la loro eleganza teorica, oggi gli algoritmi genetici occupano una posizione relativamente marginale rispetto ad altre tecniche dell’intelligenza artificiale moderna.
I GA vengono ancora utilizzati in problemi di ottimizzazione complessa, progettazione automatica, ricerca combinatoria e in scenari nei quali lo spazio delle soluzioni è difficile da esplorare con metodi tradizionali. Ma i grandi sistemi contemporanei — inclusi modelli linguistici come OpenAI GPT — si basano prevalentemente su deep learning e gradient descent.
Il motivo è soprattutto tecnico.
Gli algoritmi genetici effettuano una ricerca globale stocastica: sono robusti, flessibili e capaci di esplorare regioni molto ampie dello spazio delle soluzioni, ma risultano spesso estremamente costosi dal punto di vista computazionale. Il training di reti neurali profonde su larga scala richiederebbe tempi e risorse proibitive se affrontato tramite meccanismi evolutivi puri.
La backpropagation, al contrario, permette un aggiornamento diretto ed efficiente dei parametri, rendendo possibile l’addestramento di modelli con miliardi di connessioni.
Eppure, nonostante la loro minore centralità pratica, gli algoritmi genetici continuano a custodire qualcosa di straordinariamente attuale. Essi ricordano che l’intelligenza non nasce sempre da una progettazione lineare e deterministica. Talvolta emerge dal caos controllato, dall’errore, dalla competizione, dalla capacità di tentare infinite variazioni finché alcune, quasi accidentalmente, iniziano a funzionare meglio delle altre.
In fondo, l’evoluzione biologica e quella computazionale condividono la stessa intuizione fondamentale: non è necessario conoscere in anticipo la forma perfetta delle cose. È sufficiente creare le condizioni perché possano trasformarsi, adattarsi e sopravvivere.
Ed è forse proprio qui che risiede una delle idee più profonde della modernità tecnologica: la scoperta che anche le macchine, in certi casi, possono imparare non attraverso istruzioni assolute, ma attraverso un lento processo di selezione, errore e trasformazione.