La programmazione genetica è un modo per far scrivere al computer programmi per te!
Non pensare a "programmi" come MS Word, pensa a "programmi" come segue:
function(x){ return x*2; }
Questa funzione (o programma), da sola, non ha motivo di esistere. Siamo alla ricerca di soluzioni ai problemi. Se hai bisogno di trovare la somma di due numeri, devi solo aprire la calcolatrice e fare i conti. Che cosa succede se qualcuno ti fornisse la seguente tabella e ti chiedesse di capire la relazione tra result
e x
e y
:
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
Questi dati sono i tuoi dati di "allenamento". Il tuo computer utilizzerà questi dati per generare alcune ipotesi, quindi lo testerai con dati reali.
Supponi che non conosci le statistiche e decidi che questo problema è troppo difficile da capire da solo, quindi otterrai il computer per capirlo.
Chiedi al computer di generare casualmente ipotesi selvagge
Hai il computer che genera un milione di risposte e vedi se qualcuno di loro si attacca (indovina ... un milione di volte!). Di seguito è riportato un esempio di un paio di ipotesi:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Potresti saperlo o meno, ma funzioni o programmi possono anche essere rappresentati come alberi, ad esempio la seconda funzione sarebbe:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Puoi farlo sembrare più simile a un albero indentandolo in questo modo (tra l'altro, cerca la notazione polacca inversa e la sintassi lisp ... ma capirai perché rappresenteremo programmi come questo a breve):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
è in cima con due "foglie" di /
e y
. /
stesso ha diversi figli, ecc.)
Ecco perché leggi così tanto sugli "alberi" nella programmazione genetica. In ogni caso, inseriamo i valori di x
e y
in questa funzione e ci dà la risposta ERRATA. Non sorprende però dal momento che abbiamo generato casualmente questo.
Ora decidi di generare un milione di tali soluzioni. Tutti hanno torto. Tuttavia, noti che alcune risposte sono più vicine alla risposta giusta di altre. In altre parole, alcune soluzioni sono più "adatte" di altre. Si noti che il computer non sa cosa sia "giusto" e "sbagliato", quindi è necessario fornire la propria "funzione di fitness". Questa funzione riceve una potenziale soluzione, i dati di allenamento, ed è responsabile di dire al sistema GP quanto "si adatta" questa soluzione. Come puoi immaginare, questa funzione viene eseguita milioni e milioni di volte.
Ciò che rende GP diverso
Ecco cosa rende la programmazione genetica diversa dalle ipotesi selvagge. Decidi di fare un altro giro di milioni di ipotesi; tuttavia, lo fai in modo un po 'più intelligente. Prendi il 10% superiore delle ipotesi (quelle che erano chiuse ai valori reali) e le rendi parte della seconda generazione. Prendi anche molte di queste soluzioni (forse lo stesso 10% ... non ricordo) e decidi di "mescolarle".
Scegli casualmente due soluzioni, scegli casualmente sotto-alberi e inizi a scambiarli. Quindi parte della soluzione A finisce sotto la soluzione B e viceversa: li hai semplicemente "incrociati". Prendi anche alcune soluzioni e semplicemente le "muti" ... prendi un po 'di sottostruttura e "rovinala" un po' (ehi, se la soluzione è terribile, "rovinarla senza motivo" potrebbe effettivamente migliorarla).
Un buon modo di pensare a questo è il seguente: tua mamma e tuo papà hanno determinati attributi: colore dei capelli, altezza, probabilità di malattia, ecc. Tu, come bambino, erediti attributi diversi da entrambi i tuoi genitori. Se entrambi i tuoi genitori fossero atleti olimpici, sarai anche un super atleta, giusto? Bene, biologi, sociologi e persino storici potrebbero contestare questa idea, ma gli informatici non si preoccupano della moralità dell'eugenetica qui. Hanno appena visto un "sistema" fare un ottimo lavoro fornendo soluzioni, quindi hanno deciso di modellarlo nel software.
Se in realtà non corrisponde alla biologia, ma fornisce comunque buone risposte ... molti scienziati informatici dicono collettivamente "qualunque tipo, e grazie per la terminologia". Nota anche che tutti i tuoi fratelli e sorelle e non ESATTAMENTE lo stesso ... anche se hanno gli stessi genitori. Ogni persona ha geni che mutano per qualsiasi motivo (per favore non mostrarlo a un biologo, il punto è capire la motivazione dietro gran parte della terminologia).
Quindi ora stiamo facendo in modo che il computer generi milioni di programmi e ne misuriamo l'idoneità. Le migliori soluzioni sopravvivono alla generazione successiva. Inoltre "mutiamo" e facciamo il cross-over sulla "popolazione" (notate come viene usato il linguaggio della genetica e della biologia). Una volta creata la seconda generazione, la forma fisica viene nuovamente misurata. Poiché questa generazione ha le migliori soluzioni della generazione precedente E abbiamo incrociato e mutato le migliori soluzioni (insieme alla popolazione mediocre - per mantenere la diversità), questa generazione dovrebbe essere almeno un po 'migliore della generazione precedente.
Lo continuiamo per un numero molto elevato di generazioni. Ogni generazione (si spera) fornisce soluzioni sempre migliori, fino a quando non avremo la risposta giusta. Per esempio:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Bene guarda questo, questo è corretto!
(L'ho copiato da http://en.wikipedia.org/wiki/Genetic_programming , che ha anche una rappresentazione grafica di questo albero)
Cianfrusaglie
Ci sono alcuni problemi importanti, come come decidere quali "terminali" ( +, -, *, /, cos, sin, tan
) sono disponibili per il proprio sistema GP, come si scrive la funzione fitness e come il sistema gestisce programmi non sensitivi come (1 + cos)
o (2 / "hello")
(tra molti altri).
È abbastanza noioso evolvere le equazioni. Diventa più interessante se il tuo set di terminali è simile al seguente: (fuoco, rileva il nemico, muoviti, ...) e la tua funzione di fitness misura la tua salute e il numero di cadaveri di mostri marziali.
Ho scritto la maggior parte di questo dalla memoria, ma questa è l'idea di base. Ho fatto qualche GP negli anni del college. Dovresti assolutamente giocarci. Non preoccuparti di comprendere tutta la terminologia, scarica solo alcuni sistemi GP gratuiti, scorri alcuni esempi per farti un'idea e crea i tuoi esempi interessanti (trova relazioni tra diversi set di dati, prova a collegarlo al gioco API, ecc.)