Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1718:strukturierte_dokumentation

Strukturierte Dokumentation

Einführung

Im November 2017 kamen wir in unserem Projektlabor Mathesis zur Ideenfindung neuer Projekte. Anhand von Gruppen-brain-storming wurden schon einzelne Ideen in den Raum geworfen. Hierbei kam die gesamte Gruppe ins Gespräch über Vorstellungen und Interessen. Auf diesem Wege fanden wir uns als Projektgruppe zusammen.
Schnell kamen Diskusionen über das Thema unseres Projektes auf. Dabei war uns neben dem programmiertechnischen Aspekt, auch ein interessantes Thema wichtig. Interesse sahen wir besonders in einem uns unbekannten Themenfeld, welches jedoch aktuelle Relevanz hat. Inspiration suchten wir dabei vor allem im Internet, speziell auf Youtube. Dort stießen wir auf das Video Mar I/O. In diesem Video wird gezeigt, wie Mario, gesteuert von einem Programm, mit jedem Durchlauf mehr lernt die Welt zuerledigen.
So kamen wir schon sehr bald auf den Gedanken in unserem Projekt eine künstlichen Intelligenz zuerzeugen. Woraufhin wir nun nach spezifischen Ideen suchten, um dieses Konzept umzusetzen. Wichtig dabei war es ein Projekt zu finden, welches nicht zu einfach ist, jedoch auch nicht unsere Programmierfähigkeiten übersteigt. Erneut gab uns Youtube die finale Idee. Der Evolutionssimulator weckte unser Interesse so stark, dass die Ideen für ein eigenes Programm nur so sprudelten.
Die programmiertechnische Herausforderung einer Optimierung in Verbindung mit dem wissenschaftlichen Aspekt der Evolution schien perfekt. Die Entscheidung fiel, wir programmieren einen Evolutionssimulator.

Die Grundidee unseres Evolutionssimulators ist es Kreaturen zuerschaffen, die alle in Spezien mit unterschiedlichen Eigenschaften unterteilt sind. Die Spezien untereinander zeichnen sich durch unterschiedliche Schrittlänge und Richtungsänderung aus. Wir lassen unsere Spezien in einem Umfeld voller Hindernisse aus. Dabei kollidieren und sterben sie sowohl an den Hindernissen, als auch an den Rändern des Umfeldes. Alle Kreaturen werden am Ende einer Generation durch ein Rating bewertet. An Hand dieses Ratings können wir nun erkennen, welche Kreaturen sich besonders gut verhalten haben. Die besonders guten Kreaturen vererben darauf hin ihre guten Eigenschaften mit einer gewissen Möglichkeit zur Mutation an die jeweils nächste Generation.

An dieser Stelle wollen wir den Bezug zu den bekannten Evolutionstheorien ziehen.
Größtenteils ist unsere Simulation an die Theorie Lamarcks angelehnt. Er ging davon aus, dass Organismen Eigenschaften an ihre Nachkommen weiter geben können. Diese Eigenschaften wären in unserer Simulation der Weg einer Kreatur. Desto besser diese Eigenschaften sind bzw. der Weg einer Kreatur bewertet wird, umso mehr setzen sich diese in den nächsten Generationen durch.
Einen zusätzlichen Blickwinkel liefert uns Darwins Evolutionstheorie. Er nimmt dabei verschiedene Aspekte an. Die für unsere Simulation wichtigen Aspekte seiner Theorie sind die Variation, Selektion und Vererbung. Nach Darwin ist eine Population nie gleich, sondern unterscheidet sich in mehreren Merkmalen. So wie sich unsere Spezien in den speziellen Merkmalen unterscheidet. Hinzu kommt, dass Organismen, die zufällig besser angepasst sind an den Lebensraum, ihre Gene verhäuft in die nächste Generation vererben. Parallel dazu lässt sich in unserer Simualtion das Rating beschreiben. Die Kreaturen, die zufällig einen besseren Weg wählten, setzen sich in der nächsten Generation besser durch.
Zu guter Letzt haben unsere Kreaturen immer eine gewisse Rate zur Mutation. Solange diese Mutation sich positiv auf den Weg unserer Kreaturen auswirkt, setzen sich die mutierten Gene/ Eigenschaften besser in den kommenden Generationen durch.

Zusammenfassend können wir unseren Evolutionssimulator als Mischung beider Evolutionstheorien betrachten. Um dies besser nach zu vollziehen, werfen wir zunächst einen Blick auf den Code.
Unser Programm besteht aus zwei Codes. Im Vordergrund steht der Hauptcode creatureV2.py. Er ist für die Erstellung, Bewegung, Bewertung und Vererbung der Kreaturen zuständig. Der eigentliche Visualisierungscode pygamevisuV2.py greift hierbei auf den Hauptcode zu. Mit ihm ist es uns möglich die Simulation grafisch darzustellen.


Ausführliche Beschreibung beider Codes

Verlauf der Projektarbeit

Die Anfänge unseres Projektes sind sehr gut unserem Konzeptblatt zu entnehmen. Schaut man sich dieses an, wird schnell klar, dass es zu Anfang viele substanzielle Fragen für unser Projekt zu klären gab. Dabei musste von dem Fortbewegungskonzept bis hin zur Definition des Sterbens alles diskutiert werden.
Ursprünglich haben wir zwecks Strukturierung unserer Arbeitsphasen einen Zeitplan 1) erstellt, in den wir jeden Labor-Termin vermerkt und uns vorgenommen haben, jede Woche Aufgaben für die nächste Woche festzulegen. Wie das so oft mit frühen Ideen geschieht, haben wir nach dem erstem Mal keine Eintragungen in den Zeitplan gemacht und die „Hausaufgaben“ zur nächsten Labor-Stunde mündlich abgemacht.
Als unser Projekt noch in den Kinderschuhen steckte, einigten wir uns zudem nicht auf eine klare Arbeitsteilung und entschieden uns statt dessen alle Schritte bis zur Vollendung des Projekt vorerst gemeinsam auszuführen, da wir z.T. vor dem Programmierkurs zu Beginn des Semesters noch nie programmiert hatten und erst eine Gruppendynamik einkehren musste.
Die Arbeit an beiden Codes erforderte viel Einarbeitung. So mussten wir uns zu Beginn noch ausführlich über Klassen und Python Pakete wie NumPy, Turtle und PyGame informieren, ohne die unser Code in seiner jetzigen Form nicht existieren könnte.
Während wir die Eigenschaften der Kreaturen, die Rating-Kriterien, die Fortbewegung (Schatzsuche-Prinzip) vergleichweise früh im Projekt festgelegt und zu einem großen Teil so beibehalten haben, gab es vor allem bei der Vererbung und dem damit verbundenen Rating viele Stolpersteine, die überwunden werden mussten. Der Beginn der Programmierung des Vererbungsmechanismus markierte auch unsere Aufteilung in zwei Untergruppen, da an diesem Punkt die Zeit langsam knapp wurde und das Herzstück des gesamten Programms noch nicht programmiert wurde. So übernahm Lorenz die Programmierung am Hauptcode und Lena und Daphna den Visualisierungscode und die künstlerische Gestaltung. Dies war auch der einzige Punkt im gesamten Projekt, an dem die Motivation der Teilnehmer gleichermaßen niedrig lag, da so große und bedeutende Abschnitte einer Projektarbeit ihre entmutigende Wirkung haben.
Diese Demotivation löste sich jedoch mit den nächsten Fortschritten im Hauptcode. Ansonsten herrschte stets eine sehr angenehme und motivierte Arbeitsatmosphäre geprägt von gegenseitiger Unterstützung und Verständnis.
Eine andere mit der Vererbung verbundene Fragestellung war die Wahl des Selektionssmechanismus. Dieses Thema bot viel Diskussionspotential, da Python eine große Menge an Paketen für Neuronale Netze bietet und auch das Bayes'sche Netz in Frage kam. Angesichts er Tatsache, dass wir unter Zeitdruck standen und unser eigens entworfener Selektionscode vielversprechende Ergebnisse lieferte, entschieden wir uns, diesen auszubauen und kein bekanntes Konzept zu adaptieren.
Im Visualisierungscode gab es ebenfalls viele Entscheidungen zu treffen. So entschieden wir uns für ein bei einer solchen Art von Projekten eher untypischen Art-Style und beschlossen, die künstlerische Gestaltung selbst in die Hand zu nehmen, um die Übersichtlichkeit und Benutzerfreundlichkeit unseres Programms zu erhöhen. Dabei wurden Mind-Maps 2) für die Arten der Kreaturen, deren Farbgebung und das Design des Umfeldes erstellt. Des Weiteren mussten Konzepte zur Ausgabe unserer verschiedenen Counter-Variablen gefunden werden, woraus die Idee mit der Balkendarstellung entstanden ist.
Die Aufteilung in Untergruppen hatte ebenfalls zur Folge, dass der Hauptcode lange Zeit nicht auf den Visualisierungscode abgestimmt war. Dieses Problem lösten wir im Laufe der Blocktermine, indem wir uns wieder als ganze Gruppe wie zu Beginn zusammenfanden. Die Zusammenarbeit außerhalb der Laborzeiten hat der Datenaustausch über die TubCloud erheblich erleichtert, wobei bei einer größeren Anzahl an Teilnehmern die Menge an neuen Code-Versionen wahrscheinlich schnell unübersichtlich geworden wäre.
Zum Ende der drei Blocktermine hatten wir eine vollkommen illustrierte Map und einen funktionierenden Selektionsmechanismus, die wir in der Präsentation 3) unseren Kursmitgliedern vorstellen konnten. In der Vorlesungsfreien Zeit nahmen wir uns die Kritikpunkte unserer Dozenten vor und haben nun einen komplett überarbeiteten und besser strukturierten Hauptcode mit einem kompatiblen bug-freien Visualisierungscode fertiggestellt.
Abschließend lässt sich zum Verlauf der Projektarbeit sagen, dass, obwohl die Projektarbeit nicht zu 100% strukturiert verlief, das gute Arbeitsklima und die hohe Motivation aller Beteiligten zu einer effizienten Arbeitsweise und zu Letzt zu einem Endprodukt geführt hat, auf das wir alle stolz sind.


Fazit/Ausblick

Wie man im Projektverlauf erkennen kann, entwickelte sich unser Projekt und dessen Strukturen ständig. Immer wieder verwarfen wir Ideen und bauten neue mit in unser Konzept ein. So wurden auch Entscheidungen getroffen, die vorher nicht absehbar waren, oder endlose Diskussionen geführt, die zur Stagnation führten.
Genau das macht dieses Projekt aus. Eine anhaltende Entwicklung und Verbesserung des Codes, die zu mehr spannenden Fragen führten. Daraus zogen wir selbst ständig neue Motivation mehr Arbeit in dieses Projekt zustecken. Demnach haben wir heute auch einen Code auf den wir stolz sein können. Unser Ziel eine Evolution zu simulieren und diese visuell darzustellen, haben wir erreicht.
Dabei haben auch unsere persönlichen Ziele, wie die Weiterbildung im Programmieren und eine Auseinandersetzung mit neuen, aktuellen Themen, Erfüllung gefunden. Das Projekt bat eine gute Basis gemeinsam an einem Ziel zuarbeiten und sich dabei auf den unterschiedlichsten Ebenen weiter zubilden.
Vor allem aus diesem Grund finden wir immer wieder neue Motivation zur Weiterentwicklung unseres Programms. Momentan liegt diese vor allem im Visualisierungscode. Die größte Baustelle ist dabei den Code effizienter und flexibler zu machen. Dazu gehört eine ähnliche Umstrukturierung und Parametisierung, wie im Hauptcode. Aber auch Kleinigkeiten, wie eine flexible Fenstergröße gehören zu den Baustellen des Projekts.
Unter Evolution versteht man eine allmähliche Weiterentwicklung der Merkmale einer Population. Man kann unser Projekt nun als solche ansehen. Die erste Generation hat nun ihr Ende erreicht und somit seid nun auch ihr herzlich eingeladen an diesem Projekt mit zuwirken. Wir vererben euch hier alle nötigen Codes und Programme. Macht dieses Projekt zu eurem und lasst eurer Kreativität freien Lauf. Wir hoffen auf eure Inspiration, die zu einer aufregenden Weiterentwicklung des Programms führen.
In diesem Sinne verabschieden wir uns als Gruppe des Evolutionssimulators und wünschen euch viel Erfolg!


Unsere verwendeten Python Pakete

  • numpy==1.13.1
  • pygame==1.9.2a0

Unsere Programme für Python 2.7

Stand: 07.04.2018genairation.zip


Quellen

Für die Visualisierung mit Pygame...

Als Lehrmaterial und für die Erklärung in der Doku...

ws1718/strukturierte_dokumentation.txt · Zuletzt geändert: 2018/04/18 18:44 von lenarost