Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2021:protokoll
Tag 1 - 10.12.2020

Überlegung der Grundlagen des Spiels Käsekästchen anhand von Zeichnungen in Paint. Das Spiel ist für 2 Spieler gedacht. Pro Zug kann immer eine Seite in dem Gitter gemalt werden. Wenn ein Kästchen von allen 4 Seiten umschlossen ist, erhält derjenige der es geschlossen hat einen Punkt und direkt einen weiteren Zug. Ziel ist es mehr Kästchen zu erhalten als der Gegner.

Erste Schritte mit PyGame und Programmierung des Spielfeldes und des Mauszeigers. Als erste, provisorische Grundfläche haben wir folgende Zeichnung genommen. Und als Mauszeiger wird diese Grafik verwendet.

Tag 2 - 17.12.2020

Bekanntmachung mit dem Mathesis WIKI und Gestaltung der Projektseite und der ersten Einträge.

Tag 3 - 07.01.2021

Programmierung des Spiels in PyGame abgeschlossen. Wir haben Linien programmiert, die beim anklicken, abhängig vom Spieler, Grün oder Violett gefärbt wird. Felder die gefärbt werden sobald sie „geschlossen“ wurden, auch in den entsprechenden Farben. Außerdem haben wir den Ablauf des Spiels programmiert gemeinsam mit einer Punktetafel, welche die Punkte live mitzählt. All das passiert in einem separaten PyGame-Fenster siehe Video unten. Somit können jetzt schon 2 Spieler an einem Computer spielen. Hier gibts den Code dafür. Im Untenstehenden Video sieht man die Visualisierung des Spiels.(Beide Spieler wurden hierbei von einer Person gespielt)

.

Weiterhin recherchierten wir nach möglichen Gewinnstrategien im Spiel. Zuletzt haben wir uns informiert welches Machine Learning packages in Python zu unserem Projekt am besten passen würden.

Tag 4 - 14.01.2021

Code wurde verändert um für das Machine Learning besser zu funktionieren. Wir werden versuchen mit Neat(einer Python-Bibliothek für neuronale Netze) dem Computer Käsekästchen beizubringen. Neuronale Netze bestehen grundlegend aus 3 verschiedenen Ebenen. Input-Layer, Hidden-Layers und Output-Layer.
 Neuronales Netzwerk

Input sind Eingaben, Output ist die Ausgabe bzw. das Ergebnis. Der eigentlich wichtige Teil sind die Hidden-Layers, wo auch das eigentliche Verarbeiten abläuft. Hierfür wird mit verschiedenen Parametern gearbeitet, um am Ende eine Entscheidung zu treffen. Diese Funktion (Die „Blackbox“) übernimmt in unserem Beispiel zu einem großen Teil die Pythonbibliothek Neat. Neat funktioniert als Evolutionäres Neuronales Netz und entwickelt sich von Generation zu Generation weiter, vergrößert oder verkleinert die Menge an Neuronen oder stellt Parameter anders ein. Der Benutzer muss „nur“ den Code passend für Neat umschreiben und in einer Konfigurationsdatei einige Parameter richtig einstellen. Den Rest macht Neat dann von allein. Somit ist es auch für uns als Anfänger relativ gut möglich einen Machine Learning Algorithmus zu erstellen.

 Neat-Blackbox

Tag 5 - 21.01.2021

Wir haben uns ein Bild zu KI, deren Anwendung und Funktionsweise gemacht. Außerdem haben wir einen Vortrag der Laborleiterin zu Neural Networks gehört. Wir haben folgende Videos/Tutorials zur Hilfe gezogen:

Allgemeines zu neuronalen Netzen
Für das allgemeine Verständnis von Neuronalen Netzwerken.

Tutorial für Neat in Flappy Bird
Für das Verständnis der Python-Bibliothek Neat.

Spiele mit KI verbinden
Beispiele von KIs in anderen Spielen und der Fitnesspunkte.

Tag 6 - 28.01.2021

Umprogrammieren des Spiels in Arrays, damit die KI nicht mit der Visuellen Darstellung arbeiten muss.(Verringert die Laufzeit, da dann die KI nicht ca. 200 spiele gleichzeitig auf dem Bildschirm anzeigt, sondern „nur“ Arrays im Hintergrund berechnet, welche viel weniger Leistung von der CPU ziehen)
Auf der linken Seite sind die Arrays, der Übersicht halber, übereinander zu sehen. [0] steht für False, also dass eine Linie noch nicht gesetzt ist. True bedeutet, dass eine Linie gesetzt ist, ganz gleich von welchem Spieler(Da dies für das Spiel irrelevant ist). Rechts sieht man das, zu dem Array zugehörige, Spielfeld.  Darstellung in Arrays

Tag 7 - 04.02.2021

Erste Versuche der Implementierung von Neat in unseren Code. Bevor Neat in den Code implementiert wird, müssen einige Sachen beachtet werden. Zuerst wird die Konfigurationsdatei benötigt, welche man unter diesem Link findet. Hier nur ein kleiner Ausschnitt davon.

 Neat Kofigurationsdatei

Einige wichtige Größen müssen hier eingestellt werden. Dazu zählen pop_size und fitness_threshold. Pop_size gibt die größe der Population, also der Menge der einzelnen Teil-KIs, an und fitness_threshold gibt die Obergrenze an zu erreichender Fitness an. Fitness ist hierbei ein Wert, der dafür steht wie effektiv eine KI ist. Pro eingenommenes Kästchen erhält die KI eine bestimmte Menge an Fitnesspunkten. Wenn fitness_threshold überstiegen wurde, bricht das Programm ab und die KI ist für die eingestellten Werte finalisiert. In dieser Konfigurationsdatei gibt außerdem noch sehr viele weitere Einstellungen, die wir hier aber nicht weiter erklären wollen.

Mit dieser Config-Datei können wir uns nun des Codes annehmen.

Dafür müssen zuerst Variablen für Genome und Netze erstellt werden. Das Netz ist der Grundaufbau von unserem Neuronalem Netzwerk(siehe Tag 4) und die Genome sind die Parameter und Einstellungen der einzelnen Neuronen und derer Verbidungen.

Des Weiteren muss dieses Codefragment immer enthalten sein. Es bringt die oben genannten Einstellungen in unseren Code hinein.

def start_NeuralNetwork(config_path):
    config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction,
                                neat.DefaultSpeciesSet, neat.DefaultStagnation,
                                config_path)
    p = neat.Population(config)
 
    p.add_reporter(neat.StdOutReporter(True))
    stats = neat.StatisticsReporter()
    p.add_reporter(stats)
    return p


Zuletzt muss noch die run(n) Funktion definiert und aufgerufen werden, in der mit n die Anzahl der Generationen definiert wird. Also wie oft soll das Programm durchlaufen.

Ein weiterer Punkt unseres Tagesplans war die Einbindung von Threads in unsere Arbeit. Treads sind Ausführungsreihenfolgen eines Programms. Die Befehle, die unsere Threads verfolgen starten für jedes Spiel abwechselnd die KIs. Wir wollen 2 KIs gegeneinander spielen lassen, damit für den Lernprozess nicht ständig jemand vor dem PC sitzen muss uns dieser generell schneller Abläuft. Somit brauchen wir auch 2 Threads, welche Abwechselnd Spiele spielen. Da wir in Neat 15 Individuen pro Generation eingestellt haben, gibt es pro Evolutionsstufe mithilfe der Threads 15 * 15 = 225 Spiele (da jedes Individuum der ersten KI gegen jedes Individuum der zweiten KI spielt).
 Verbindung mithilfe von Threads
So kann man die Arbeit der Threads in unserem Beispiel erklären. KI1 und KI2 werden von Threads 1 und 2 gestartet und spielen in game gegeneinander.

Threading zum ansteuern mehrerer KIs(wie bei uns)

Tag 8 - 11.02.2021

Nach der Implementierung der KI mussten noch einige Fehler behoben werden… Einiges hat nicht ganz so funktioniert wie es sollte. Zum Beispiel fehlten an einigen Stellen Variablen oder Teile des Codes wurden gar nicht ausgeführt. Dafür sind Debug-Meldungen(Printausgaben wenn bestimmte Sachen passieren) sehr nützlich. Damit kann man genau sehen ob ein bestimmter Teil eines Programmes ausgeführt wird und wo etwas nicht so wie geplant funktioniert. Also mussten wir Debuggen.Hier findet ihr den fertigen Code mit einigen Erklärungen dazu.

Tag 9 - 18.02.2021

Fertigstellung einer KI welche gegen den Menschen spielen kann. Wir haben das Programm mit verschiedenen anzahlen an Generationen durchlaufenlassen und die daraus entstehenden KI`s getestet. Die KI , welche das Spiel über 100 Generationen(225 Spiele, siehe Tag 7 Erklärung der Threads) gelernt hat, ist in der Lage das Spiel zu gewinnen, allerdings nur wenn der menschliche Spieler sich sehr wenig Mühe gibt. Der Code für das erstellen der KI und das einmalige Spiel gegen sie ist Hier zu finden. In Codezeile 906 kann man die Anzahl der Generationen, welche Neat durchspielen soll einstellen. Die generierte Künstliche Intelligenz wird dann in einer PKL-Datei gespeichert und kann zu einem Späteren Zeitpunkt mit folgender Datei eingelesen und gegen sie gespielt werden. Als Beispiel finden Sie Hier die KIs für 3 und 100 Generationen. Einen Durchlauf mit 1000 Generationen wird gerade berechnet und könnte demnächst folgen.

Tag 10 - 25.02.2021

Überarbeitung des MathesisWIKI Eintrags. Implementierung eines Algorithmus, der gegen die KI spielt.

Nach einiger Rechenzeit gab es dann auch eine KI, die an dem Algorithmus gelernt hat. Diese ist jedoch auch nicht überragend.


ws2021/protokoll.txt · Zuletzt geändert: 2021/04/13 15:17 von kyrill.ho