Heyho!
ich muss mich ja dringend mal wieder melden,... in letzter zeit bin ich nicht mehr dauernd an kniffel, aber vor ein paar tagen habe ich nochmal einige änderungen vorgenommen:
1. ich habe einige kleinere bugs beseitigt
2. bei der analyse des verhaltens des trainierten netzes sind mir einige "unsitten" aufgefallen. man kann gut erkennen, dass das netz kurzfristigen gewinn bevorzugt, z.B. CHANCE hat oft die höchsten punkte, daher setzt kniffel es immer als erstes. dabei ist mir klargeworden, dass man die policy der handlungsmöglichkeiten weiter einschränken muss, um kniffel beim RL auf die richtige fährte zu "schubsen". daher habe ich einige weitere Grundregeln eingeführt:
--- in runde 1 und 2 darf eine reihe nur gesetzt werden, wenn 5 gleiche augen da sind! (=kniffel). (soll heissen, so lange noch eine möglichkeit für mehr punkte besteht, darf auch nicht gesetzt werden)
--- 3erPasch ist in runde <3 nicht setzbar, wenn 4erPasch noch spielbar ist
--- 4erPasch ist in runde <3 nicht setzbar, wenn kniffel noch spielbar ist
--- kl.Str. ist in runde <3 nicht setzbar, wenn gr.Str. noch spielbar ist
--- chance darf nur nach runde 3 gesetzt werden
--- für die reihen 111 bis 666 habe ich den extra-reward geändert und auch negativen reward für <3 gleiche ergänzt. hierbei ist wichtig, dass kniffel erkennt, dass eine 1 besser ist als eine 6 (im Sinne des geringsten verlustes). neue formel:
reward = (anzahl * augenzahl) + (((200 * augenzahl * augenzahl * augenzahl) / (augenzahl * 120)) * (anzahl - 3))
If reward > 45 Then reward = 45
If reward < -30 Then reward = -30
(siehe registerblatt ("Tabelle1")
3. und ich habe einen - wie ich denke - wesentlichen logischen denkfehler gefunden und beseitigt:
die würfel werden ja intern sortiert und dann in "binäre würfel" umgewandelt und dann an das netz übergeben.
das netz gibt schlussendlich zurück, welche würfel neu gewürfelt werden sollen. dabei sagt das netz sinngemäß z.b. "werfe würfel 1 + 3 noch mal".
daraufhin wurden würfel 1 und würfel 3 der GUI neu gewürfelt.
das problem war nun aber, dass die entscheidung des netzes ja auf dem sortierten würfelarray basiert, die würfel in der GUI jedoch nicht umsortiert werden.
d.h. es fehlte an einer "rück-übersetzung" der zu würfelnden würfel.
aufgrund dessen war es meines erachtens unmöglich für das netz vernünftig zu lernen.
ich habe nun also eine "rück-übersetzung" implementiert nach dem schema:
a) wieviel augen hat der würfel an der position, die neu gewürfelt werden soll?
b) suche diese augenzahl in den original GUI-Würfeln
c) werfe diesen würfel neu
ich glaube, dass jetzt die gröbsten Fehler raus sind und alle wesentlichen dinge gut funktionieren.
meine darauf hin folgenden RL-testläufe waren jedoch trotzdem nicht viel besser.
ich habe mit alpha: 80%, gamma 100%, exploration 10% und 300.000 max_lessonpattern trainiert.
in einem testlauf war es so, dass die durchschnittspunktzahl nach etwa 8.000 Spielen mit knapp 110 punkten maximal war und dann bis zum 93.000 Spiel auf unter 30 Punkte gesunken ist. Kniffel hat also wieder "verlernt".
ich arbeite daran, dass man das alles gut nachvollziehen kann.
dazu kann man den PC (PC spielt, PC nutzt NN) mit DEBUG, ANHALTEN, ANZEIGEN und LESSON spielen lassen und schauen wie er sich verhält.
Irgendwelche Anregungen, wie ich weitermachen sollte?
viele Grüße!
http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm