Auf Anraten von @[Only registered and activated users can see links. Click Here To Register...] mache ich hierzu einen neuen Thread.
Mein Ziel ist es eine AI für TicTacToe zu "programmieren". Dabei soll die AI aus einem künstlichen neuronalen Netz bestehen und durch Training, in Form eines genetischen Algorithmus, verbessert werden.
Für mich erscheint TTT als ein nicht-komplexes aber auch nicht-lineare-separierbares Problem. Daher sollte ein mehrschichtiges 'Feedforward NN' ausreichen. Aktuell habe ich lediglich 3 Schichten (Input, Hidden und Output). Die Input Schicht besteht aus 10 nodes - 9 für jedes Feld und 1 für die Farbe( x oder o). Als Hidden Layer habe ich zwischen 7 und 15 nodes variiert. Der Output besteht aus 1 node.
Der Input ist diskret und kann nur 3 Zahlenwerte annehmen (-1, 0 und 1). Für die 9 Felderinputs gilt:
Das "Farbeninput" nimmt zwei Werte an (-1 oder 1), nach dem selben Schema wie eben.
Die Gewichte zwischen den nodes der Schichten variieren zwischen -40 und 40. Sie sind ziemlich hoch angesetzt, weil ich anfangs die Auswirkung testen wollte - im Nachhinein musste ich die Aktivierungsfunktionen anpassen :(
Für die Hiddenlayer nutze ich eine, an die Gewichte angepasste, TanH-Funktion:
Dabei habe ich den Faktor 0.1 gewählt, damit beim ersten Zug alle Werte für a(x) realistisch sind. Beim ersten Zug sind die Felderinputs 0 und nur das Farbeninput bestimmt das Ergebnis der Akt.f. - also -40 < x < 40
Für die Outputlayer habe ich keine stetige Aktivierungsfunktion. Da der Output ja diskret sein soll (1-9) brauchte ich auch eine diskrete Funktion. Zudem soll jeder Wert mit der gleichen Wahrscheinlichkeit erscheinen. Die Summe der Signale von Hidden zu Output ist normalverteilt und demnach kommen die extremen Werte seltener vor:
Woher der Sprung rechts kommt ist mir noch unklar. Ich habe die Werte gefittet und mit der Gausskurve konnte ich die Bereiche wählen, in denen die Zahlen 1-9 ausgegeben werden.
Ich konnte eine einigermaßen gerechte Outputverteilung erstellen :D
Was den GA betrifft, kann man sich meinen Post im ChitChat anschauen [Only registered and activated users can see links. Click Here To Register...]
Kurz zusammengefasst:
-ca. 1000 Generationen
-Population von 100 Individuen
-jeder gegen jeden => 99*99 Spiele
-Fitnessfunktion noch unklar
-Mutationsrate von 0.01-0.05
-crossover 'tournament selection' oder 'roulette ...'
-ab und an ein neues ANN hinzufügen -> mehr Vielfalt
Das Problem ist die schnelle Konvergenz zu einem sehr unbefriedigenden Ergebnis. Das primäre Ziel ist es der AI beizubringen, nur erlaubte Züge zu machen.
Mein Ziel ist es eine AI für TicTacToe zu "programmieren". Dabei soll die AI aus einem künstlichen neuronalen Netz bestehen und durch Training, in Form eines genetischen Algorithmus, verbessert werden.
Für mich erscheint TTT als ein nicht-komplexes aber auch nicht-lineare-separierbares Problem. Daher sollte ein mehrschichtiges 'Feedforward NN' ausreichen. Aktuell habe ich lediglich 3 Schichten (Input, Hidden und Output). Die Input Schicht besteht aus 10 nodes - 9 für jedes Feld und 1 für die Farbe( x oder o). Als Hidden Layer habe ich zwischen 7 und 15 nodes variiert. Der Output besteht aus 1 node.
Der Input ist diskret und kann nur 3 Zahlenwerte annehmen (-1, 0 und 1). Für die 9 Felderinputs gilt:
Das "Farbeninput" nimmt zwei Werte an (-1 oder 1), nach dem selben Schema wie eben.
Die Gewichte zwischen den nodes der Schichten variieren zwischen -40 und 40. Sie sind ziemlich hoch angesetzt, weil ich anfangs die Auswirkung testen wollte - im Nachhinein musste ich die Aktivierungsfunktionen anpassen :(
Für die Hiddenlayer nutze ich eine, an die Gewichte angepasste, TanH-Funktion:
Dabei habe ich den Faktor 0.1 gewählt, damit beim ersten Zug alle Werte für a(x) realistisch sind. Beim ersten Zug sind die Felderinputs 0 und nur das Farbeninput bestimmt das Ergebnis der Akt.f. - also -40 < x < 40
Für die Outputlayer habe ich keine stetige Aktivierungsfunktion. Da der Output ja diskret sein soll (1-9) brauchte ich auch eine diskrete Funktion. Zudem soll jeder Wert mit der gleichen Wahrscheinlichkeit erscheinen. Die Summe der Signale von Hidden zu Output ist normalverteilt und demnach kommen die extremen Werte seltener vor:
Woher der Sprung rechts kommt ist mir noch unklar. Ich habe die Werte gefittet und mit der Gausskurve konnte ich die Bereiche wählen, in denen die Zahlen 1-9 ausgegeben werden.
Ich konnte eine einigermaßen gerechte Outputverteilung erstellen :D
Was den GA betrifft, kann man sich meinen Post im ChitChat anschauen [Only registered and activated users can see links. Click Here To Register...]
Kurz zusammengefasst:
-ca. 1000 Generationen
-Population von 100 Individuen
-jeder gegen jeden => 99*99 Spiele
-Fitnessfunktion noch unklar
-Mutationsrate von 0.01-0.05
-crossover 'tournament selection' oder 'roulette ...'
-ab und an ein neues ANN hinzufügen -> mehr Vielfalt
Das Problem ist die schnelle Konvergenz zu einem sehr unbefriedigenden Ergebnis. Das primäre Ziel ist es der AI beizubringen, nur erlaubte Züge zu machen.