Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws2021:kaesekaestchen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws2021:kaesekaestchen [2021/04/12 09:33]
kyrill.ho [Dokumentation]
ws2021:kaesekaestchen [2021/04/13 15:35] (aktuell)
kyrill.ho [Ziele]
Zeile 3: Zeile 3:
  
  
-==== Teilnehmer*innen ====+===== Teilnehmer*innen ​=====
 Ameli Siedersleben \\ Finn Gonnermann \\ Kyrill ​ Hoffmann\\ Laurin Dahm Ameli Siedersleben \\ Finn Gonnermann \\ Kyrill ​ Hoffmann\\ Laurin Dahm
  
-==== Projektbeschreibung ====+===== Projektbeschreibung ​=====
 Wir bauen ein Käsekästchenspiel! Und lassen einen Computer dieses Spiel lernen. ​ \\  Wir bauen ein Käsekästchenspiel! Und lassen einen Computer dieses Spiel lernen. ​ \\ 
 Käsekästchen wird normalerweise in langweiligen Unterrichtsstunden mit dem Banknachbar auf einem Blatt kariertem Papier gespielt. Dies wollen wir verändern in dem wir es digitalisieren und einem Computer mithilfe von Machine Learning beibringen. Käsekästchen wird normalerweise in langweiligen Unterrichtsstunden mit dem Banknachbar auf einem Blatt kariertem Papier gespielt. Dies wollen wir verändern in dem wir es digitalisieren und einem Computer mithilfe von Machine Learning beibringen.
-==== Ziele ====+===== Ziele =====
 __ ** Grundziele ** __ __ ** Grundziele ** __
 \\ \\
Zeile 16: Zeile 16:
 __ ** Weitere Ziele ** __ __ ** Weitere Ziele ** __
 \\ \\
-Das Erlenen ​der Spielstrategie durch den Computer mithilfe von Machine Learning. So könnten im Idealfall Mensch und Computer gegeneinander Käsekästchen spielen.+Das Erlernen ​der Spielstrategie durch den Computer mithilfe von Machine Learning. So könnten im Idealfall Mensch und Computer gegeneinander Käsekästchen spielen.
  
  
-==== Dokumentation ====+===== Dokumentation ​=====
  
-=== Wie funktioniert das Käsekästchen-Spiel===+=== So funktioniert das Käsekästchen-Spiel ===
  
 Das Spiel besteht aus einem Spielfeld, dass in kleinere Felder unterteilt ist (in unserem Fall in 9). Das Spiel wird abwechselnd in Zügen gespielt, wer am Zuge ist, muss eine Linie beanspruchen (also die Grenze zwischen zwei kleineren Feldern im Feld). Wer mit seinem Strich ein Feld schließt (also den letzten Strich um ein Feld beansprucht) oder zwei Feld schließt, gewinnt das Feld und ist sofort noch einmal am Zuge. Das Spiel endet, wenn alle Linien beansprucht wurden, gewonnen hat die Person die, die meisten Felder hat. \\ Das Spiel besteht aus einem Spielfeld, dass in kleinere Felder unterteilt ist (in unserem Fall in 9). Das Spiel wird abwechselnd in Zügen gespielt, wer am Zuge ist, muss eine Linie beanspruchen (also die Grenze zwischen zwei kleineren Feldern im Feld). Wer mit seinem Strich ein Feld schließt (also den letzten Strich um ein Feld beansprucht) oder zwei Feld schließt, gewinnt das Feld und ist sofort noch einmal am Zuge. Das Spiel endet, wenn alle Linien beansprucht wurden, gewonnen hat die Person die, die meisten Felder hat. \\
Zeile 29: Zeile 29:
 === Wie funktioniert die Implementierung in Pygame? === === Wie funktioniert die Implementierung in Pygame? ===
  
-Wir haben das spiel zunächst in drei wesentliche Elemente gegliedert Linien, Felder und eine Relation die jedem Feld die seine Linien zuordnet.+Wir haben das Spiel zunächst in drei wesentliche Elemente gegliedertLinien, Felder und eine Relation die jedem Feld die seine Linien zuordnet.
 In Python haben wir die Felder und Linien als Pygame-Sprite-Klasse (Eine Art Grundgerüst für grafische Objekte) implementiert. In Python haben wir die Felder und Linien als Pygame-Sprite-Klasse (Eine Art Grundgerüst für grafische Objekte) implementiert.
  
Zeile 43: Zeile 43:
 Pygame wird initialisiert und es öffnet sich ein Fenster für die Grafikoberfläche. Das Eigentliche Spiel läuft dann im Game-Loop ab. Hier werden mit den Event-Funktionen von Pygame die Eingaben der Spieler Erfasst. Bei einem Mausklick wird überprüft ob sich an der Position Cursors eine Linie befindet. Wenn diese Linie bisher noch nicht gesetzt ist wird ihr Zustande geändert und es werden Funktionen des Game-Objekts aufgerufen. Pygame wird initialisiert und es öffnet sich ein Fenster für die Grafikoberfläche. Das Eigentliche Spiel läuft dann im Game-Loop ab. Hier werden mit den Event-Funktionen von Pygame die Eingaben der Spieler Erfasst. Bei einem Mausklick wird überprüft ob sich an der Position Cursors eine Linie befindet. Wenn diese Linie bisher noch nicht gesetzt ist wird ihr Zustande geändert und es werden Funktionen des Game-Objekts aufgerufen.
 Anschließend wird überprüft ob sich der Zustand es Spielfelds verändert hat, ggf. der Neue Punktestand angezeigt und es wir kontrolliert ob das Spiel abgeschlossen wurde, also keine Züge mehr möglich sind. Anschließend wird überprüft ob sich der Zustand es Spielfelds verändert hat, ggf. der Neue Punktestand angezeigt und es wir kontrolliert ob das Spiel abgeschlossen wurde, also keine Züge mehr möglich sind.
-Am Ende des Game-Loops wird mit den Pygame-Grafik-Funktionen das Spielfeld angezeigt.+Am Ende des Game-Loops wird mit den Pygame-Grafik-Funktionen das Spielfeld angezeigt.\\ 
 + 
 +{{:​ws2021:​kaesekaestchen.mp4?​500|So sieht das ganze dann aus.}}
  
 === Was sind Neuronale Netze? === === Was sind Neuronale Netze? ===
  
-In unserem Fall sind mit Neuronale Netzen, künstliche Neuronale Netze (kNN) gemeint. Sie Algorithmen,​ die dem menschlichen Gehirn nachempfunden sind. Sie besteht aus Neuronen (Knotenpunkten) die miteinander verknüpft sind, dabei ist der Output des einen Neurons der Input des nächsten. Informationen,​ die von anderen Neuronen oder von außen aufgenommen wurden (bei uns durch das übergebene Spielfeld), werden modifizieren und als Ergebnis ausgeben. Dies erfolgt über drei verschiedene Schichten: den Input (Eingabeschicht),​ den Output (Ausgabeschicht) und die sogenannten Hidden-Neuronen (verborgene Schichten).\\+In unserem Fall sind mit Neuronale Netzen, künstliche Neuronale Netze (kNN) gemeint. Sie Algorithmen,​ die dem menschlichen Gehirn nachempfunden sind. Sie besteht aus Neuronen (Knotenpunkten) die miteinander verknüpft sind, dabei ist der Output des einen Neurons der Input des Nächsten. Informationen,​ die von anderen Neuronen oder von außen aufgenommen wurden (bei uns durch das übergebene Spielfeld), werden modifizieren und als Ergebnis ausgeben. Dies erfolgt über drei verschiedene Schichten: den Input (Eingabeschicht),​ den Output (Ausgabeschicht) und die sogenannten Hidden-Neuronen (verborgene Schichten).\\
  
 {{ :​ws2021:​nnetze2.jpg?​300 |Neuronales Netzwerk}}\\ {{ :​ws2021:​nnetze2.jpg?​300 |Neuronales Netzwerk}}\\
Zeile 54: Zeile 56:
  
 Neat ist eine Pythonbibliothek und funktioniert als evolutionäres Neuronales Netz. Ein evolutionäres/​genetisches Neuronales Netz orientiert sich an der Grundidee von Darwins Evolutionstheorie und wird genutzt, um Probleme zu lösen. Lösungsmöglichkeiten werden durch Individuen/​Genome beschrieben mit einer Fitness. Hierbei handelt es sich um eine reelle Zahl, die sagt aus wie effektiv ein Individuum/​Genom ist, je effektiver eine Lösungsmöglichkeit ein Problem löst des so höher ist sie(Fitness-Funktion). Im Laufe der Evolution, über mehrere Generationen verändern sich die Genome, auf Grund von Selektion, Mutation, Kombination. Parameter wie Mutationsrate,​ Generation, Population und viele weitere kann man in Neat, genau genommen in der [[https://​neat-python.readthedocs.io/​en/​latest/​xor_example.html|Konfigurationsdatei]],​ konfigurieren. Neat ist eine Pythonbibliothek und funktioniert als evolutionäres Neuronales Netz. Ein evolutionäres/​genetisches Neuronales Netz orientiert sich an der Grundidee von Darwins Evolutionstheorie und wird genutzt, um Probleme zu lösen. Lösungsmöglichkeiten werden durch Individuen/​Genome beschrieben mit einer Fitness. Hierbei handelt es sich um eine reelle Zahl, die sagt aus wie effektiv ein Individuum/​Genom ist, je effektiver eine Lösungsmöglichkeit ein Problem löst des so höher ist sie(Fitness-Funktion). Im Laufe der Evolution, über mehrere Generationen verändern sich die Genome, auf Grund von Selektion, Mutation, Kombination. Parameter wie Mutationsrate,​ Generation, Population und viele weitere kann man in Neat, genau genommen in der [[https://​neat-python.readthedocs.io/​en/​latest/​xor_example.html|Konfigurationsdatei]],​ konfigurieren.
-Um einen Besseren Überblick zu bekommen sollte man den Neat Ablauf kennen:+ 
 +Um einen Besseren Überblick zu bekommen sollte man den Neat Ablauf kennen:\\ 
 1. Initialisierung 1. Initialisierung
 - Eine Zufällige Anfangspopulation wird erstellt - Eine Zufällige Anfangspopulation wird erstellt
Zeile 71: Zeile 75:
 Multithreading ist ein Programmierkonzept das die quasi gleichzeitige Ausführung mehrerer Programmabschnitte ermöglicht. Einzelne Teilprozesse werden sogenannten Threads zugeordnet, die in einer kontrollierten Reihenfolge ausgeführt werden. So können mehrere Prozesse scheinbar parallel ablaufen, obwohl ein Kern der CPU zur gleichen Zeit nur einen einzelnen abarbeiten kann. Multithreading ist ein Programmierkonzept das die quasi gleichzeitige Ausführung mehrerer Programmabschnitte ermöglicht. Einzelne Teilprozesse werden sogenannten Threads zugeordnet, die in einer kontrollierten Reihenfolge ausgeführt werden. So können mehrere Prozesse scheinbar parallel ablaufen, obwohl ein Kern der CPU zur gleichen Zeit nur einen einzelnen abarbeiten kann.
 In Python kann diese Nebenläufigkeit mithilfe des „threading“-Moduls umgesetzt werden. In Python kann diese Nebenläufigkeit mithilfe des „threading“-Moduls umgesetzt werden.
 +
 +=== Der Computer als Gegner - Warum eine KI ? ===
 +
 +
 +Wir haben uns als Gruppe schnell für eine Künstliche Intelligenz als Lösungsansatz entschieden.
 +Unsere Gruppe hat sich vor allem durch ein gemeinsames Interesse an KI`s gebildet. ​
 +Als wir uns Auf das Projekt Käsekästchen geeinigt haben, hatten wir die Möglichkeit anstelle einer KI einen herkömmlichen Algorithmus zu schreiben.
 + Wir haben durch Recherche im Internet herausgefunden,​ dass sich das Spiel Mathematisch Lösen lässt. Demnach wäre ein Algorithmus,​ welcher das Spielfeld analysiert, die Gewinnchancen für jeden möglichen Zug errechnet und den besten ausführt, programmierbar. Sodass die Züge je nachdem ob der Algorithmus oder der Spieler beginnt, zu einem Sieg oder zumindest einem Unentschieden für den Computer führen würde.
 +Wir haben uns Allerdings dazu entschieden eine Künstliche Intelligenz zu programmieren,​ und den Mathematischen Algorithmus als Ausweichplan zu nehmen, da wir uns gerne mit dem Thema und der Programmierung einer KI auseinandersetzen wollten. Darüber hinaus erschien es uns eine größere Herausforderung eine KI zu Programmieren als einen „einfachen“ Algorithmus zu schreiben.
 +
  
  
 +=== Finale Datei ===
  
-==== Protokoll ==== +{{:​ws2021:​kaseki_finalfinal.zip|Hier}} findet ihr unsere Finale Datei, die eine KI erzeugen kann. Und in {{:​ws2021:​kase_load_ki_test.zip|dieser ZIP}} findet ihr ein Programm zum erneuten spielen gegen eine bereits abgespeicherte KI. 
-Das gesamte Protokoll findet ihr [[Protokoll| hier]].+===== Protokoll ​===== 
 +Das gesamte Protokoll findet ihr [[Protokoll| hier]] ​8-).
  
  
  
-==== Fazit ====+===== Fazit =====
 Haben wir unsere Ziele erreicht? Haben wir unsere Ziele erreicht?
  
ws2021/kaesekaestchen.1618212828.txt.gz · Zuletzt geändert: 2021/04/12 09:33 von kyrill.ho