Quel langage utiliser pour la programmation génétique


15

Dans le cadre d'une mission, je devrai écrire un algorithme de programmation génétique qui fait la prédiction des niveaux de polluants atmosphériques. Comme je n'ai aucune expérience, quelqu'un peut-il m'indiquer des propositions de langages de programmation dans lesquels des programmes évolués seront écrits .

Clarification: je ne demande pas quel sera le langage, j'écrirai l'algorithme génétique lui-même (car je pourrai prendre la décision moi-même), je demande dans quel langage de programmation les programmes développés devraient être créés.

Mon instructeur a suggéré Lisp, mais je n'aime pas cette idée --- d'abord, je devrais travailler sur une sorte d'arbre de syntaxe abstraite, deuxièmement, faire des croisements de manière fiable sur la structure de l'arbre peut être un sacré bordel.

Je préfère utiliser quelque chose qui est dédié à la programmation génétique comme barre oblique / A . SlashA ne nécessite pas de travailler sur les AST - les programmes en bytecode ne sont qu'un tableau d'entiers qui peuvent être modifiés à tout moment car chaque tableau int représente un programme slash / A.

Remarque additionnelle:

  • Je voudrais éviter de manipuler les AST!
  • Ce problème est difficile (peut-être pas aussi difficile que de prévoir les valeurs des stocks). Cela est dû au fait que (très probablement) nous n'avons pas assez d'informations d'entrée (il y a des paramètres cachés). Créer un modèle qui a de meilleures performances que le modèle qui renvoie la moyenne est un peu difficile (les modèles moyens ont 35% de MAPE), la plupart des modèles ont MAPE d'environ 25%, mieux 20%.
  • J'aimerais avoir un langage qui gère les jeux de données avec de nombreuses fonctionnalités en supposant que je ne suis pas sûr de ceux qui sont importants. (Slash / A a un inconvénient ici --- dans ce langage, les fonctionnalités d'entrée sont lues de manière séquentielle --- donc certaines fonctionnalités seront utilisées avec une plus grande probabilité).
  • J'aimerais pouvoir programmer cela en Python, donc les bibliothèques python seraient géniales --- mais je peux faire des liaisons pour C / C ++ (pas de Java, pas de Matlab, etc.).

Je suis conscient qu'il s'agit d'une question d'enquête, donc si elle est trop tôt pour une telle question, veuillez la fermer, mais je pense qu'elle est suffisamment précise.

Réponses:


14

Votre problème de polluant n'a probablement pas besoin du tout d'une langue du tout. Cela ressemble à une régression symbolique plutôt qu'à un problème de contrôle, auquel cas vous pouvez simplement utiliser un GP d'arbre standard, avec des fonctionnalités et quelques constantes utiles comme ensemble de terminaux et opérateurs pertinents dans l'ensemble de fonctions. Le système GP éliminera les fonctionnalités non pertinentes et il existe des techniques pour gérer de très grands ensembles de données. En règle générale, spécifiez le plus petit ensemble de fonctions qui, selon vous, pourrait résoudre le problème et développez-le avec soin si nécessaire.

Vous devrez choisir entre l'arbre et le GP linéaire très tôt. Lisp est un arbre, Slash / A est linéaire. Lisez les deux pour comprendre les avantages et les inconvénients, mais d'après ce que vous avez écrit, je suggérerais un système GP d'arbre simple. Il n'est pas trop difficile d'écrire le vôtre, mais il existe des implémentations Python existantes. Ceux-ci ci-dessous sont pour les algorithmes évolutionnaires en Python en général, mais pas tous GP et certains sont inactifs:

  1. PyGressionGP (GP pour la régression symbolique en Python) - http://code.google.com/p/pygressiongp/
  2. PyGene - https://github.com/blaa/PyGene
  3. Une programmation génétique simple en Python - http://zhanggw.wordpress.com/2009/11/08/a-simple-genetic-programming-in-python-4/
  4. Pyevolve - https://github.com/perone/Pyevolve - voir aussi blog - http://blog.christianperone.com - et cet article - http://blog.christianperone.com/?p= 549
  5. esec (calcul évolutif en Python) - http://code.google.com/p/esec/
  6. Peach - http://code.google.com/p/peach/
  7. PyBrain (fait beaucoup, pas seulement NN) - http://pybrain.org/
  8. dione - http://dione.sourceforge.net/
  9. PyGEP (programmation d'expression génétique) - http://code.google.com/p/pygep/
  10. deap (algorithmes évolutionnaires distribués) - http://code.google.com/p/deap/

Voir également le livre d'introduction (gratuit) sur le GP par les auteurs bien connus du GP Poli, Langdon et McPhee:

Un guide de terrain pour la programmation génétique - http://www.gp-field-guide.org.uk/


Avez-vous des références aux avantages et aux inconvénients du linar et de l'arbre GP?
jb.

J'ai vu quelques comparaisons mais je n'ai pas de références concrètes. Vous pouvez regarder ce que Banzhaf et Brameier ont publié dans les années 2000 - ils ont fait pas mal de travail sur le GP linéaire et publié un livre sur LGP en 2007 je pense.
Graham Jones

Hm ... pourquoi ces gens ne s'unissent-ils pas?
vonPetrushev

Je ne sais pas ce que vous voulez dire - pourquoi les gens d'arbre et de GP linéaire ne s'unissent-ils pas? Il n'y a pas de clivage religieux, ce ne sont que des saveurs différentes de la même idée (et il y en a aussi d'autres, comme Gene Expression Progamming (GEP) - gene-expression-programming.com ).
Graham Jones

1
Je ne dis pas que l'arbre GP est mauvais ou qc. Je voulais juste lancer ma propre implémentation, et linéaire est tellement plus facile. J'avais un prototype de Python en 4 heures à partir de zéro.
jb.

4

Si vous allez faire évoluer un programme, vous êtes de toute façon susceptible de manipuler un arbre de syntaxe; de cette façon, quel que soit le programme que vous développez sera automatiquement syntaxiquement correct.

Il y a deux choses à garder à l'esprit lors de la sélection d'une langue.

  1. Évitez les constructions de bas niveau qui peuvent entraîner le blocage du programme évolué sur certaines données. Par exemple, l'arithmétique des pointeurs. Si vous allez utiliser C ou C ++ comme langage pour vos programmes évolués, vous pouvez le restreindre à une version sans arithmétique de pointeur.
    Je voterais contre le langage d'assemblage pour des raisons similaires, bien que les machines virtuelles comme la JVM et le CLR devraient vous fournir quelque chose d'un filet de sécurité.
  2. Convient aux grands ensembles de données; si je comprends bien votre affectation, les programmes de sortie devront eux-mêmes manipuler de grands ensembles de données.

Vous souhaiterez probablement utiliser une langue cible que vous connaissez déjà. Je ne connais pas moi-même Python, mais AFAIK il répond aux critères ci-dessus, il devrait donc être un bon choix pour votre langue cible.


1
Voir github.com/arturadib/slash-a --- dans cette langue, vous n'avez aucune manipulation AST! Le programme est represetned comme un tableau de bytecode et comme chaque tableau est un programme correct, vous pouvez utiliser toutes les operations genetiques que vous voulez.
jb.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.