Nachdem es hier einige Zeit lang etwas ruhiger wurde, kann ich einen weiteren Fortschritt melden: Die Würmer können nun Steuerkommandos, ob sie nach links, recht oder gar nicht drehen sollen, entgegen nehmen. Dies habe ich erreicht mitfhilfe der Taktik des Test-Parcours, die ich im letzten Post beschrieben habe. Auf dem Weg dahin gab es noch einige Probleme: Wieder einmal eine Division durch 0 verursachte einen Programmabsturz. Das Problem an diesen Fehlern ist, dass sie nicht direkt erkennbar sind, wenn sie ausgeführt werden, sondern erst ein bisschen später, irgendwo anders im Programm, sich bemerkbar machen, wo man sie überhaupt nicht erwartet. Verursacht wurde der Division durch 0 Fehler, als der Richtungsvektor des Roboters (also in der Richtung in die der Roboter gerade sich fortbewegt), der aber ein Nullvektor war, normalisiert werden musste. Bei der Normalisierung eines Vektors wird dieser selbst durch seine Länge geteilt. Die Länge des Nullvektors ist logischerweise auch 0, und dies verursachte den Fehler.

Des Weiteren habe ich den Selektionsalgorithmus angepasst: Vorher war er so, dass einfach ein gewisser Prozentsatz der Population selektioniert wurde. Jetzt habe ich es so abgeändert, dass (fast) alles zufällig ist: Das beste Individuum kommt mit einer Chance von 1 in die nächste Generation. Befindet sich das Rating des Individuums unter dem Durchschnitt, so wird zwischen dem Durchschnitt und dem Minimum linear interpoliert, beim Minimum ist es die Chance 0 (gar nie) und beim Durchschnitt ist es 0.1. Oberhalb des Durchschnitt wird quadratisch interpoliert, nicht linear. Die Graphik links zeigt diesen Sachverhalt: Angenommen, das beste Rating sei 1.0, das schlechteste 0.0 und der Durchschnitt 0.5, so ordnet diese Funktion dem Rating die Wahrscheinlichkeit zu, dass die Gene in die nächste Generation kommen. Auffällig ist, dass die Wahrscheinlichkeiten zuerst sehr klein sind und dann fast explosiv artig ansteigen. Dies musste ich so machen, damit der Selektionsdruck etwas stärker wird. Bei linearer Interpolation war es teilweise so, dass über 50% in die nächste Generation kam und somit zu wenig elitär war, um Fortschritte zu erzielen.
Als letztes wurde noch die Mutationsrate abhängig gemacht von der Diversität eines einzelnen Genes (wie bereits beschrieben). Ob dies etwas genutzt hat oder nicht, kann ich nicht beantworten, denn direkt habe ich es nicht verglichen mit der alten Mutationsrate.
Zum Schluss kommt noch das obligatorische Video bei einem sichtbaren Fortschritt:
Link zum VideoMan sieht, dass sich der Roboter zuerst nach rechts dreht, danach mit einer Linksdrehung wieder auf seine ursprüngliche Richtung kommt. Ich habe dies so implementiert, dass man den Roboter mit der Tastatur steuern kann. Man muss dazu aber sagen, dass dieser sehr träge reagiert (ca. 5 Sekunden bis er reagiert).