Geschwindigkeitsoptimierung

FitnessberechnungWie ich Gestern schon geschrieben habe, habe ich die Geschwindigkeit bei der Berechnung der Fintess deutlich erhöhen können, indem ich einfach die Simulationsumgebung „recycle“. Dazu habe ich einige Messergebnisse festgehalten. Der Graph zeigt die Berechnungszeit der Fitness (in Millisekunden) in Abhängigkeit von der Anzahl der Individuen, für die die Fitness errechnet wird. Die obere Kurve zeigt die Gesamtzeit, die zur Berechnung der Fitness benötigt wurde; die untere Kurve zeigt die Zeit, die letztendlich zur Berechnung der Simulation nötig war. An der Differenz kann man ablesen, wie viel Zeit zum Aufbau der Simulation benötigt wird (ich empfehle die Grafik anzuklicken um bei besserer Auflösung mehr zu erkennen).

Je mehr Individuen berechnet werden, desto größer wird der Anteil der effektiv genutzten Simulationszeit, während der Anteil der Zeit, die zum Aufbau genutzt wird, immer weniger der Gesamtzeit ausmacht.

Aktueller Stand der Labyrinth Bots

Mittlerweile habe ich Simbad, meine Netzwerk Simulation und die evolutionären Verfahren auf einen gemeinsamen Nenner gebracht, noch ein paar Klassen um Graphen mit GNUPlot zu erstellen geschrieben und schon die ersten Ergebnisse erzielt. Die Labyrinth Roboter sind mittlerweile in der Lage Wänden und anderen Objekten auszuweichen.

Labyrinth Welt

Labyrinth Welt

Ich habe jeweils 14 Quader zufällig in der Testumgebung verteilt und die Fitness danach berechnet, wie weit es die Roboter jeweils geschafft haben sich vom Ausgangspunkt zu entfernen. Man konnte dann nach einiger Zeit (ca. 50 Epochen, mit 80 Individuen) erkennen, dass die Roboter Hindernissen ausweichen und in Sackgassen (manchmal) umkehren.

Zu schaffen gemacht hatte mir noch Gestern die langsame Berechnung der Fitness. Sechs 15 Sekunden lange Simulationen benötigten ca. 4,5 Sekunden Berechnungszeit. Nach genauerem Messen habe ich herausgefunden, dass während diesen 4500 Millisekunden nur 250 Millisekunden für die eigentliche Simulation abläuft; der Rest geht auf die Kappe von Simbad, das 4250 Millisekunden für 6 Initialisierungen gebraucht hat. Deshalb habe ich das Framework jetzt so erweitert, dass ich beliebig Roboter hinzufügen und entfernen kann. Es reicht nun aus eine Simulationsumgebung zu initialisieren; dann kann man sie immer wieder verwenden. Was jetzt noch fehlt ist, dass die Quader in der Umgebung ab und zu neu organisiert werden können, damit die Roboter sich nicht auf eine bestimmte Umgebung spezialisieren.

Labyrinth Bots — technische Umsetzung

Nachdem ich meine Zielsetzung definiert hatte, habe ich mir Gedanken zur Umsetzung des Experimentes gemacht. Eine Simulation für neuronale Netze und ein Evolutionsframework habe ich bereits in Java geschrieben, deswegen habe ich mich entschieden auch dieses Projekt mit Hilfe von Java umzusetzen.

Um den Roboter in seiner physikalischen, dreidimensionalen Welt zu simulieren, habe ich mich für Simbad entschieden, da es die nötigen Tools wie Entfernungsmesser und Physikengine in einer 3D-Welt bereits bereitstellt und nebenbei noch recht schnell ist.

Um die Berechnungen der Fitness der Roboter zu beschleunigen habe ich außerdem noch ein kleines Client-Server System entwickelt, mit dem ich Rechenaufgaben auf andere Computer im Netzwerk auslagern kann.

Ausgestattet mit diesen neuen Werkzeugen konnte ich mit meinen Experimenten beginnen.

Labyrinth Bots — Zielsetzung

Nachdem ich meine Arbeit zum Thema neuronale Netze abgeschlossen hatte, wollte ich mich näher mit evolutionären Verfahren in Kombination mit neuronalen Netzen beschäftigen. Als erstes „kleineres“ Ziel habe ich mir gesetzt einen Roboter in einer physikalisch einigermaßen korrekten, dreidimensionalen Umgebung dazu zu bringen, dass er sich in einem Labyrinth zurechtfindet, nicht gegen die Wände läuft und zumindest versucht einen Ausgang zu finden (den Anspruch auf die Erfolgreiche Befreiung aus dem Labyrinth lasse ich zunächst in Klammern).

Labyrinth BotDer Einfachheit halber ist der Roboter rund und hat 20 Entfernungssensoren mit einer Reichweite von 1,5 Metern.

Als „Gehirn“ ist ein vollverknüpftes neuronales Netz vorgesehen. Es gibt 22 Eingabeneuronen; 20 für die Entfernungssensoren und 2 für einen Beschleunigungssensor jeweils in X und Z Richtung. Dazu gibt es 2 Ausgabeneuronen, jedes für eins der Antriebsräder. Die Anzahl der restlichen Neuronen soll im Verlauf der Evolution variieren können.