Welche Sprache soll für die genetische Programmierung verwendet werden?


15

Im Rahmen einer Aufgabe muss ich einen genetischen Programmieralgorithmus schreiben , der die Luftschadstoffwerte vorhersagt. Da ich keine Erfahrung habe, kann mir jemand Hinweise auf Vorschläge von Programmiersprachen geben, in denen weiterentwickelte Programme geschrieben werden .

Klarstellung: Ich frage nicht, in welcher Sprache ich den genetischen Algorithmus selbst schreiben werde (da ich die Entscheidung selbst treffen kann), sondern in welcher Programmiersprache die entwickelten Programme erstellt werden sollen.

Mein Ausbilder schlug Lisp vor, aber ich mag diese Idee nicht - erstens musste ich an einer Art abstraktem Syntaxbaum arbeiten, zweitens kann es ein gewaltiges Durcheinander sein, Überkreuzungen an Baumstrukturen zuverlässig vorzunehmen.

Ich würde lieber etwas verwenden , die für die genetische Programmierung wie gewidmet ist Slash / A . SlashA erfordert keine Arbeit an ASTs - Programme im Bytecode sind nur ein Array von Ints, die in jeder erforderlichen Form geändert werden können, da jedes int-Array ein Slash / A-Programm darstellt.

Zusätzliche Bemerkungen:

  • Ich möchte vermeiden, ASTs zu manipulieren!
  • Dieses Problem ist schwer (vielleicht nicht so schwer wie die Vorhersage von Aktienwerten). Dies liegt an der Tatsache, dass wir (höchstwahrscheinlich) nicht genügend Eingabeinformationen haben (es gibt einige versteckte Parameter). Das Erstellen eines Modells mit einer besseren Leistung als das Modell, das den Mittelwert zurückgibt, ist eine Herausforderung (mittlere Modelle haben 35% MAPE), die meisten Modelle haben einen MAPE-Wert von etwa 25%, die besten von 20%.
  • Ich hätte gerne eine Sprache, die Datensätze mit vielen Funktionen verwaltet, mit der Annahme, dass ich nicht sicher bin, welche wichtig sind. (Slash / A hat hier einen Nachteil - in dieser Sprache werden die Eingabefunktionen nacheinander gelesen - so dass einige Funktionen mit größerer Wahrscheinlichkeit verwendet werden).
  • Ich möchte in der Lage sein, dies in Python zu programmieren, daher wären Python-Bibliotheken großartig - aber ich kann Bindungen für C / C ++ erstellen (kein Java, kein Matlab usw.).

Ich bin mir bewusst, dass dies eine Frage der Umfrage ist. Wenn es für eine solche Frage zu früh ist, schließen Sie sie bitte, aber ich bin der Meinung, dass sie spezifisch genug ist.

Antworten:


14

Ihr Schadstoffproblem braucht wahrscheinlich überhaupt keine Sprache. Es sieht eher nach einer symbolischen Regression als nach einem Steuerungsproblem aus. In diesem Fall könnten Sie einfach Standard-Tree-GP mit Features und einigen nützlichen Konstanten als Terminalsatz und relevanten Operatoren im Funktionssatz verwenden. Das GP-System wird irrelevante Funktionen ausschließen, und es gibt Techniken für den Umgang mit sehr großen Datensätzen. Geben Sie im Allgemeinen den kleinsten Funktionssatz an, von dem Sie annehmen, dass er das Problem lösen könnte, und erweitern Sie ihn gegebenenfalls mit Sorgfalt.

Sie müssen sich frühzeitig zwischen Tree und Linear GP entscheiden. Lisp ist Baum, Slash / A ist linear. Lesen Sie beides durch, um die Vor- und Nachteile zu verstehen, aber nach dem, was Sie geschrieben haben, würde ich ein einfaches GP-Baumsystem vorschlagen. Es ist nicht allzu schwer, eigene zu schreiben, aber es gibt bereits Python-Implementierungen. Die folgenden sind für evolutionäre Algorithmen in Python im Allgemeinen, aber nicht alle machen GP und einige sind inaktiv:

  1. PyGressionGP (GP für symbolische Regression in Python) - http://code.google.com/p/pygressiongp/
  2. PyGene - https://github.com/blaa/PyGene
  3. Eine einfache genetische Programmierung in Python - http://zhanggw.wordpress.com/2009/11/08/a-simple-genetic-programming-in-python-4/
  4. Pyevolve - https://github.com/perone/Pyevolve - siehe auch Blog - http://blog.christianperone.com - und diesen Beitrag - http://blog.christianperone.com/?p= 549
  5. esec (Evolutionäre Berechnung in Python) - http://code.google.com/p/esec/
  6. Peach - http://code.google.com/p/peach/
  7. PyBrain (macht viel, nicht nur NN) - http://pybrain.org/
  8. dione - http://dione.sourceforge.net/
  9. PyGEP (Genetic Expression Programming) - http://code.google.com/p/pygep/
  10. deap (Distributed Evolutionary Algorithms) - http://code.google.com/p/deap/

Siehe auch das (kostenlose) Einführungsbuch zu GP der bekannten GP-Autoren Poli, Langdon und McPhee:

Ein Leitfaden zur genetischen Programmierung - http://www.gp-field-guide.org.uk/


Haben Sie Hinweise auf Vor- und Nachteile von Linar und Tree GP?
jb.

Ich habe einige Vergleiche gesehen, aber keine konkreten Referenzen. Sie können sich ansehen, was Banzhaf und Brameier in den 2000er Jahren veröffentlicht haben - sie haben ziemlich viel an linearem GP gearbeitet und 2007, glaube ich, ein Buch über LGP veröffentlicht.
Graham Jones

Hm ... warum vereinigen sich diese Leute nicht?
VonPetrushev

Ich bin mir nicht sicher, was du meinst - warum vereinen sich Baum- und lineare Allgemeinmediziner nicht? Es gibt keine religiöse Kluft, es gibt nur verschiedene Varianten der gleichen Idee (und es gibt auch andere, wie zum Beispiel Gene Expression Progamming (GEP) - gene-expression-programming.com ).
Graham Jones

1
Ich sage nicht, dass Baum-GP böse oder etw ist. Ich wollte nur meine eigene Implementierung rollen, und linear ist so viel einfacher. Ich hatte Python-Prototyp in etwa 4 Stunden von Grund auf neu.
jb.

4

Wenn Sie ein Programm weiterentwickeln, manipulieren Sie wahrscheinlich trotzdem einen Syntaxbaum. Auf diese Weise wird jedes Programm, das Sie entwickeln, automatisch syntaktisch korrekt sein.

Bei der Auswahl einer Sprache sollten Sie zwei Dinge beachten.

  1. Vermeiden Sie Konstrukte auf niedriger Ebene, die dazu führen können, dass das entwickelte Programm bei einigen Daten abstürzt. Zum Beispiel Zeigerarithmetik. Wenn Sie C oder C ++ als Sprache für Ihre weiterentwickelten Programme verwenden, möchten Sie sie möglicherweise auf eine Version ohne Zeigerarithmetik beschränken.
    Ich würde aus ähnlichen Gründen gegen die Assemblersprache stimmen, obwohl virtuelle Maschinen wie die JVM und die CLR Ihnen so etwas wie ein Sicherheitsnetz bieten sollten.
  2. Geeignet für große Datenmengen; Wenn ich Ihre Aufgabe richtig verstehe, müssen die Ausgabeprogramme selbst große Datenmengen bearbeiten.

Möglicherweise möchten Sie eine Zielsprache verwenden, die Sie bereits kennen. Ich bin mit Python selbst nicht vertraut, aber AFAIK erfüllt die oben genannten Kriterien, sodass es eine gute Wahl für Ihre Zielsprache sein sollte.


1
Siehe github.com/arturadib/slash-a --- In dieser Sprache haben Sie keine AST-Manipulation! Das Programm wird als Bytecode-Array dargestellt, und da jedes Array ein korrektes Programm ist, können Sie beliebige genetische Operationen verwenden.
jb.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.