== 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. {{ :ws2021:kaesekaestchen_grundflaeche.jpg?200 |}} Und als Mauszeiger wird diese Grafik verwendet. {{ :ws2021:kaesekaestchen_crosshair.png?300 |}} == 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 [[https://www.pygame.org/wiki/about|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. {{:ws2021:kaesekaestchen_2spieler.zip|Hier}} gibts den Code dafür. Im Untenstehenden Video sieht man die Visualisierung des Spiels.(Beide Spieler wurden hierbei von einer Person gespielt) \\ {{:ws2021:kaesekaestchen.mp4?1000 | Visualisierung unseren Codes}} . 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. \\ {{ :ws2021:nearal_networks.png?370 | 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.\\ {{ :ws2021:blackbox.png?450 | 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: \\ [[https://www.youtube.com/watch?v=aircAruvnKk|Allgemeines zu neuronalen Netzen]] \\ Für das allgemeine Verständnis von Neuronalen Netzwerken. [[https://www.youtube.com/watch?v=MMxFDaIOHsE&list=PLzMcBGfZo4-lwGZWXz5Qgta_YNX3_vLS2|Tutorial für Neat in Flappy Bird]] \\ Für das Verständnis der Python-Bibliothek Neat. [[https://www.youtube.com/watch?v=y7AKtWGOPAE|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. {{ :ws2021:arrays_kaese.png?500 | 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 [[https://neat-python.readthedocs.io/en/latest/xor_example.html | diesem Link]] findet. Hier nur ein kleiner Ausschnitt davon. \\ {{ :ws2021:config.png?200 | 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).\\ {{ :ws2021:grafik_ki_threads.png?370 | 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. [[https://www.youtube.com/watch?v=olYdb0DdGtM|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.{{:ws2021:kaesekizurerklaerung.zip|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 {{:ws2021:ki_generator.zip|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 {{:ws2021:kase_load_ki_test.zip| folgender Datei }} eingelesen und gegen sie gespielt werden. Als Beispiel finden Sie {{:ws2021:beispielkis.zip| 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:kaeseki.mp4?1000|Spiel gegen die KI}}\\