1

Ich möchte einen genetischen Algorithmus implementieren, der Programme schreibt und versucht, ein bestimmtes Problem zu lösen.Genetischer Algorithmus in .Net - Variable Chromosomen - Alien Spaceship Scenario

Das 'Programm' ist nicht mehr als eine Liste von Funktionen, die von einer Fitness-Funktion ausgewertet werden, damit ich wissen kann, was das beste 'Programm' ist. Die Reihenfolge ist für mich nicht relevant, beeinflusst die Fitnessbewertung nicht.

Die BIG CATCH, die ich ist, um herauszufinden, dass ich versuche, die so genannte Liste der Funktionen variabel sein sollte, wie eine Variable cromossomes Nummer. Ich habe Funktionen, die aufgerufen werden müssen, mit variablen Parametern und Funktionen, die COULD (optional) aufgerufen werden können, auch mit variablen Parametern.

Ich fand schon das große GA-Frameworks, aber ich bin wirklich neu zu genetischer Programmierung, und ich weiß nicht, was der beste Rahmen für dieses Problem zu verwenden ist:

also vorstellen, dieses Problem:

  • In einem offenen Feld, wie ein 2D-Raum, eine Alien Raumschiff Notwendigkeit von Punkt A nach Punkt B in der kürzesten möglichen Zeit zu gehen. Aber das Programm weiß nicht, wo Punkt B ist.
  • Sie können sich das offene Feld als ein Gitter vorstellen, wie ein Schachbrett, aber größer (100X100).
  • Das offene Feld kann Hindernisse haben. Das Raumschiff sollte versuchen zu vermeiden.
  • Das Programm muss einige Funktionen, wie das Modell des Raumschiffs wählen und mit Gas füllen.
  • Dann kann das Raumschiff Funktionen wie gehen vorne, hinten, links und rechts ausführen.
  • Das Raumschiff kann auch Hyper-Geschwindigkeit verwenden, die wie ein Transport zu einem beliebigen Punkt im Raster funktioniert.
  • Die optionalen Funktionen können mehr als einmal aufgerufen werden, aber wäre toll, wenn dies wie eine Art von Mutation funktioniert, die nur 5% der Zeit funktioniert.
  • Alle verwendeten Funktionen und Parameter beeinflussen die Fitnessbewertung.
  • Reihenfolge der Funktionen hat keinen Einfluss auf die Fitnessbewertung.

Für eine bessere undertanding, wenn ich meine INPUT als JSON beschreiben könnte, wäre es so etwas wie dieses:

{ 
    "FixedFunctions":[ 
     {"Name":"ChooseModel", "Parameters":[{"Name":"Type", "MinValue":1, "MaxValue":5,"Step":1}]}, 
     {"Name":"FillUp", "Parameters":[{"Name":"Litters", "MinValue":1, "MaxValue":100,"Step":2}]} 
     ] 
    "OptionalFunctions":[ 
     {"Name":"GoFront", "Parameters":[{"Name":"Steps", "MinValue":1, "MaxValue":50,"Step":5}]}, 
     {"Name":"GoBack", "Parameters":[{"Name":"Steps", "MinValue":1, "MaxValue":50,"Step":2}]}, 
     {"Name":"GoRight", "Parameters":[{"Name":"Steps", "MinValue":1, "MaxValue":25,"Step":2}]}, 
     {"Name":"GoLeft", "Parameters":[{"Name":"Steps", "MinValue":1, "MaxValue":25,"Step":2}]}, 
     {"Name":"HyperTeleport", "Parameters":[ 
      {"Name":"PointX", "MinValue":1, "MaxValue":100,"Step":2}, 
      {"Name":"PointY", "MinValue":1, "MaxValue":100,"Step":2}]} 
     ] 
} 

So ist die cromossome einfach etwas sein könnte, als etwas komplexer:

- [ChooseModel(1), FillUp(30), HyperTeleport(3,5), GoBack(50)] 
- [ChooseModel(3), FillUp(60), HyperTeleport(20,50), GoRight(2)] 
- [ChooseModel(4), FillUp(40), GoFront(10), GoRight(2), GoLeft(30), GoBack(80), HyperTeleport(20,30), GoRight(5)] 
... 

Also hier bitte ich um Hilfe. Was ist der beste Weg, um mein Problem zu lösen? Alle Beispiele, die ich gefunden habe, sprechen über Cromossome fester Größe, aber in meinem Problem habe ich eine variable Anzahl von Optionen. Wäre toll, Heuristiclab zu benutzen, da ich pausieren und fortfahren könnte, wie man die Operationen sehen kann.

Vielen Dank, wenn Sie bis hier gelesen haben !!!

Entschuldigung für die lange Post. 'O'

+0

Ist nicht möglich zu diesem Zweck verwenden "konventionellen" Algorithmus wie A *, Breite erste Suche, Tiefe erste Suche ....? – viceriel

+0

Ich denke ich könnte, aber es gibt viele Möglichkeiten für meine Funktionen und ihre Parameter. Es wäre nicht möglich, jeden einzelnen Knoten zu besuchen. Deshalb denke ich über genetische Programmierung nach. Das Überleben der Stärksten. Könnte ich etwas ähnliches mit BFS DFS tun? –

+0

Wahrscheinlich nicht, aber für Pfadfindung Mission werden diese Algorithmen besser als genetische Algorithmus, so dass Sie einige dieser Algorithmen für Pfadfindung und genetischen Algorithmus für verbleibende Aufgaben verwenden können. – viceriel

Antwort

0

Hier ist ein sehr gutes Tutorial über eine maschinelle Lernumgebung in Javascript, die Raketen um ein Hindernis herumführt. Es ist ziemlich genau das, was Sie mit Ihrem Projekt erreichen wollen https://www.youtube.com/watch?v=bGz7mv2vD6g

Es erklärt im Detail, wie man die Evolution des Raketenweges basierend auf Fitness einrichtet. Der Algorithmus fügt einem Array Werte hinzu, die die Schritte sind, die die Raketen unternehmen, um das Hindernis zu vermeiden.

In jeder Runde werden die Pfadfelder jeder Rakete auf der Grundlage der letzten erfolgreichen Runde aktualisiert. Mit der Zeit verbessern sich die Wege.

+1

Sehr schönes Tutorial. Nachdem ich dieses Video gesehen habe, denke ich an die Entwicklung meiner eigenen genetischen Engine, genau wie Daniel, aber in C# und konzentriere mich auf mein Problem. Ich weiß einfach nicht, was der beste Weg wäre, um jeden einzelnen Parameter (Funktionen und ihre Parameter) zu randomisieren. Soll ich X zufällige Chromosomen mit variablen und zufälligen Genen (Parametern) erzeugen? Wäre es nicht besser zu überprüfen, ob das zufällige Chromosom bereits ausgewertet wurde, und wenn ja, fragen Sie nach einem anderen zufälligen Chromosom? Vielen Dank! –

Verwandte Themen