"Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

hmmm mist... jetzt habe ich hier einen überlauf fehler
erst kam er manchmal
und jetzt scheint er immer zu kommen.

ob da irgendwo ein problem entsteht beim handling des netzes oder der lesson?

es scheint eher ein verwaltung- oder memory-problem zu sein. der code lief einwandfrei.

naja egal.... jetzt gehe ich erstmal mit einem schmunzeln ins bett.... echt cool ;)
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Wow, ich bin beeindruckt! ;-)

Schon mal ein dickes Kompliment für das Durchhaltevermögen! Und das über 41 Forenbeiträge hinweg, das macht Spaß ;-)

Bin schon gespannt, wann es eine erste Version zum Ausprobieren gibt...!

Viele Grüße und schönen Abend noch...
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

hmmm.... also ich bin ein bischen mit meinem latein am ende.

ich habe ein wenig bugfixing betrieben, aber ich habe hier ein überlauf problem dass ich nicht gelöst bekomme.
es scheint so zu sein, dass das netz nach einigen trainingsläufen werte zurückgibt die dann evtl. nicht mehr zu meinen datentypen passen.

jedenfalls läuft am anfang alles wie geschmiert und dann kommt irgendwann der überlauf.

man kann es testen:

0. netz + lesson im selben ordner ablegen und pfad und dateinamen auf dem blatt speichern

1. kniffel auf neues spiel (training, pc spielt, pc nutzt NN), dann button "load NN" und dann button "randomize NN"

2. dann auf register "Kniffel-stats" wechseln und dort auf den button sim klicken.


zu der membrain DLL heisst es neuerding:

' Important note for VB 2005/2008 users:Replace all occurences of 'Long' in the VB declarations
' by the type 'Integer' and also use 'Integer' instead of 'Long' when you interface to the DLL functions.

könnte das evtl. der grund sein??
was muss ich hier tun? ich verstehe es nur bedingt.
in meinen DLL function declarationen wird überall LONG verwendet.
ich arbeite mit excel 2007.

http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm

http://freigabe.philweb.de/NN_Kniffel/K ... lesson.mbl

http://freigabe.philweb.de/NN_Kniffel/2 ... naer_4.mbn

viele grüße
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

just4phil wrote:' Important note for VB 2005/2008 users:Replace all occurences of 'Long' in the VB declarations
' by the type 'Integer' and also use 'Integer' instead of 'Long' when you interface to the DLL functions.

könnte das evtl. der grund sein??
was muss ich hier tun? ich verstehe es nur bedingt.
in meinen DLL function declarationen wird überall LONG verwendet.
ich arbeite mit excel 2007.
Nein, das ist nicht der Grund. In VBA hat der Typ 'Long' 32 Bit und das ist OK. Der Typ 'Integer' hat in VBA nur 16 Bit und damit knallt's sofort, Excel stürzt dann sofort ab.
Nur in VB 2005/2008 hat der 'Integer' 32 Bit und der 'Long' 64 Bit, deshalb muss man da aufpassen, ist leider ziemlich verwirrend...

Ich habe auch noch ein wenig ge-debugged und kann auf die Schnelle auch nicht finden, was da schief geht. Das ulkige ist ja, dass man nach dem Überlauf weiter debuggen kann und alles OK aussieht!
Nun bin ich leider auch kein VBA Experte... Ich bleibe aber auch am Ball und melde mich, wenn ich eine Erleuchtung habe...

Viele Grüße
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Hallo mal wieder,

ich habe einige Zeit gedebugged, finde aber den Fehler bislang auch nicht.

Da ich nichts anderes wusste, habe ich mal ein 'On Error Resume Next' eingefügt in der Funktion

Code: Select all

fkt_nn_befragen
:

Code: Select all

On Error Resume Next
fkt_nn_befragen = wertigkeit
Damit steigt Excel jetzt kontrollierter aus, mit einer im Code inegebauten 'Assertion':

Code: Select all

If strat = 0 Then
            MsgBox ("Problem mit Strategie = 0")
            Stop
        End If
in der Funktion

Code: Select all

fkt_arr_strategiewahl
Vielleicht hilft es ja weiter, hier einmal die Fehlerursache genauer zu eruieren, vielleicht ist der 'Fehler 6' ja nur ein Folgefehler?

Viele Grüße
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

ok danke.
das werde ich mal ausprobieren.

die letzten tage habe ich begonnen die ganzen routinen auf "memory-computing" umzustellen.
soll heissen, dass jetzt (bzw. demnächst) das gesamte kniffel-spiel des PCs in form von arrays gerechnet wird.
(bisher läuft sehr viel über das excel-sheet.... durch die vielen schreib und lesezugriffe auf die zellen im sheet ist das nicht sehr performant.) ich verspreche mir davon einen performance-boost für das spätere unüberwachte lernen.

darüber hinaus habe ich noch weitere optimierungen und vernünftige variablen-deklarationen vorgenommen, die bislang noch nicht sauber waren.

das problem an sich habe ich noch nicht gelöst. ich denke auch, dass es eher ein komischer folgefehler ist und evtl. erledigt sich das auch von selbst, wenn man drumherum optimiert ;)

ich bleibe aber dran!

viele grüße!
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

Hallo.

da bin ich wieder ;)

ich habe jetzt eine ganze menge optimiert und das ganze kniffel-spiel in arrays verlagert.
der effekt ist ein großer performance-gewinn, wenn man anzeigen = AUS schaltet. dann spielt der PC komplett im speicher ohne daten ins blatt zu schreiben oder dort auszulesen.
am besten sieht man das beim simulieren (SIM 100), wenn nur der PC spielt und anzeigen = AUS ist und auch training = AUS ist.
das trainieren macht den schönen effekt natürlich kaputt aber so ist das eben :)

dann habe ich noch kräftig gedebugged. ich glaube ich habe noch nie soooo lange an einem fehler gesessen und leider nur einen teilerfolg erzielen können :(
ich habe einen fehler gefunden, wo am ende eines arrays ein leerer wert stand und irgendwann wurde der ausgelesen und dann kam der "Problem mit strategie=0"-fehler. das ist jetzt behoben.

leider ist der überlauf fehler immer noch drin :(
mit "on error resume next" tritt nun kein fehler mehr auf, aber das ist natürlich nicht zufrieden stellend.
aber in dieser hinsicht bin ich mit meinem latein am ende.

ansonsten scheint das training trotzdem zu funktionieren....

hier die datei:
http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm

hier das soweit trainierte netz
http://freigabe.philweb.de/NN_Kniffel/2 ... naer_4.mbn

und hier auch mal die aktuelle lesson datei
http://freigabe.philweb.de/NN_Kniffel/K ... lesson.mbl

allerdings: die value-funktion ist immer noch die bisherige dummy-funktion.... da werde ich wohl als nächstes weitermachen....

viele grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Der Geschwindigkeitszuwachs ist allerdings enorm!

Dieser Fehler ist wirklich hartnäckig. Wenn ich nicht wüsste, dass die DLL bei mir ganze Wochenenden unter C# korrekt durchläuft, würde ich ja in Betracht ziehen, dass mit einem der DLL-Interfaces was nicht stimmt.

Sind Sie in der Lage einmal einen simplen DLL Stress-Test unter VBA aufzusetzen? Irgendwas, das ein Netz und eine Lesson lädt und dann ständig nur die verschiedenen DLL Interfaces aufruft, die Sie nutzen? Vielleicht kommen wir der Sache ja so auf die Spur...

Viele Grüße und viel Erfolg beim Entwickeln der 'echten' Value-Funktion!
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Tja,

andere scheinen ähnliche Probleme auch schon gehabt und sich ebenso mit 'On Error Resume Next' beholfen zu haben...:

http://us.generation-nt.com/answer/runt ... tml?page=2

Jetzt müssen wir nur noch schauen, ob auch jemand die Ursache herausgefunden hat... ;)
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

Heyho!

So, ich habe mal wieder eine ganze menge getan:

Ablauf des Trainings:
----------------------------
  • Kniffel spielt nun immer ein ganzes spiel (13 Felder x 3 Würfe = max. 39 pattern pro Spiel)
    Ich habe ein patternarray implementiert mit 39 x 83 Feldern (= 1 Spiel mit 13 Feldern und max. 39 würfen)
    Im patternarray sind: zustand + aktion + Q_sa + reward (=Punkte) + Q_max + value
    Dabei ist Q_sa die Wertigkeit der gewählten aktion, während Q_max die Wertigkeit der s-a-kombination mit der höchsten wertigkeit ist (wichtig, da ja durch „exploration“ auch niederwertige aktionen gewählt werden). „value“ wird erst später errechnet und ist der wert, der dem NN für den Teachstep als output übergeben wird. Die Q-werte runde ich auf 4 stellen nach dem komma, das sollte reichen denke ich.
    kniffel schreibt nach jedem Zug das pattern des zuges in das array
    am Ende des Spiels geht Kniffel das gesamte patternarray durch (max. 39 pattern) und errechnet die „values“. Die Value-function habe ich wie definiert mit alpha und gamma implementiert.
    danach geht kniffel das patternarray durch und überträgt die max. 39 pattern in die lesson; dabei „value“ als Output
    Der TeachStep wird allerdings erst alle 100 Spiele durchgeführt. D.h. also, die lesson wächst jedes Mal um bis zu 3.900 Pattern und erst dann erfolgt der teachstep und das speichern von Netz und Lesson. Das ist deutlich performanter.
    Das ganze läuft dann über bis zu 100.000 spiele. Die Lessongröße steht jedoch auf 50.000, d.h. sie beinhaltet dann etwa 1.300 Spiele.
Bisherige Ergebnisse und modifikationen:
----------------------------------------------------
  • Die bisherigen Trainingsläufe waren noch recht ernüchternd. Beim ersten längeren test hat das NN nach etwa 48.000 Spielen eine Durchschnittspunktzahl von 110 erreicht und sich dann wieder leicht verschlechtert.
    2011-12-11 22.31.50.jpg
    1. Sim 100.000 Lauf vor Reward-Mod.
    (99.51 KiB) Not downloaded yet
    Danach habe ich folgende reward-modifikation vorgenommen:
    Für das streichen eines feldes gibt es jetzt reward: -10
    Bei den reihen gibt es nun für das erreichen >= 3 gleiche würfel einen relativen Bonus auf den reward (50 punkte / 21 * reihe) also bei 111 -> 2 / bei 666 -> 14. Hiermit möchte ich dem NN klarmachen, dass es besser ist bei den reihen mindestens 3 gleiche zu erzielen. Ich glaube, dass kniffel diese wichtige regel sonst nicht lernen wird…
    2011-12-12 08.01.09.jpg
    2. Sim 100.000 Lauf nach Reward-Modifikation
    (98.13 KiB) Not downloaded yet
    Beim zweiten, längeren trainingslauf hat das NN nach ca. 10.000 spielen eine durchschnittliche punktzahl von etwa 120 punkten erzielt (alpha und gamma bei 0,9 / exploration: 15%). Nach 20.000 spielen ist diese dann wieder gesunken auf knapp über 110.
Fragen: Ich stelle mir jetzt die frage,
  • ob die value-function in dieser art für kniffel die richtige ist, da ja immer nur 3 würfe in einem sachlogischen zusammenhang stehen und danach ein gewisser break entsteht. Auch die reihenfolge der feldwahl spielt ja keine direkte rolle für das ergebnis…
    ob die anzahl von 100.000 spielen überhaupt schon ausreicht, um gute ergebnisse zu erzielen??
    ob die Lessongröße mit 50.000 evtl. zu gering ist? „vergisst“ das NN dann nicht beim Teachstep immer gewisses know-how? andererseits wird ja die gewichtung des netzes nur angepasst und nicht völlig verworfen…..
    ob die netzarchitektur hier eine größere Rolle spielt?
Zur Bedienung:
--------------------
die Werte des PatternArrays kann man sich wie folgt anzeigen lassen:
  • Registerblatt „Training“ am besten erstmal leeren
    checkboxen aktivieren: LESSON, PC nutzt NN, PC spielt
    „exploration“ festlegen in %
    „alpha“ und „gamma“ in % festlegen
    dann buttons: „neues spiel“ + „Load NN“ (ggf. bei Bedarf auch „Randomize NN“)
    dann mit button „PC beginnt“ den PC ein Spiel spielen lassen
    danach sind die werte des patternarrays im Registerblatt „Training“
    Spalte 80: Q_sa / 81: reward(=Punkte) / 82: Q_max / 83: value
    Immer wenn Q_sa <> Q_max, dann hat die exploration-funktion zugeschlagen
    für normales Training des NN „Lesson“ wieder deaktivieren, da das die performance einschränkt
Training:
--------------
  • Für „Sim 100.000“ zuerst die Trainingsdaten im blatt „Kniffel-stats“ unten ab zeile 181 löschen:
    • (nur spalten B [=Durchschnittspunkte der 100 Spiele]
      und D [=Dauer des Sim 100-Laufs inkl. Teachstep und speichern der lesson und des Netzes])
      (NICHT löschen: Spalte C = laufender Mittelwert über mehrere Sim 100 Ergebnisse -> geht in das Diagramm)
    checkboxen aktivieren: PC nutzt NN, PC spielt, Training
    ggf. bei Bedarf NN in Membrain laden und resetten/randomizen
    ggf. bei Bedarf die Lesson Datei in Membrain laden und leeren + speichern
    „exploration“ festlegen in %
    „alpha“ und „gamma“ in % festlegen
    dann buttons: „neues spiel“ + „Load NN“ + ggf. bei Bedarf „Randomize NN“
    dann auf Blatt „Kniffel-Stats“ mit button „Sim 100“ oder „Sim 100.000“ spielen lassen
    das Training „Sim 100.000“ kann mit der Enter-Taste beendet werden (ggf. etwas länger gedrückt halten) Danach wird dann noch die Lesson und das Netz gespeichert.

Spiel gegen den PC
------------------------
  • checkboxen aktivieren: Anzeigen, PC nutzt NN, PC spielt, Spieler spielt
    „exploration“ am besten auf 0 % setzen
    dann buttons: „neues spiel“ + „Load NN“
    als Spieler mit dem Button „Würfeln“ anfangen.
    Zum Punkte setzen einfach im punktebereich in die zeile klicken, die man setzen will und dann den button „Punkte setzen“ klicken.
    Alle anderen Buttons sind größtenteils debug-funktionen
Es wäre nett, wenn Sie sich mal bei einem Spiel das Patternarray anschauen würden, und die Value-Formel auf Richtigkeit überprüfen könnten.
2011-12-10_kniffel_NN_RL.zip
Aktuelle Datei
(308.58 KiB) Downloaded 702 times

viele Grüße


p.s.:

der überlauf fehler ist noch nicht behoben. Er wird immer noch mit on error resume next übersprungen. Das scheint aber wohl kein problem zu sein. Im netzt findet man dazu sehr viele infos und bei einigen gibt es dort ähnlich kuriose fälle…

Bezgl. des stress-tests für die DLL:
das lässt sich sicher relativ einfach umsetzen. Wenn das noch relevant ist, dann bräuchte ich da ein etwas genaueres szenario.
Post Reply