Hier ist der Quellcode für ein HTML5 -Projekt, das einen Algorithmus für maschinelles Lernen im Flappy Bird -Videospiel mit neuronalen Netzwerken und einem genetischen Algorithmus implementiert. Das Programm lehrt einen kleinen Vogel, wie man optimal flattert, um so lange wie möglich durch Hindernisse zu fliegen.
Das komplette Tutorial mit viel mehr Details und Demo, die Sie hier finden können:
http://www.askforgametask.com/tutorial/machine-learning-algorithm-flappy-bird
Hier können Sie sich auch ein kurzes Video mit einer einfachen Präsentation des Algorithmus ansehen:
https://www.youtube.com/watch?v=aewmdojejf0
Der gesamte Code wird in HTML5 mit Phaser Framework und Synaptic Neural Network Library für die Implementierung neuronaler Netzwerke geschrieben.
Um das Spiel zu spielen, hat jede Einheit (Bird) ein eigenes neuronales Netzwerk aus den nächsten 3 Schichten:
Eine Eingangsschicht mit 2 Neuronen, die zeigen, was ein Vogel sieht:
1) horizontal distance between the bird and the closest gap
2) height difference between the bird and the closest gap
Eine versteckte Schicht mit 6 Neuronen
Eine Ausgangsschicht mit 1 Neuron, mit der eine Wirkung wie folgt verwendet wird:
if output > 0.5 then flap else do nothing
Es wird eine synaptische Bibliothek für neuronale Netzwerke verwendet, um das gesamte künstliche neuronale Netzwerk zu implementieren, anstatt ein neues von Grund auf neu zu erstellen.
Das Hauptkonzept des in diesem Programm implementierten maschinellen Lernens basiert auf der Formular für Neuro-Evolution. Es verwendet evolutionäre Algorithmen wie einen genetischen Algorithmus, um künstliche neuronale Netze auszubilden. Hier sind die Hauptschritte:
Erstellen Sie eine neue Bevölkerung von 10 Einheiten (Vögeln) mit einem zufälligen neuronalen Netzwerk
Lassen Sie alle Einheiten das Spiel gleichzeitig mit ihren eigenen neuronalen Netzwerken spielen
Berechnen Sie für jede Einheit seine Fitnessfunktion , um seine Qualität als:
fitness = total travelled distance - distance to the closest gap
Wenn alle Einheiten getötet werden, bewerten Sie die aktuelle Population mit genetischen Algorithmusoperatoren (Selektion, Crossover und Mutation) wie folgt:
1. sort the units of the current population in decreasing order by their fitness ranking
2. select the top 4 units and mark them as the winners of the current population
3. the 4 winners are directly passed on to the next population
4. to fill the rest of the next population, create 6 offsprings as follows:
- 1 offspring is made by a crossover of two best winners
- 3 offsprings are made by a crossover of two random winners
- 2 offsprings are direct copy of two random winners
5. to add some variations, apply random mutations on each offspring.
Gehen Sie zurück zum Schritt 2
Da das Programm in HTML5 mit Phaser Framework und Synaptic Neural Network Library geschrieben ist, benötigen Sie folgende Dateien:
Die gesamte Spiellogik wird in der Datei gameplay.js implementiert. Es besteht aus den folgenden Klassen:
App.Main
, die Hauptroutine mit den folgenden wesentlichen Funktionen:
TreeGroup Class
, erweiterte Phaser -Gruppenklasse, um eine bewegliche Barriere darzustellen. Diese Gruppe enthält eine Oberseite und einen unteren Baumsprite.
Tree Class
, erweiterte Phaser -Sprite -Klasse, um einen Baumsprite darzustellen.
Bird Class
, erweiterte Phaser -Sprite -Klasse, um einen Vogelsprite darzustellen.
Text Class
, erweiterte Phaser -Bitmaptextklasse zum Zeichnen von Text.
Der genetische Algorithmus ist in der Genetic.js -Datei implementiert, die aus der folgenden Klasse besteht:
GeneticAlgorithm Class
, die Hauptklasse für alle genetischen Algorithmusoperationen. Es benötigt zwei Parameter: max_units , um eine Gesamtzahl von Einheiten in Bevölkerung und Top_units festzulegen, um eine Reihe von Top -Einheiten (Gewinnern) festzulegen, die zur Entwicklung der Bevölkerung verwendet werden. Hier sind die wesentlichen Funktionen: