Jakiego języka używać do programowania genetycznego

15

W ramach zadania będę musiał napisać algorytm programowania genetycznego , który prognozuje poziomy zanieczyszczeń atmosferycznych. Ponieważ nie mam doświadczenia, czy ktoś może mi wskazać propozycje języków programowania, w których pisane będą programy ewoluujące .

Wyjaśnienie: Nie pytam, w jakim języku będę pisać sam algorytm genetyczny (ponieważ będę mógł sam podjąć decyzję), pytam w jakim języku programowania powinny być tworzone programy ewoluujące.

Mój instruktor zasugerował Lispa, ale nie podoba mi się ten pomysł - po pierwsze musiałbym popracować nad jakimś abstrakcyjnym drzewem składni, po drugie niezawodnie wykonywanie skrzyżowań na strukturze drzewa może być piekłem.

Wolę używać coś, że jest przeznaczony do programowania genetycznego jak slash / A . SlashA nie wymaga pracy na AST-ach. Programy w kodzie bajtowym to tylko tablica liczb całkowitych, które można zmienić w dowolnej niezbędnej wersji, ponieważ każda tablica liczb wewnętrznych reprezentuje jakiś program slash / A.

Dodatkowe uwagi:

  • Chciałbym uniknąć manipulowania AST!
  • Ten problem jest trudny (może nie tak trudny jak przewidywanie wartości zapasów). Wynika to z faktu, że (najprawdopodobniej) nie mamy wystarczającej ilości informacji wejściowych (istnieją pewne ukryte parametry). Stworzenie modelu, który ma lepszą wydajność niż ten, który zwraca średnią, jest nieco wyzwaniem (średnie modele mają 35% MAPE), większość modeli ma MAPE około 25%, najlepiej 20%.
  • Chciałbym mieć język, który zarządza zestawami danych z wieloma funkcjami, przy założeniu, że nie jestem pewien, które są ważne. (Slash / A ma tutaj wadę --- w tym języku funkcje wprowadzania są odczytywane sekwencyjnie --- więc niektóre funkcje będą używane z większym prawdopodobieństwem).
  • Chciałbym móc to zaprogramować w Pythonie, więc biblioteki Pythona byłyby świetne --- ale mogę tworzyć powiązania dla C / C ++ (bez Java, bez Matlaba itp.).

Jestem świadomy, że jest to pytanie ankietowe, więc jeśli jest za wcześnie na takie pytanie, proszę je zamknąć, ale uważam, że jest wystarczająco szczegółowe.

jb.
źródło

Odpowiedzi:

14

Twój problem z zanieczyszczeniami prawdopodobnie wcale nie wymaga dużo języka. Wygląda raczej na regresję symboliczną niż na problem kontrolny, w którym to przypadku można po prostu użyć standardowego drzewa GP, z funkcjami i kilkoma przydatnymi stałymi jako zestawem terminali i odpowiednimi operatorami w zestawie funkcji. System GP usunie niepotrzebne funkcje i istnieją techniki obsługi bardzo dużych zestawów danych. Zasadniczo określ najmniejszy zestaw funkcji, który według Ciebie może rozwiązać problem, i w razie potrzeby rozszerz go ostrożnie.

Musisz wcześnie wybrać między drzewem a liniowym GP. Lisp jest drzewem, Slash / A jest liniowy. Przeczytaj oba, aby zrozumieć zalety i wady, ale z tego, co napisałeś, sugeruję prosty system GP drzewa. Nie jest trudno napisać własne, ale istnieją już implementacje Pythona. Te poniżej są dla algorytmów ewolucyjnych w Pythonie ogólnie, ale nie wszystkie GP i niektóre są nieaktywne:

  1. PyGressionGP (GP dla regresji symbolicznej w Pythonie) - http://code.google.com/p/pygressiongp/
  2. PyGene - https://github.com/blaa/PyGene
  3. Proste programowanie genetyczne w języku Python - http://zhanggw.wordpress.com/2009/11/08/a-simple-genetic-programming-in-python-4/
  4. Pyevolve - https://github.com/perone/Pyevolve - zobacz także blog - http://blog.christianperone.com - i ten post - http://blog.christianperone.com/?p= 549
  5. esec (Evolutionary Computation in Python) - http://code.google.com/p/esec/
  6. Brzoskwinia - http://code.google.com/p/peach/
  7. PyBrain (robi dużo, nie tylko NN) - http://pybrain.org/
  8. dione - http://dione.sourceforge.net/
  9. PyGEP (programowanie ekspresji genetycznej) - http://code.google.com/p/pygep/
  10. deap (rozproszone algorytmy ewolucyjne) - http://code.google.com/p/deap/

Zobacz także (bezpłatną) książkę wprowadzającą na temat GP autorstwa znanych autorów GP Poli, Langdon i McPhee:

Przewodnik po programowaniu genetycznym - http://www.gp-field-guide.org.uk/

Graham Jones
źródło
Czy masz jakieś odniesienia do zalet i wad GP liniowej i drzewnej?
jb.
Widziałem kilka porównań, ale nie mam żadnych konkretnych odniesień. Można spojrzeć na to, co Banzhaf i Brameier opublikowali w 2000 roku - zrobili sporo pracy na liniowym GP i wydali książkę o LGP w 2007 roku.
Graham Jones
Hm ... dlaczego ci ludzie nie jednoczą się?
vonPetrushev
Nie jestem pewien, co masz na myśli - dlaczego drzewka i lekarze liniowi nie łączą się? Nie ma podziału religijnego, są to po prostu różne smaki tego samego pomysłu (i są też inne, takie jak Gene Expression Progamming (GEP) - gen-expression-programming.com ).
Graham Jones
1
Nie mówię, że GP drzewa jest złe czy coś. Chciałem tylko stworzyć własny implementatiom, a liniowość jest o wiele łatwiejsza. Miałem działający prototyp Pythona w około 4 godziny od zera.
jb.
4

Jeśli zamierzasz ewoluować program, prawdopodobnie i tak będziesz manipulował drzewem składni; w ten sposób każdy ewoluowany program będzie automatycznie poprawny składniowo.

Wybierając język, musisz pamiętać o dwóch rzeczach.

  1. Unikaj konstrukcji niskiego poziomu, które mogą spowodować awarię rozwiniętego programu niektórych danych. Na przykład arytmetyka wskaźnika. Jeśli zamierzasz używać C lub C ++ jako języka dla rozwijanych programów, możesz chcieć ograniczyć go do wersji bez arytmetyki wskaźników.
    Z podobnych powodów głosowałbym przeciwko językowi asemblera, chociaż maszyny wirtualne, takie jak JVM i CLR, powinny zapewnić ci coś w rodzaju siatki bezpieczeństwa.
  2. Nadaje się do dużych zestawów danych; jeśli dobrze zrozumiem twoje zadanie, programy wyjściowe będą same musiały manipulować dużymi zestawami danych.

Prawdopodobnie będziesz chciał użyć języka docelowego, który już znasz. Sam nie znam Python, ale AFAIK spełnia powyższe kryteria, więc powinien być dobrym wyborem dla twojego języka docelowego.

SL Barth - Przywróć Monikę
źródło
1
Zobacz github.com/arturadib/slash-a --- w tym języku nie manipulujesz AST! Program jest reprezentowany jako tablica kodu bajtowego, a ponieważ każda tablica jest poprawnym programem, możesz używać dowolnych operacji genetycznych.
jb.