Verwendung eines Perceptron-Netzes als TicTacToe-Spieler
(EN google-translate)
(PL google-translate)
In einer Vorstudie wird hier zunächst
ein Perceptron-Netz entwickelt, dem ein Spielfeld
übergeben wird. Es soll an einem Ausgang mit 9
Neuronen bei jedem freien Feld vom Eingang einen Wert
>0.5 ausgeben und bei jedem besetzten Feld einen Wert
<0.5. Mit anderen Worten soll das Netz lernen, wo es
einen eigenen Zug machen kann.
Der Eingang besteht aus 9 Eingangsneuronen.
Für ein freies Feld wird 0.25 gesetzt,
für ein X wird 0.5 und für O wird 0.75 gesetzt.
Eine Trainer-Klasse erzeugt zufällige
Spielsituationen, die dem Netz präsentiert werden.
Zu jeder Spielsituation wird die Sollausgabe
des Netzes erzeugt und mit der Ist-Ausgabe
verglichen. Um das Natz zu belernen wird diese
Differenz mittels der klassischen
Backpropagation-Methode zur Verbesserung der
Verbindungsgewichte herangezogen. Siehe dazu:
67_Echtzeitsysteme/08_NeuronaleNetze/02_Backpropagation
Die gesamte Programmstruktur wurde objektorientiert
aufgebaut. Um die Klassenstruktur und die
UML-Klassendiagramme visuell zu erhalten, wurde
TicTacToe32_Neuro_strukturiert auch in BlueJ importiert.
Jedoch liegt im folgenden das Processing-Projekt
zum Download bereit.
Struktur-Prinzip beim nachfolgenden Projekt
- Das Netz ist in Layern (1D-Schichten mit Perceptron-Neuronen) und Gewichten (Verbindungen der einzelnen Neuronen einer Vorgängerschicht mit einer Nachfolgeschicht, klassisch w genannt) aufgeteilt.
- Es gibt immer ein Layer-Objekt mehr, als es Gewichtsobjekte gibt.
- Indem man einen Input-Layer und einen Output-Layer bei einem Gewichts-Objekt registriert und dann erzeugeGewichte() aufruft, wird ein Array mit Gewichten in passender Größe angelegt, über das jedes Neuron der Eingangsschicht mit jedem der Ausgangsschicht verbunden wird.
- Das Erzeugen der Netzstruktur erfolgt in iNetz, bzw. NetzTicTacToeSpielerNEU durch die Methode erzeugeNetz(int[] anzahlNeuronenProSchicht).
- Danach sind die Layer-Objekte und Gewichte-Objekte in layer, bzw. w gespeichert und miteinander verknüpft.
- In iNetz, bzw. NetzTicTacToeSpielerNEU führt propagiereEingangzumAusgang(double[] eingang) eine Berechnung des Netzausgangs aus einem Eingang durch.
- Ebendort führt macheBackpropagation(double[] soll_ausgang, double lernfaktor) einen Lernschritt nach dem Backpropagation-Algorithmus durch.
|
Bild 0-1: Klassenübersicht 1
Bild 0-2: Klassenübersicht 2
Bild 0-3: Interface iLayer
Bild 0-4: Interface iNetz
Bild 0-5: UML-KLassendiagramm von "Gewichte"
TicTacToe32_Neuro_strukturiert.zip -- Dieses Netz lernt, was es lernen soll.
Übung
- Analysieren Sie das Projekt TicTacToe32_Neuro_strukturiert.
- Leiten Sie von diesem Projekt ein eigenes Projekt ab, in dem ein Neuronales Netz TicTacToe spielen lernt.
- Überführen Sie das fertige Projekt in die Programmstruktur von TicTacToe08_Turnier aus dem vorangehenden Kapitel und lassen so Ihr Netz als "X" gegen den optimalen Spieler spielen, welcher "O" ist.
|