Dies ist eine alte Version des Dokuments!
Block 1
Block 2
Block 3
Block 4
Block 5
Block 6
Block 7
Block 8
Block 9
Zwischendrin
Vortrag
Block 10
Blockveranstaltung Tag 1
Blockveranstaltung Tag 2
Blockveranstaltung Tag 3
Die Protokolle sind bei uns wie eine Art kleines „Tagebuch“. Die genaueren Informationen, wie unser Projekt funktioniert, befindet sich in der Projektdokumentation, in diesem Abschnitt geht es eher darum, wann wir was auf welche Weise gemacht haben.
Heute haben wir mit der Gruppenfindung für die Projekte begonnen. Zum Ende der Stunde hin haben wir uns in einer 5er Gruppe zusammengefunden, mit dem Ziel eine Evolutionssimulation mit interagierenden Lebewesen (Tiere und Pflanzen) zu erstellen. Wir überlegten uns den Namen „Crowing World“ um den Krähen, die es leider nicht geschafft haben ein eigenes Projekt gewidmet zu bekommen, trotzdem noch den ihren gebührenden Respekt zu geben. Wir legten unsere Mathesis Wiki Seite an und begannen erste, noch etwas konzeptlose Gespräche über die Ausführung des Projektes. Wir einigten uns außerdem darauf, für das Zusammenarbeiten an Codes uns eine GitLab-Seite zu erstellen.
Nachdem wir im Tutorium am 27.11.2024 eine Einführung in GitLab erhalten haben, starteten wir heute mit der Projektplanung und groben Aufgabenaufteilung. Wir einigten uns darauf, eine 2D Umgebung für unsere Lebewesen zu erstellen und legten uns auf die Tierarten Fliege, Hirschkäfer, Ameise, Hase, Krähe, Fuchs und Uhu und die Pflanzenarten Gras, Kirschbaum und Blaubeerstrauch fest, um ein funktionierendes Nahrungsnetz mit wenigen Arten zu erschaffen. Wir teilten uns in zwei Gruppen auf: Gruppe 1 (David und Ben) für die Erstellung der Welt, in der die Individuen sich bewegen sollen und Gruppe 2 (Kolja, Semjon, Pauline) für die Erstellung der Lebewesen und ihrer Eigenschaften. Wir besprachen außerdem wichtige Strukturen der Simulation: Welche Aspekte wollen wir besonders realistisch darstellen? Wie verläuft die Zeit in unserer Simulation? Wollen wir unseren Fokus auf die Interaktion zwischen den Lebewesen legen, oder auf den Aspekt der Fortpflanzung und Evolution? Wie einigten uns darauf, erstmal den Fokus auf Bewegung der Individuen zu legen und uns auf eine kleine Zeitskala zu fokussieren. Um Fortpflanzung und Evolution kümmern wir uns erst, wenn das Projekt auf der kleinen Skala funktioniert, und noch genug Zeit übrig ist.
Nachdem dies besprochen war, begannen wir mit der Arbeit in den Gruppen. Gruppe 1 begann mit dem groben Aufbau der Welt mit pygame und begannen, die Grundstrukturen zu lernen. Gruppe 2 begann, allgemein geltende Attribute und Eigenschaften der Lebewesen zu erstellen, individuelle Werte für diese rauszusuchen und ihre Beziehungen zueinander festzulegen.
Heute begannen wir wieder mit der Arbeit in den Gruppen. Semjon wechselte in Gruppe 1. Diese endschied sich, die Visualisierung von „Crowing World“ doch mit Pyglet zu erstellen. Eine vorläufige Konstruktion einer Simulationsumgebung mit grün= Land und blau= Wasser entstand.
Gruppe 2 verbesserte und vereinheitlichte die gesammelten Daten der Lebewesen, begann mit dem Erstellen von Klassen und machte einen vorläufigen Entwurf eines Hasen. Dieser wurde von Gruppe 1 direkt in die Welt mit eingebunden und so hat sich unser erstes Lebewesen in unserer noch sehr simpel gehaltenen Welt bewegt.
Alz Ziel setzten wir uns, dass unsere Simulation eine Liste mit den Individuen als Map in eine Datei zurückgibt, was daraufhin von dem Visualisierungsprogramm Pyglet ausgelesen und visualisiert wird.
Heute waren wir (krankheitsbedingt) nur zu dritt und hatten Probleme mit einem unserer Computer, der sich weigerte anzugehen und immer wieder einen Blue Screen zeigte. Versuche, das Problem zu beheben und den Computer mit einem Stick von Stefan über Linux zu starten kosteten so viel Zeit, dass es sich einen Platz im Protokoll verdient hat. Vorallem, weil das Problem (uns) schon vorher begegnete und noch weitere Stunden begleiten würde… Abgesehen von den technischen Problemen kümmerten wir uns heute weiter um das Erstellen von der Klasse „Tier“, schrieben Definitionen für die Eigenschaften der Tiere und und begannen damit, Unterklassen für jede Tierart zu erstellen. Wir überlegten außerdem gemeinsam, wie die Tiere aufeinandertreffen sollen, wie sie sich in bestimmten Situationen verhalten sollen und wie man das Besprochene in einem Code umsetzen könnte.
Heute begannen wir damit, unsere mittlerweile zahlreichen Variablen und Codes ein wenig anzugleichen. Wir erstellten unsere erste gemeinsame Datei und luden sie auf GitLab hoch. Gruppe 1 machte die Simulationsumgebung bereit für Datenimport und recherchierte über graphische Darstellungen von Pyglet mit OpenGL zum rendern der Grafik. Gruppe 2 arbeitete weiter an der Unterklasse der Tiere und erstellte einen Code, der jedem generierten Lebewesen einen Wert aus Datenspanne eines bestimmten Attributs zufällig zuweist, sodass die erstellten Individuen sich unterscheiden und Stärken/Schwächen in unterschiedlichen Bereichen haben. Außerdem begann sie mit dem grafischen Entwurf weiterer Lebewesen.
Unsere Gruppenstruktur hat sich mittlerweile etwas aufgelöst und jeder arbeitet an einer eigenen Sache. Heute haben wir über das Bewegen von Objekten in Pyglet mit OpenGL recherchiert. Die zufällige Generation von Tier-Attributen wurde abgeschlossen, weitere Sprites wurden erstellt. Wir haben weiter an dem Verhalten der simulierten Tiere gearbeitet und Food- und Waterlevel für jedes Individuum erstellt, welche anzeigen wann ein Tier sich neue Essens- und Wasserquellen suchen muss. Die Tiere berechnen in jedem Simulationsschritt den Abstand zu Wasser, Essen und anderen Tieren und entscheiden dann anhand der Level, was sie am meisten benötigen. Außerdem haben wir einen rudimentären Algorithmus zum Spawnen von Tieren in Gruppen erstellt.
Heute arbeiteten wir an der Verbindung des Simulationsskripts mit einem Datengenerierungsskript. Nun erscheinen die Lebewesen nun auch auf der grafischen Oberfläche. Ein Problem ist jedoch noch, dass die Tiere auf der grafischen Oberfläche viel zu klein erscheinen, dadurch kann man sie nicht auseinanderhalten. Deshalb begannen wir zu recherchieren, ob es eine Möglichkeit gibt, die grafische Oberfläche heran zu zoomen oder auf ihr zu scrollen.
Heute arbeiteten wir weiter am Spawn-Algorithmus und dem Speichern der Daten in Dateien. Die endgültige Zusammenführung von verschiedenen Tierverhalten Dateien, die im Grunde das gleiche beinhalteten, gelang uns. Außerdem begannen wir mit einer ordentlichen und strukturierten Dokumentation und schrieben unsere bisher stichpunktartigen Protokolle in vollen Sätzen auf.
Heute kümmerten wir uns darum, dass alle fundamentalen Dateien auslesbar sind. Wir erstellten die Klasse der Pflanzen und spezialisierten den Spawn-Mechanismus auf das zufällige Erstellen von Wasserflächen. Wir kommentierten die Funktionen, die vorher teils noch etwas unübersichtlich waren, damit deren Funktionsweise und Ziel auf den ersten Blick klar wird, dabei überarbeiteten wir den Code auch ein wenig. Außerdem gelang uns diese Stunde das Integrieren von Zoomen und Scrollen in unserer Visualisierung. Scrollt man jedoch zu weit, stößt man auf einen schwarzen Hintergrund. Daran wollen wir nächste Stunde arbeiten, indem wir das Scrollen auf die Größe der grafischen Oberfläche beschränken. Durch das Scrollen und Zoomen konnten wir unsere Simulationsoberfläche um einiges vergrößern. Wir skalierten nun die Grafiken der Lebewesen und Pflanzen alle auf eine gemeinsame Größe(50*50 px). Bisher hatten wir im Code damit gearbeitet, dass jedes Lebewesen 1px groß ist, dann könnte man jedoch die Tiere nicht erkennen. Bei unserer gewählten Größe ist auch im herangezoomten Zustand die Grafik des Lebewesens gut zu erkennen. Ein Nachteil an der Einheitlichkeit ist, dass nun alle Lebewesen, auch die Fliege und der Kirschbaum, gleich groß sind. Das ist natürlich nicht sehr realistisch, aber für unsere Zwecke erstmal ausreichend und einfacher zu programmieren.
Grafische Oberfläche mit zwei Füchsen im Herausgezoomten Zustand
Grafische Oberfläche mit zwei Füchsen im Herangezoomten Zustand
Heute wurde am Anfang eine Gruppe ausgelost, die ihr Projekt im Wissenschaftsfenster am 10.02. vorstellen soll. Da sich niemand freiwillig gemeldet hat, wurde gelost, und wir waren die (Un)glücklichen. Daher verbrachten einige Zeit damit, eine PowerPoint über unser Projekt zu erstellen. Gleichzeitig arbeiteten wir aber auch weiter an der Meeting Funktion von Tier-Tier und Tier-Pflanze, verbesserten einige kleine Fehler und bauten einen Scroll-Stopp in unsere Simulationsumgebung ein, so dass man nicht mehr über die Kanten der im Code auftretenden Fläche heraus sehen kann.
Gliederung unseres Vortrages
Motiviert durch den bevorstehenden (oder eher drohenden) Vortrag arbeiteten wir übers Wochenende gemeinsam und auch einzeln an unserem Projekt weiter, damit wir am Montag auch etwas Vorführbares haben würden. Wir haben alle Dateien miteinander verbunden, so dass eine Tiere und Pflanzen mit zugehörigen Datenlisten auf der grafischen Oberfläche zu sehen sind. Weiter kümmerten wir uns darum, dass diese sich nun auch bewegen und interagieren können. Der Code davon war größtenteils schon geschrieben, und musste nur noch richtig eingegliedert werden.
Bis zum Tag des Vortrages hatten wir die Simulation zum Laufen bekommen. Dabei traten jedoch noch ein paar Probleme auf: Es wurde immer nur ein kleiner Ausschnitt des Simulationshintergrundes auf dem Laptop gezeigt, und nur in diesem Ausschnitt wurden Pflanzen erzeugt. Viele Tiere, besonders die schnellen, wie z.B. der Hase, sind schnell aus dem sichtbaren Feld gelaufen und für den Betrachter dann verschwunden, obwohl sie noch lebten. Jedoch lebten sie dann außerhalb des sichtbaren Feldes nicht wirklich lange, da es ja dann dort keine Pflanzen gab, die sie essen könnten. So kam es, dass am Ende eine große Anzahl Ameisen (und ein Uhu) überlebt: Die Ameisen sammelten sich auf Punkten an Wasserstellen, um sich zu vermehren, und liefen dann immer zwischendurch zu Pflanzen. Da eine Ameise nicht ein ganzes Grasbüschel auf einmal frisst, konnten viele Ameisen vom gleichen Stück Gras überleben, und da es noch keine Begrenzung für das Food-Level gibt, konnten die Ameisen von einer Fresseinheit deutlich länger überleben als sie sollten. Dieses Problem, und die unten, auf einem Ausschnitt der PowerPoint, aufgelisteten Punkte wollen wir versuchen, die nächste Zeit in Bearbeitung zu nehmen.
Erstmal haben wir uns heute (mit mehr oder weniger Erfolg) darum gekümmert, dass die Simulation auf allen Computern läuft, da sie bisher nur auf Bens vollständig war. Das hat jedoch leider nicht so gut funktioniert, wie wir es erhofft hatten. Außerdem haben wir daran gearbeitet, dass man komplett rauszoomen kann, aber nur im heran gezoomten Zustand auch scrollen kann. So kann man die ganze Simulation betrachten, und an ausgewählte Szenen heranzoomen. Viel mehr haben wir gar nicht geschafft, da die anderen Gruppen ihre Projekte vorgestellt haben.
Heute hatten wir als Hauptziele die Visualisierung von Wasser und den Umgang der Lebewesen damit und haben mit der Projektdokumentation begonnen. Wir haben weitere Teile des Codes kommentiert, heute das Zoomen und Scrollen. Zusätzlich zu der Visualisierung des Wassers haben wir noch verschiedene Icons für Bewegungen nach rechts/links und verschiedene Icons für den Flug und das am Boden sein von Fliege, Krähe und Uhu eingeführt. Damit diese Icons auch zum Einsatz kommen können, haben wir heute außerdem die Flugfähigkeit so bearbeitet, dass es einen Unterschied der Sichtbarkeit der Tiere zwischen Land und Luft gibt, und fliegende Tiere auch landen, wenn sie von „oben“ Beute oder Wasser sehen. Dann haben wir nochmal eine Simulation mit den Veränderungen durchlaufen lassen und konnten feststellen, dass diesmal weniger Ameisen am Ende da sind und auch ein paar andere Individuen überlebt haben.
Da nun eigentlich fast alles an Code, was wir brauchen, in unserer Simulation integriert ist , haben wir uns heute an die Optimierung des Codes gesetzt. Das Raus- und Reinzoomen auf die Simulation funktioniert zwar jetzt super, und auch beim Rauszoomen ist die Grasfläche mittig auf dem Computerbildschirm, jedoch spawnen die Tiere und Pflanzen auch außerhalb der Grasfläche. Deshalb haben wir uns heute nochmal an das Spawnen und das Zoomen rangesetzt, um dieses Problem zu lösen. Ebenfalls haben wir die Parameter der Verschiedenen Tierarten angepasst, um die Dominanz der Ameisen wenigstens zu reduzieren. Nun brachten verschiedene Simulationsdurchgänge mit dem gleichen Code auch verschiedene Ergebnisse, mal überlebten die Krähen (passend zu unserem Projektnamen), mal waren aber auch nach 400 Simulationsschritten noch fast alle Tierarten vertreten.
Wir haben uns heute also nochmal an die Parameter gesetzt und dafür erstmal eine kleine Statistik mit ein paar Simulationen durchgeführt , um herauszufinden, welche Parameter genau wir anpassen müssen. Wir hatten geplant, das 10 mal zu machen. Es hat jedoch alles länger gedauert als gedacht, da wir zwischendrin so viel an Simulationsoberflächengröße, Tieranzahl, Sichtweite, Wasserstellenanzahl und Pflanzenanzahl herumgespielt haben, dass zwischendrin immer wieder Fehler oder Optimierungsmöglichkeiten aufgefallen sind, die wir dann erst behoben haben. Weiterhin gab es das Problem, dass nicht auf allen Computern die Simulation funktionierte, obwohl wir mit den gleichen Dateien arbeiten. Ein Problem bei der Visualisierung war uns schon länger bekannt: wegen verschiedenen Pyglet-Versionen muss man beim Ausgeben einer Matrix entweder ein Sternchen setzen oder nicht. Vielleicht gibt es noch weitere, bisher unentdeckte Probleme dieser Art. Außerde ist uns beim Erstellen der Statistik aufgefallen, dass wir unbedingt eine Verkürzung der Laufzeit brauchen. Da bisher jedes Tier in jedem Simulationsschritt jedes Objekt betrachtet und berechnet, wohin sie als nächstes gehen/fliegen wollen, steigt die Anzahl der Überprüfungen Objekt exponentiell, so dass wir teilweise üer eine halbe Stunde darauf warten mussten, und die Simulation immer noch nicht fertig war. Dies war zum Beispiel der Fall, als wir das Feld und die Anzahl der Individuen vergrößert hatten und nur noch die Fliegen und Ameisen lebten, und sich rasant vermehrten. Deshalb arbeiteten wir heute daran, eine Version des Codes zu erstellen, bei dem nicht jedes Tier jedes Objekt abcheckt, sondern nur die in der individuell festgelegten Sichtweite. Für eine bessere Auswertung der Simulation begannen wir außerdem mit dem Erstellen einer „Snapshot“-Funktion, die für jedes Individuum einige Daten festhält, zum Beispiel wie viele Simulationsschritte es überlebte, wie viel es gegessen hat und wie oft es sich gepaart hat.