La programmation génétique est un moyen pour les ordinateurs d'écrire des programmes pour vous!
Ne pensez pas aux "programmes" comme MS Word, pensez aux "programmes" comme suit:
function(x){ return x*2; }
Cette fonction (ou programme), en soi, n'a pas de raison d'exister. Nous recherchons des solutions aux problèmes. Si vous avez besoin de trouver la somme de deux nombres, il vous suffit d'ouvrir la calculatrice et de faire le calcul. Et si quelqu'un vous donnait le tableau suivant et vous demandait de comprendre la relation entre result
et x
et 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
Ces données sont vos données de "formation". Votre ordinateur utilisera ces données pour générer des hypothèses, puis vous les testerez par rapport aux données réelles.
Supposons que vous ne connaissiez pas les statistiques et décidez que ce problème est trop difficile à résoudre par vous-même, vous obtiendrez donc l'ordinateur pour le comprendre pour vous.
Demandez à l'ordinateur de générer au hasard des suppositions
Vous avez l'ordinateur générer un million de réponses, et voyez si l'un d'eux colle (devinez ... un million de fois!). Voici un exemple de quelques suppositions:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Vous le savez peut-être ou non, mais les fonctions ou les programmes peuvent également être représentés sous forme d'arbres, par exemple, la deuxième fonction serait:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Vous pouvez le faire ressembler davantage à un arbre en l'indentant ainsi (btw, recherchez la notation polonaise inversée et la syntaxe lisp ... mais vous comprendrez pourquoi nous représentons des programmes comme celui-ci sous peu):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
est au sommet avec deux "feuilles" de /
et y
. /
lui-même a plusieurs enfants, etc.)
C'est pourquoi vous lisez tant de choses sur les «arbres» dans la programmation génétique. Dans tous les cas, nous connectons les valeurs de x
et y
à cette fonction et cela nous donne la mauvaise réponse. Pas étonnant cependant, car nous avons généré cela au hasard.
Vous décidez maintenant de générer un million de ces solutions. Ils ont tous tort. Cependant, vous remarquez que certaines réponses sont plus proches de la bonne réponse que d'autres. En d'autres termes, certaines solutions sont plus «adaptées» que d'autres. Notez que l'ordinateur ne sait pas ce qui est "bien" et "mal", vous devez donc fournir votre propre "fonction fitness". Cette fonction reçoit une solution potentielle, les données de formation, et est chargée d'indiquer au système GP à quel point cette solution est «adaptée». Comme vous pouvez l'imaginer, cette fonction est exécutée des millions et des millions de fois.
Ce qui rend GP différent
Voici ce qui rend la programmation génétique différente des suppositions sauvages. Vous décidez de faire une autre série de millions de suppositions; cependant, vous le faites un peu plus intelligemment. Vous prenez les 10% supérieurs des suppositions (celles qui étaient proches des valeurs réelles) et les intégrez à la deuxième génération. Vous prenez également bon nombre de ces solutions (peut-être les mêmes 10% ... je ne me souviens pas) et décidez de les «mélanger».
Vous choisissez au hasard deux solutions, choisissez au hasard des sous-arbres et commencez à les échanger. Une partie de la solution A se retrouve donc sous la solution B et vice versa - vous venez de les «croiser». Vous prenez également des solutions et vous les "mutez" simplement ... prenez un sous-arbre et "vissez-le" un peu (hé, si la solution est terrible, "visser avec elle sans raison" pourrait en fait l'améliorer).
Une bonne façon de penser est la suivante: votre maman et papa ont certains attributs - la couleur des cheveux, la taille, la probabilité de maladie, etc. Si vos deux parents étaient des athlètes olympiques, vous serez également un super athlète, non? Eh bien, les biologistes, les sociologues et même les historiens pourraient contester cette idée, mais les informaticiens ne se préoccupent pas de la moralité de l'eugénisme ici. Ils ont juste vu un "système" faire du bon travail en fournissant des solutions, alors ils ont décidé de le modéliser dans un logiciel.
Si cela ne correspond pas vraiment à la biologie, mais fournit toujours de bonnes réponses ... de nombreux informaticiens disent collectivement "quel que soit le type, et merci pour la terminologie". Notez également que tous vos frères et sœurs et pas exactement les mêmes ... même s'ils ont les mêmes parents. Chaque personne possède des gènes qui mutent pour une raison quelconque (veuillez ne pas le montrer à un biologiste, le but est de comprendre la motivation derrière une grande partie de la terminologie).
Alors maintenant, nous obtenons que l'ordinateur génère des millions de programmes et mesure leur condition physique. Les meilleures solutions survivent jusqu'à la prochaine génération. Nous «mutons» également et faisons des croisements sur la «population» (remarquez comment le langage de la génétique et de la biologie est utilisé). Une fois la deuxième génération créée, la forme physique est à nouveau mesurée. Puisque cette génération a les meilleures solutions de la génération précédente ET que nous avons croisé et muté les meilleures solutions (avec une population médiocre - pour maintenir la diversité), cette génération devrait être au moins un peu meilleure que la génération précédente.
Nous continuons cela pendant un très grand nombre de générations. Nous espérons que chaque génération fournira de meilleures solutions, jusqu'à ce que nous obtenions la bonne réponse. Par exemple:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Eh bien regardez ça, c'est correct!
(J'ai copié ceci depuis http://en.wikipedia.org/wiki/Genetic_programming , qui a également une représentation graphique de cet arbre)
Bouts
Il y a quelques problèmes importants, comme comment décider quels "terminaux" ( +, -, *, /, cos, sin, tan
) sont disponibles pour votre système GP, comment écrire la fonction fitness et comment le système gère-t-il les programmes non sensoriels tels que (1 + cos)
ou (2 / "hello")
(parmi beaucoup d'autres).
C'est assez ennuyeux de faire évoluer des équations. Cela devient plus intéressant si votre ensemble de terminaux ressemble à ceci: (tirer, détecter l'ennemi, se déplacer, ...) et votre fonction de fitness mesure votre santé et le nombre de cadavres de monstres martiaux.
J'ai écrit la plupart de cela de mémoire mais c'est l'idée de base. J'ai fait du GP dans mes années universitaires. Vous devriez certainement jouer avec. Ne vous inquiétez pas de comprendre toute la terminologie, téléchargez simplement des systèmes GP gratuits, parcourez quelques exemples pour vous en faire une idée et créez vos propres exemples intéressants (trouvez des relations entre différents ensembles de données, essayez de le connecter au jeu API, etc.)