Eine einfache künstliche Intelligenz, um dem Offline-Dinosaurier von Google Chrome mithilfe neuronaler Netze und eines einfachen genetischen Algorithmus das Springen von Kakteen beizubringen.
Sehen Sie sich dieses Video an, um es in Aktion zu sehen und zu erfahren, wie es funktioniert: Künstliche Intelligenz mit Googles Dinosaurier
Installieren Sie Node.js
auf Ihrem Computer.
Klonen Sie diesen Ordner bzw. laden Sie ihn auf Ihren Computer herunter.
Führen Sie npm install
in diesem Ordner aus
Öffnen Sie das Dinosaurierspiel von Chrome und legen Sie das Terminal beiseite (Es MUSS sich auf demselben Bildschirm befinden) (Tipp: Gehen Sie zu den Entwicklertools und stellen Sie unter „Netzwerk“ die Option „Offline“ ein.)
Führen Sie node index
in diesem Ordner aus. Wenn das Spiel gefunden wurde, wird der Mauszeiger zum Ursprung des floor
des Dino bewegt. Drücken Sie s
-Taste im Terminal, um mit dem Lernen zu beginnen.
Wir haben 3 verschiedene Eingaben, die aus den Pixeln des Bildschirms gelesen werden:
Wir haben auch eine Ausgabe mit drei möglichen Zuständen:
Jede Generation besteht aus 12 neuronalen Netzwerken (Genomen).
Jedes Genom wird mit dem Spiel getestet, indem die gelesenen Eingaben vom Spiel ständig den Eingaben des neuronalen Netzwerks zugeordnet werden und indem die Ausgabe/Aktivierung vom Netzwerk abgerufen und auf die Tasten der Tastatur angewendet wird.
Während wir jedes Genom testen, behalten wir den Überblick über seine „Fitness“, indem wir die gesprungenen Kakteen im Spiel zählen.
Wenn eine ganze Generation abgeschlossen ist, entfernen wir die schlechtesten Genome, bis wir N
-Genome erreichen. Mit diesen N
Genomen wählen wir dann zwei zufällig aus und kreuzen ihre Werte/Konfigurationen. Danach wenden wir zufällige Mutationen in den Werten/Konfigurationen des neuronalen Netzwerks an und erzeugen so ein neues Genom.
Wir führen die Überkreuzung/Mutation durch, bis wir wieder 12 Genome haben, und wiederholen dies ständig.
Die gesamte Implementierung erfolgte mit Node.js, mit Synaptic (Bibliothek für neuronale Netzwerke) und RobotJs (einer Bibliothek zum Lesen von Pixeln und Simulieren von Tastendrücken).
Es gibt einige Dateien im Projekt:
index.js
: Es hält alles zusammen.
Scanner.js
: Grundlegende Abstraktionsschicht über der RobotJs-Bibliothek, die den Bildschirm wie Raytracing liest. Verfügt außerdem über einige Hilfsfunktionen.
UI.js
: Globaler Bereich für die UI-Verwaltung. Es initialisiert und aktualisiert den Bildschirm bei Änderungen.
GameManipulator.js
: Verfügt über den gesamten notwendigen Code, um Sensoren zu lesen und Ausgaben auf das Spiel anzuwenden. Ist auch für die Berechnung von Punkten, das Abrufen des Spielstatus und das Auslösen von Rückrufen/Listenern für die tatsächliche Implementierung verantwortlich.
Learner.js
: Es ist die Kernimplementierung des genetischen Algorithmus. Hier geschieht „Magie“, indem Generationen durchlaufen werden, „natürliche“ Selektion, Kreuzung, Mutation durchgeführt werden ...
genomes
-Ordner mit der Erweiterung .json
befindetenter
(drücken Sie dann zum Starten s
)o
um die Generierung zu speichernCc
, um den Vorgang abzuschließenDas Dino-Spiel hat einen lästigen Fehler: Es beginnt mit der Zeit nach rechts zu „driften“, wodurch der Dino vom Ursprung des Spiels falsch verschoben wird. Dadurch erkennt das Programm den Dino als Kaktus, da er die gleiche Farbe hat.
Sie können das beheben, indem Sie die Seite kontinuierlich aktualisieren oder indem Sie diesen Code in die Konsole im Elementinspektor einfügen:
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
Bitte befolgen Sie den Node.js-Styleguide von Felix. Es ist nicht komplex und hat ein tolles, einfaches Muster für Dinge.