C'est une question d'intérêt général, car je n'essaie pas de résoudre un problème spécifique. J'ai regardé autour de vous pour essayer de trouver des articles qui couvrent cette zone, mais je me débats pour même mettre en place de bonnes termes de recherche. P>
Commençons par ce que je sais: j'ai une éducation de niveau universitaire en AI, y compris la programmation génétique et la classe plus large d'algorithmes évolutifs, même si je n'ai pas beaucoup joué avec eux depuis que je suis diplômé il y a dix ans. Je me demande si ces approches pouvaient être utilisées pour créer du code de machine pour résoudre des problèmes (peut-être x86 ou un ensemble d'instructions "arbitraires"). Pourrions-nous évoluer les algorithmes eux-mêmes, tels que celui qui pourrait calculer des racines carrées ou dessiner des images agréables à l'écran? Un algorithme évolutif pourrait-il être utilisé pour créer compilateurs entiers em> qui créent un code optimisé (pour la taille, la vitesse, etc.)? P>
En outre, j'ai souvent pensé que la programmation génétique ou les algorithmes évolutifs ne sont pas de bonnes preuves de l'évolution des espèces. Les approches de résolution de problèmes impliquant des algorithmes évolutifs semblent toujours avoir besoin d'intelligence les écrites. Comment une personne crée-t-elle un algorithme véritablement évolutif, de telle manière que des résultats véritablement intéressants et surprenants pourraient vraiment se produire? P>
TLDR: L'utilisation d'algorithmes évolutifs peut-elle être utile de créer une sorte de code de machine et existe-t-il des exemples précédents d'algorithmes évolutifs en général em> produisant des résultats vraiment intéressants et surprenants? P>
Nick p>
3 Réponses :
Une chose qui fait évoluer dans la nature du travail est qu'il est très ouvert; Vous devez juste trouver un moyen, de toute façon, de transmettre vos gènes, et il y a tout un spectre de taux de réussite variables. P>
Les programmes, en revanche, devraient faire quelque chose de très spécifique et travaillent généralement ou non. Pour les algorithmes génétiques, de petits changements doivent être capables de contribuer de petites améliorations (ou grandes) afin de grimper dans le paysage de remise en forme. Mais le paysage de remise en forme pour les programmes est horrible. P>
Pour le mettre un autre moyen: il existe un nombre infini de programmes qui "presque" trier une liste qui sont complètement différents em> à partir d'un programme le em> trier une liste, et ne peut donc être transformé en une seule mutation. La plupart des programmes qui sont em> trier une liste se brisent aussi horriblement avec une seule mutation, plutôt que de produire un résultat presque correct, quel que soit ce que cela signifie. Ces combinaisons signifient qu'il est très difficile de produire un tel algorithme (ou tout algorithme) par évolution par de petits degrés progressifs. P>
Au moins, c'est ce que je pense j'ai appris quand j'ai essayé de faire quelque chose de similaire. J'aimerais être prouvé comme mal. P>
En fait, le tri Networks i> (un ensemble prédéfini de comparaisons garanti pour trier les valeurs N code>) figurait parmi les premiers exemples réussi de programmes hautement compétents générés à l'aide de techniques évolutives. Danny Hillis a utilisé une technique évolutive pour générer de très bons réseaux de tri: kk.org/outofControl/ch15 -d.html
Je connais d'au moins une approche appelée Finch qui est une méthodologie pour évoluer Java octet code. Ils ont des présentations et des publications de référence sur leur site. Je pense que le code d'octet est probablement plus facile à évoluer que le code de machine X86 depuis son code pour une machine de pile et non une machine à enregistrer. Les machines d'inscription sont beaucoup plus complexes car vous devez aligner le registre de l'instruction d'écriture avec l'instruction de lecture. Sur une machine de pile, vous appuyez simplement sur une valeur sur la pile et la prochaine opération le lit. P>
CAN GP produire du code exécutable? Sûr! Il suffit d'utiliser lisp. p>
John Koza il y a longtemps, il y a longtemps, vous pouviez utiliser la programmation génétique pour créer des programmes. http://www.genetic-programming.com/johnkoza.html il a écrit 2 livres épais sur le sujet. P>
La raison pour laquelle la plupart des GP a été réalisée dans Lisp est que le code de la machine est extrêmement structuré, il n'est donc pas possible de la cartographie du génome à phénome "Soit 00000 être MOV, que l'00001 soit Jne, etc." Au lieu de cela, vous êtes essentiellement avoir em> travailler avec un codage plus complexe. Les expressions S émergent comme des blocs de construction vraiment évidents. p>
J'ai résolu l'équation quadratique par algorithme génétique ainsi que j'ai lu sur l'algo génétique, vous pouvez également dessiner des images au hasard.
Le code de la machine n'est pas un bon génome brut pour le gaz due au fait que la grande majorité des séquences aléatoires sont intrinsèquement malformées (même courir, sans parler de faire quelque chose d'utile.) Cela ne veut pas dire que le gaz ne peut pas Soyez utilisé pour évoluer le code intéressant, mais vous devez choisir soigneusement la nature du génome (en particulier son interprétation) et la fonction de condition physique que vous souhaitez appliquer. Vous pouvez essayer d'utiliser du code de la machine, mais je suppose que vous auriez des problèmes de convergence sérieux.
Je pense que tout dépend de ce que vous entendez par "Créer un code de machine". Vous pouvez toujours créer un ensemble virtuel d'instructions qui sont compilées ou traduites en code de machine. Prenons par exemple ceci: msdn.microsoft.com/en-us/magazine/cc163934 .aspx (volé de Stackoverflow.com/Questtions/14008/... Bien que strictement parlant, ils compilent c # /. net)
J'ai lu dans certains articles ou un livre sur la production d'expressions optimales - évaluant un code avec le gaz. C'est possible.