Sonntag, 27. Mai 2007

Steuerkommandos - doch nicht so einfach?

Um zu erreichen, dass Roboter Steuerkommandos verarbeiten können, habe ich einen weiteres Input-Neuron beim neuronale Netz hinzugefügt, das bestimmen soll, ob sich der Roboter nach Links (Input -1), Rechts (Input 1) oder gar nicht (Input 0) drehen soll. Nun wählte ich für jeden Roboter eine zufällige Richtung, die der Roboter erreichen soll. Anhand dieser Zielrichtung berechnete ich nun, ob sich der Roboter nach links oder rechts drehen muss: Sobald die Abweichung grösser als 15° ist, so wird dem neuronalen Netz den entsprechenden Input gegeben, der bestimmt, dass er sich drehen soll. Die Bewertung eines Roboters war gleich wie vorher, nur dass noch ein Betrag abgezogen wird, je nach dem wie fest der Roboter von der Ziel-Richtung abweicht. Nun liess ich die Simulation laufen. Es zeigte sich aber relativ schnell Ernüchterung, da keines Wegs sich zeigte, dass sich die Population so entwickelte, dass Roboter ihren bestimmten Richtungen folgten, sie waren also nicht fähig, Steuerkommandos, ob sie nach links oder rechts drehen sollen, entgegen zu nehmen, das neuronale Netz war trotz der Evolution nicht fähig, dies richtig zu interpretieren.Nun ist es natürlich schwierig herauszufinden, warum dies nicht funktioniert. Im Allgemeinen kann man sagen, dass evolutionäre Algorithmen nur gute Leistungen erbringen können, wenn die Bewertungsfunktion von Genen zuverlässig und genau ist, sie muss auch Teilerfolge honorieren. Und hier liegt denke ich das Problem, warum Steuerkommandos nicht funktionieren. Ich denke, dass vor allem Roboter, die zufällig am Schluss die richtige Zielrichtung hatten, gut bewertet wurden. Somit war das Auswählen der guten Gene in einer Generation nicht systematisch, sondern rein zufällig. Ich bin aber fest davon überzeugt, dass neuronale Steuerungsnetze Kommandos entgegen nehmen können, nur muss man dafür eine effiziente Bewerungsfunktion (quasi Test-Parcour für die Roboter) wählen. Meine Idee hierfür ist, dass ich in einem ersten Abschnitt dem Roboter per Netzinput sage, er solle sich nach rechts drehen. Nach einer gewissen Zeit schaue ich, ob er das getan hat. Nun kommt die andere Richtung, links. Auch hier wird bewertet, ob er diesem Kommando gefolgt ist oder ob er sich weiterhin nach rechts gedreht hat (was dann zufällig wäre, was ich bestrafen werde). Mit dieser Methode kann ich auch schon nur kleinste Erfolge messen. Der Roboter muss sich ja nicht sehr schnell nach links bzw. rechts drehen, sondern auch wenn er sich langsam dreht, kann dies positiv bewertet werden. Wichtig dabei ist jedoch, dass nicht Individuen in die nächste Generation kommen, die nur stark in eine Richtung drehen und damit eine sehr gute Bewertung erzielen (weil dann die andere Richtung einen relativ kleinen Einfluss in die Bewertung hat), sondern dass ich beide Richtungen gleich gewichte, egal wie schnell sich der Roboter in die eine dreht. Wie ich das implementiere, bin ich mir noch nicht so sicher. Aber irgendeinen Weg dazu wird mir schon einfallen.

Keine Kommentare: