PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 soll sich selbst beibringen nicht an die Wand zu fahren



-schumi-
29.12.2011, 19:38
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)..

:arrow: 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...