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.

Mittwoch, 23. Mai 2007

Nächster Schritt

Seit langer Zeit gab es nicht mehr so viel neues auf meinem Blog, das liegt nicht zuletzt daran, dass ich in meinem anderen Hobby (Klavier) noch das Final eines Wettbewerbs absolvieren musste. Nun geht es aber daran, wie ich meine Maturarbeit fortsetzen kann, denn im Prinzip hätte ich schon genug Stoff im Praktischen gesammelt, um den schriftlichen Teil zu schreiben - damit gebe ich mich aber nicht zufrieden.
Zum einen möchte ich herausfinden, ob die Roboter auch fähig sind, Steuerkommandos entgegen zu nehmen, wie z. B. "bewege dich in dieser bestimmten Richtung fort". So konkret habe ich dieses Thema in noch keiner anderen Arbeit über evolutionäre Roboter gefunden, in den meisten ging es nur darum, dass sich der Roboter möglichst schnell fortbewegt. Dieses Thema bietet also etwas Neues, das noch nicht so intensiv erforscht wurde.
Zum anderen möchte ich aber auch neue Morphologien ausprobieren, ich peile vor allem eine ähnliche Struktur des Menschen an um zu schauen, wie effizient mein evolutionärer Algorithmus ist.
Damit bin ich bei einem weitern Thema angelangt, das Optimierungspotenzial bietet. Zur Zeit arbeitet dieser Algorithmus so, dass nur die besten Gene ausgewählt werden. Dies bewirkt, dass nach wenigen Generationen eine akzeptabler Roboter vorhanden ist, der sich schnell fortbewegen kann. Nun ist es aber so, dass durch einen Selektionsalgorithmus, der mit Zufall arbeitet (die besseren Gene aber die grössere Chance bekommen, in die nächste Generation zu gelangen), langfristig die besseren Ergebnisse erzielt werden können.
Man kann auch die Leistung des evolutionären Algorithmus erhöhen, indem die Anzahl Gene, die weiterkommen, davon abhängig macht, wie stark sich die Population momentan verbessert. Falls sie sich nur gering verbessert, verringert man den Selektionsdruck. Dadurch können sich auch andere (im Vergleich zur Mehrheit der aktuellen Generation) Bewegungsformen entwickeln, die anfänglich nicht effizient sind, jedoch im Laufe der Generation die ursprüngliche in der Leistung überholt. Verbessert sich hingegen eine Population laufend, so ist es sinnvoll, den Selektionsdruck zu erhöhen, damit quasi ein "Feintuning" der Gene vorgenommen werden kann und nicht effiziente Gene verworfen werden, da sich die Population in einer starken Entwicklungsphase befindet.
Ein dritter Punkt, der die Leistung des EA (evolutionären Algorithmus) positiv beeinträchtigt ist das stärkere Mutieren aufgrund des Abschätzens des Einfluss der einzelnen Gene auf die Leistung eines Individuums. Damit meine ich, dass Gene, die bei einer grossen Veränderung positiv die Leistung beitragen, stärker mutiert werden als Gene, die bei einer ebenfalls grossen Veränderung zu schlechten Ergebnissen führen. Dies kann man berechnen, indem angeschaut wird, wie fest ein einzelnes Gen über die ganze Population gestreut ist. Ist die Streuung gross (d.h. sehr verschiedene Werte), so werden sie stark mutiert. Bei Genen, die sehr ähnliche Werte haben, wird hingegen eine schwächere Mutation bevorzugt.
Link zu diesen Themen: http://de.wikiversity.org/wiki/Kurs:Genetische_Algorithmen/Kapitel_8