Dies ist eine Frage von allgemeinem Interesse, da ich nicht versuche, ein bestimmtes Problem zu lösen. Ich habe mich umgesehen und versucht, Artikel zu finden, die diesen Bereich abdecken, aber ich habe Mühe, auch nur ein paar gute Suchbegriffe zu finden.
Beginnen wir mit dem, was ich weiß: Ich habe eine universitäre Ausbildung in KI, einschließlich genetischer Programmierung und der weiteren Klasse von evolutionären Algorithmen, obwohl ich seit meinem Abschluss vor zehn Jahren nicht viel mit ihnen herumgespielt habe. Ich frage mich, ob diese Ansätze verwendet werden könnten, um Maschinencode zu erstellen, um Probleme zu lösen (vielleicht x86 oder irgendein "beliebiger" Befehlssatz). Könnten wir Algorithmen selbst entwickeln, wie zum Beispiel eine, die Quadratwurzeln berechnen kann, oder schöne Bilder auf dem Bildschirm zeichnen? Könnte ein evolutionärer Algorithmus verwendet werden, um ganze Compiler zu erstellen, die optimierten Code (für Größe, Geschwindigkeit usw.) erzeugen?
Außerdem habe ich oft gedacht, dass genetische Programmierung oder evolutionäre Algorithmen für sich genommen kein guter Beweis für die Evolution der Arten sind. Problemlösungsansätze, die evolutionäre Algorithmen beinhalten, scheinen immer Intelligenz in sie geschrieben zu haben. Wie erstellt man einen wirklich evolutionären Algorithmus, so dass wirklich interessante und überraschende Ergebnisse wirklich auftreten können?
TLDR: Kann die Verwendung von evolutionären Algorithmen jemals nützlich sein, um eine Art Maschinencode zu erstellen, und gibt es frühere Beispiele für evolutionäre Algorithmen im Allgemeinen , die wirklich interessante und überraschende Ergebnisse liefern?
Nick
Eine Sache, die Evolution in der Natur funktionieren lässt, ist, dass sie sehr offen ist; Man muss nur einen Weg finden, um seine Gene weiterzugeben, und es gibt ein ganzes Spektrum unterschiedlicher Erfolgsraten.
Programme dagegen sollen etwas sehr Spezifisches tun und normalerweise funktionieren oder nicht. Für genetische Algorithmen müssen kleine Änderungen in der Lage sein, kleine (oder große) Verbesserungen zu bewirken, um in die Fitness-Landschaft zu klettern. Aber die Fitness-Landschaft für Programme ist entsetzlich.
Um es anders auszudrücken: Es gibt eine unendliche Anzahl von Programmen, die eine Liste "fast" sortieren, die völlig anders ist von einem Programm, das eine Liste sortiert, und kann daher nicht durch eine kleine Mutation zu einer gemacht werden. Die meisten Programme, die eine Liste sortieren, brechen auch schrecklich mit nur einer Mutation, anstatt ein Ergebnis zu produzieren, das fast korrekt ist, was auch immer das bedeutet. Diese Kombination bedeutet, dass es sehr schwierig ist, einen solchen Algorithmus (oder irgendeinen Algorithmus) durch Evolution um kleine graduelle Grade zu erzeugen.
Zumindest habe ich das gelernt, als ich versucht habe, etwas Ähnliches zu tun. Ich würde gerne falsch bewiesen werden.
Kann GP ausführbaren Code erzeugen? Sicher! Verwenden Sie einfach LISP.
John Koza hat vor langer Zeit festgestellt, dass Sie mit genetischer Programmierung Programme erstellen können. Ссылка Er schrieb zwei sehr dicke Bücher zu diesem Thema.
Der Grund dafür, dass der meiste GP in LISP gemacht wurde, ist, dass der Maschinencode extrem strukturiert ist, also ist es nicht möglich, Ihr Genom-zu-Phenom-Mapping zu machen. "00000 sei MOV, 00001 sei JNE, etc." Stattdessen müssen Sie im Grunde mit einer komplexeren Codierung arbeiten. S-Ausdrücke erscheinen als die wirklich offensichtlichen Bausteine.
Ich kenne mindestens einen Ansatz, der FINCH genannt wird, eine Methode, um Java-Byte-Code zu entwickeln. Sie haben einige Präsentationen und Referenzpublikationen auf ihrer Website. Ich denke, Bytecode ist wahrscheinlich einfacher zu entwickeln als x86-Maschinencode, da dieser Code für eine Stapelmaschine und keine Registermaschine ist. Register-Maschinen sind viel komplexer, da Sie das Register des Schreibbefehls mit dem Lese-Befehl ausrichten müssen. Auf einer Stapelmaschine drückt man einfach einen Wert auf den Stapel und die nächste Operation liest es.
Tags und Links x86 genetic-algorithm genetic-programming evolutionary-algorithm