Wie einfach wäre es, dein Framework zu nutzen, statt sich selbst was eigenes zu bauen?
Das ist eigentlich ganz einfach:
Ich erkläre es mal an dem TicTacToe Beispiel.
Man muss eigentlich nur zwei Klassen erstellen: Eine EvolutionWorld-Klasse und eine EvolutionObject-Klasse.
Die EvolutionObject-Klasse (-> TicTacToeAI) stellt ein Individuum/eine KI dar und muss nur die Funktionen getNNInput() und interpretNNOutput() implementieren. Also in der Klasse muss festgelegt werden wie die NN-Eingaben bestimmt werden und wie die NN-Ausgaben interpretiert werden.
In TicTacToeAI wird in getNNInput() also die Eingabe aus dem aktuellen Spielfeld zusammengebastelt:
2 Eingaben pro Feld: 0 0 => frei, 1 0 => X, 0 1 => O Also insgesamt 18 Eingabewerte.
In interpretNNOutput() wird aus den 9 Ausgabewerten die erste Ausgabe mit Wert "1" gesucht und dann versucht das dementsprechende Feld für den aktuellen Spieler zu setzen.
Die EvolutionWorld-Klasse (-> TicTacToe) stellt die Umgebung der KIs dar und muss nur die Funktion simulateGame(obj1, obj2) implementieren. Sie muss also bestimmen können welches der beiden EvolutionObjects besser ist.
In TicTacToe wird in simulateGame() zuerst ein Spiel simuliert in dem die erste KI anfängt und dann ein Spiel in dem die zweite anfängt. So wird dann bestimmt welche KI besser ist bzw. ob beide gleich gut sind.
Das ist alles den Rest macht dann die Coevolution learningRule.
Interessant, wie ließe sich das aber in einem etwas komplexerem Spiel, wie z.B. im Age of Empire Style (oder so eine Art Tower Defense) umsetzen?
Da liegt das einzige Problem. Je komplexer das Problem ist, desto größer muss das Neuronale Netz gewählt werden (Mehr Eingänge, Mehr Ausgänge, Mehr Hidden-Layers...) und desto größer wird der Suchraum. Es dauert also viel viel länger eine brauchbare KI zu entwickeln.
Wie genau sich dass jetzt bei anderen Spielen entwickelt, muss ich erst noch testen.
Beim TicTacToe Beispiel wurden zum Finden einer perfekten KI ~700 Generationen und 480 Millionen simulierte TicTacToe Partien benötigt. Das ganze dauerte bei meinem PC so ca. 2h.
Ich glaube aber, dass sich das noch drastisch verbessern lässt und so habe ich auch in nächster Zeit vor da noch ein bisschen an den Parametern zu drehen.
Gibt es schon irgend ein (Externes)System nach dem die Neuronen Spielregeln lernen können oder muss das alles Programmiert werden?
Ich weiß nicht genau, ob ich die Frage richtig verstanden habe. Vielleicht habe ich sie oben jetzt auch schon beantwortet, aber die spielregeln muss man den neuronen nicht extra "erklären". Man muss den Netzen nur ihre Eingabewerte liefern, was meistens der aktuelle Spielstand ist. Durch "survival of the fittest" wird dann nach einiger Zeit automatisch eine KI gefunden, die die Spielregeln beherrscht.
Und kann man einen Lernfortschritt abspeichern und wieder herstellen?
Aktuell noch nicht, ist aber ein Must-Have Feature, das ich auf jedenfall noch implementieren werde. Also sowohl das Speichern/Laden von Neuronalen Netzen, als auch von Lernfortschritten.
Das einzige das es aktuell in der Richtung gibt ist ein "SynapticExporter" der ein NN für Synaptic (ein JS-Framework für Neuronale Netze) exportiert. Das war für die kleine Online Simulation nötig