Hallo zusammen
Ich lese mich zu Zeit ein bischen in neuronale Netze ein und bin wirklich sehr fasziniert. Jetzt hab ich mir überlegt, könnte man ja einem Netz beibringen, dass es den Robby RP6 nicht an die Wand fährt.
Das währ aber zu langweilig und ich will, dass er es sich selbst beibringt.
Meine Gedanken dazu:
- Inputs sind:
- ACS links
- ACS rechts
- Bumper links
- Bumper rechts
- Outputs sind:
- Motor links vorwärts drehen
- Motor links rückwärts drehen
- Motor rechts vorwärts drehen
- Motor rechts rückwärts drehen
(Wenn sowol Motor_dreh_rechts als auch Motor_dreh_links aktiviert ist wird das in der Software in Motor_macht_garnichts umgemodelt. Aber da es bei 2 Bit nunmal 4 Zustände gibt und ich nur 3 brauch bleibt nix anderes übrig)
Angenommen das Netz müsste jetzt einfach nur verhindern dass einer der Bumper gedrückt wird, würde der Bot warscheinlich nach wenigen Minuten auf die Idee kommen sich einfach nur im Kreis zu drehen oder stehen zu bleiben..
Deshalb könnte man jetzt ein Bewertungssystem einführen und als Ziel das sammeln möglichst vieler Punkte in möglichst wenig "Denkzyklen" setzen:
- Beide Motoren drehen sich vorwärts: +10 Punkte
- Nur ein Motor dreht sich vorwärts: +3 Punkte
- Die Motoren drehen sich entgegengesetzt: +1 Punkt
- Nur ein Motor dreht sich rückwärts: -1 Punkt
- Beide Motoren drehen sich rückwärts: -3 Punktet
- Ein Bumper wird gedrückt: -10 Punkte
- Zwei Bumper werden gedrückt: -15 Punkte
- Beide Motoren stehen: -20 Punkte
Somit hätte der Roboter jetz den "Drang", genau das zu tun was ich von ihm will - nur wie er das jetzt hinkriegt is seine Sache. Und da fängt das Problem an: Wie implementiere ich das?!?
Ich hab mir mal folgende Lösung ausgedacht:
------------------------------------------------------------------------------------------------------
Am Anfang werden 2 Neuronale Netze erzeugt. Diese sind von der Struktur gleich, haben aber unterschiedliche Gewichtungen (per Zufall festgelegt).
Jetzt gibt es ja 4 Inputs (Bumper und ACS jeweils links & rechts), d.h. es gibt 2^4=16 Zustände in denen sich der Roboter gerade befinden kann.
Jetzt die Vorgehensweise anhand eines Beispiels:
#1
ACS_L=1 ; ACS_R=0 ; BUMP_L=0 ; BUMP_R=0
#2
Netz 1 hat jetzt 5 Denkzyklen Zeit, möglichst viele Punkte zu sammeln. D.h. das Netz 1 legt für die Ausgangsposition erst mal eine Lösung fest. Zum Beispiel, dass sich die linke Kette vorwärts dreht.
Irgendwann [*1] ändert sich ein Zustand der 4 Eingänge. In diesem Fall schlägt der linke Bumper an, weil der Robo an das Hindernis gefahren ist. Jetzt ist dieser Denkzyklus beendet.
[*1] Mit Ausname für "der Robi fährt gradeaus" gibt es ein Timeout, sonst könnte es ja sein, dass der Robi sich auf einer leeren fläche Stundenlang im Kreis dreht und der Denkzyklus nie zu Ende geht...
Somit ist die neue Ausgangsposition "ACS_L=1 ; ACS_R=0 ; BUMP_L=1 ; BUMP_R=0" und das selbe Spielchen gibts nochmal. Und dann noch 3x, weil das Netz ja 5 Denkzyklen Zeit hat, aus der Ausgangsposition von #1 so viele Punkte rauszuschlagen wie möglich.
Sind die 5 Zyklen vorbei, so werden die Punkte addiert:
Zyklus 1: +3 Punkte weil sich 1 Motor vorwärts gedreht hat und -10 Punkte weil er mit 1 Bumper angerannt ist
Zyklus 2: Blablubb Punkte bla
...
Zyklus 5: Blablubb Punkte blubb
-----------------------------------------
Summe: -48 Punkte
(Hat ziemlich mieserabel abgeschnitten, weil das Netz noch so wenig gelernt hat^^)
#3
Der Robo fähr jetz rum und die Netze sammeln Punkte
Irgendwann Ist der Robo zufällig wieder in der selben Situation wie bei #1 (ACS_L=1 ; ACS_R=0 ; BUMP_L=0 ; BUMP_R=0). Doch diesmal muss Netz 2 diese Situation bewältigen.
Es ergattert dabei -39 Punkte
#4
Irgendwann haben beide Netze alle 2^4=16 Situationen unterschiedlich gut gemeistert (Sieht man an den Punkten)
Jetzt werden alle Punkte addiert, der Gewinner ist natürlich der mit der höheren Punktzahl.
Das schlechtere Netz wird gelöscht. Dafür wird das bessere kopiert und modifiert (Werte werden per Zufall erhöht oder erniedrigt).
Somit muss das Netz 1 gegen seine mutierte Kopie Netz 2 antreten und das ganze geht wieder von vorne los....
------------------------------------------------------------------------------------------------------
DAS dauert jetz aber wohl Jahrhunderte und tausende Euronen Strom bis der Robby ordentlich fahren kann. Vor allem weil bei einer Mutation des besseren Skripts nicht festgelegt ist wie die Werte geändert werden, sondern das ganze wie eine Evolution funktioniert (Der stärkere gewinnt / Es gibt Genies die gut sind und "Fehlgeburten" die wieder mühsam aussortiert werden müssen)..
Ich brauch eine bessere Lösung^^
Aber bin ja schon dankbar wenn sich überhaubt jemand dieses Geschwurbel durgelesen hat^^
Viele herzliche Grüße
-schumi-
<EDIT>
Das ist ja bis jetzt noch relativ einfach gehalten. Aber der Robby soll ja trotzdem einigermaßen schlau sein. Sprich falls im letzen Denkzyklus der ACS_L angeschlagen hat und jetzt nicht mehr währe es unklug sich nach links zu drehen..
Und bei dieser Komplexität, sprich die Zustände der letzten 2 oder 3 Denkzyklen werden auch noch beachtet dauert es dann Jahrmillionen bis der Robby das drauf hat...
Geändert von -schumi- (29.12.2011 um 19:48 Uhr)
Lesezeichen