Frage

Ich will Tic-Tac-Toe mit einem künstlichen neuronalen Netzwerk spielen. Meine Konfiguration für das Netzwerk ist wie folgt: Für jede der neun Felder, verwende ich zwei Eingänge Neurons. So habe ich 18 Eingangsneuronen, natürlich. Für jedes Feld, ich habe 1 Eingang Neuron für ein Stück Spieler 1 und 1 Neuron für ein Stück des Spielers 2. Zusätzlich zu, dass habe ich 1 Ausgabeneuron, die eine Bewertung der aktuellen Board Position gibt. Je höher der Ausgangswert ist, desto besser ist die Position für Spieler 1. Der ist niedriger er ist, desto besser ist es für Spieler 2.

Aber mein Problem ist: Wie ich das neuronale Netz Code könnte? Meine Idee war es, ein Array [1-18] für die Eingangsneuronen zu verwenden. Die Werte dieser Anordnung sind die Eingangsgewichte. Das würde ich gehen durch das Array eine Schleife. Jedes Mal, wenn ein Neuron aktiviert werden soll, füge ich das Gewicht auf den Ausgangswert. So wird der Ausgangswert ist die Summe der Gewichte der aktivierten Eingangsneuronen:

Output = SUM(ActivatedInputNeurons)

Glauben Sie, das ist eine gute Möglichkeit, das Netz der Programmierung? Haben Sie eine bessere Idee?

Ich hoffe, dass Sie mir helfen können. Vielen Dank im Voraus!

War es hilfreich?

Lösung

Nun, Sie haben eine Eingangsschicht von 18 Neuronen und eine Ausgangsschicht von 1 Neuronen. Das ist okay. Allerdings müssen Sie Ihre neuronalen Netz die Möglichkeit geben, die Eingaben in Beziehung zu setzen. Dafür benötigen Sie mindestens eine Zwischenschicht. Ich würde vorschlagen, 9 Neuronen in der Zwischenschicht zu verwenden. Jedes von diesen sollte zu jedem Eingangsneuronen verbunden werden, und das Ausgangsneuron sollte jeder Zwischen verbunden werden. Jede solche Verbindung hat ein Gewicht, und jedes Neuron eine Aktivierungsstufe.

Dann gehen Sie durch alle Neuronen, eine Schicht zu einem Zeitpunkt. Die Eingabeschicht ist nur mit dem Board-Zustand aktiviert. Für alle weiter Neuronen, gehen Sie durch alle ihre jeweiligen Verbindungen und Summe über das Produkt des Aktivierungsniveaus der angeschlossenen Neuron und das Gewicht der Verbindung. Schließlich Sie das Aktivierungsniveau berechnen, indem eine Sigmoidfunktion auf dieser Summe angelegt wird.

Dies ist das Arbeitsprinzip. Nun müssen Sie das Netz trainieren, um bessere Ergebnisse zu erhalten. Es gibt mehrere Algorithmen für diese, werden Sie einige googeln und Lesen zu tun haben. Schließlich möchten Sie vielleicht die Anzahl von Neuronen und Schichten einzustellen, wenn die Ergebnisse nicht bekommen, schnell genug zu überzeugen. Zum Beispiel könnten Sie die Eingangsschicht 9 Neuronen reduzieren und aktivieren sie mit +1 für eine X und -1 für eine O. Zugabe Vielleicht eine andere Zwischenschicht bessere Ergebnisse, oder die Erhöhung der Anzahl von Neuronen einer Schicht ergibt.

Andere Tipps

ich nicht besonders verstehen, wie Sie erwarten, eine aussagekräftige Zusammenfassung der Platine Situation aus einem Ausgabeneuron zu bekommen. Ich würde mehr sehen mit:

    I I I             O O O
    I I I      x      O O O
    I I I             O O O
9 input neurons  9 output neurons

in einem vollständig verbundenen Netzwerk, das heißt 81 Gewichte. Dann trainieren, um die Ausgangsneuronen für die relative Erwünschtheit in dieser Position zu spielen.

Haben Sie einen Blick auf meinem Tic-Projekt. Ich habe dieses Problem mit den beiden neuronalen Netzes gelöst und genetischen Algorithmus. Der Quellcode ist frei verfügbar.

http://www.roncemer.com / Tic-Tac-toe-an-Experiment-in-Maschine-Learning

Ich glaube, Sie sollten eine 'traditionelle' Feed-Forward-ANN mit Übertragungsfunktionen , wie können Sie es trainieren Rückausbreitung verwendet wird. Der Code für diese in der Regel endet als ein paar Zeilen Code auf, etwa wie folgt:

SetupInputs();
for (l = 1 .. layers.count)
    for (i = 0 .. layers[l].count)
        sum = 0
        for (j = 0 .. layers[l-1].count)
            sum += layers[l-1][j] * weights[l-1][j]
        layers[l][i] = TransferFunction(sum)

Dies ist ein ausgezeichnetes Starter-Projekt für AI-Codierung, aber mit einer kompletten Lösung kommen wird für SO Weg zu groß für eine Antwort sein.

Wie bei den meisten Software, empfehle ich ein objektorientiertes Design. Zum Beispiel: eine Neuron Klasse definieren, die Eingänge, Gewichte und eine Ausgabefunktion hat. Erstellen Sie dann mehrere dieser Neuron Objekte, um Ihr Netzwerk aufzubauen.

Sehen Sie den Wikipedia-Artikel über künstliche neuronale Netze für einen guten Ausgangspunkt.

Viel Glück mit dem Code! Klingt wie eine Menge Spaß.

Es ist keine direkte Antwort auf Ihre Frage, aber Sie sollten einen Blick auf die folgenden framework / Werkzeug haben: SNNS oder dessen Java Pendant JavaNNS . Ich bin mir ziemlich sicher, dass es erhalten Sie eine Antwort auf Ihre Frage finden.

Nachdem die Gewichte hinzufügen, müssen Sie die Summe normalisieren mit einer Funktion, die Menschen in der Regel TANH verwenden, wenn Sie negative Zahlen zulassen möchten.

Bearbeiten

Hier eine Java-Multilayerperceptron Implementierung, die ich vor einigen Jahren gearbeitet. dieser wurde für Kontrolleure verwendet, aber mit weniger Eingaben können Sie es für Kontrolleure verwenden.

Außerdem müssen Sie wahrscheinlich einen Weg finden, um zu lehren, es zu gewinnen, aber das ist ein anderes Problem

werden Sie sparen Zeit, wenn Sie neuronales Netzwerk Bibliothek wie FANN oder Neuroph verwenden.

Eine Möglichkeit, Ihre Eingabe zu codieren, ist um 9 Eingangsneuronen. Der Ausgang ist auch gut 9 Neuronen zu sein. Was ich nicht in den anderen Replays sehen, ist die Größe der verborgenen Schicht. Ich nehme an, Sie werden MLP verwenden, um mit traditionellen 3 Schichten. Die Größe der verborgenen Schicht ist immer Rätsel. Ich würde 10 versteckte Neuronen versuchen.

Wenn die Übertragungsfunktion ist sigmoid Sie Eingabe kodieren, können wie folgt:

0,0 -. O-Player

1.0 -. X Spieler

0,5 -. Leere

Der Ausgang des ANN wird 9 reelle Zahlen. In diesem Fall wird ein Teil der Zellen wird bereits belegt sein. Sie können für den höchsten Ausgangswert suchen, die auf eine leere Zelle entspricht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top