Predator and Prey - Eine Evolutionsgeschichte von Schwärmen

Ein Projekt entstanden während der
Deutschen SchülerAkademie Braunschweig II 2012
Kurs 2.1 Simulierte Natur

Alexandra Haake, David Haller, Marvin Hofmann, Tim Stelzig

1 Biologischer Hintergrund

In der Natur findet man viele verschiedene Schwärme, zum Beispiel bei Vögeln, Fischen oder Insekten. Diese zeichnet die Fähigkeit aus, in der Gemeinschaft etwas Größeres zu erreichen, das einem Einzelnen unmöglich wäre. Die Besonderheit liegt allerdings darin, das sich keiner der Beteiligten bewusst dazu entschieden hat. Ganz im Gegensatz zu ”Teamwork” ist hier ein System gemeint, dass sich selbst ohne oberste Aufsicht organisiert. Es gibt weder Absprachen oder Vorgaben noch eine Hierarchie. Jeder folgt seinen artenspezifischen Verhaltensregeln und trägt damit dennoch zum Gesamtwohl des Schwarms bei. Wenige einfache Verhaltensregeln definieren die gesamte Struktur, diese lassen sich auf drei treibende Kräfte reduzieren: Anziehung (Pull), Dichte (Push), Ausrichtung (Rejoin). Durch diese Kräfte entsteht die Emergenz eines Schwarms.
Das Prinzip des Schwarms ist in der Natur so erfolgreich, weil das hohe Maß an Selbstorganisation Schwärme so anpassungsfähig macht. Sie können sich schnell auf neue, ungewohnte Gegebenheiten einstellen und sich in die neue Situation einfügen - um den Physiker Andrea Cavagna zu zitieren:
Die Evolution hat diejenige Regel ausgewählt, die sich bei Angriffen von außen als Widerstandsfähigste erwiesen hat [1]

2 Ziele des Projektes

Die Evolution von in solchen Schwärmen organisierten Lebewesen lässt sich auch am Computer simulieren. Dabei kann man Emergenz daran feststellen, dass die Lebewesen Verhalten zeigen, dass gar nicht explizit programmiert wurde. Das fertige Programm soll die Möglichkeit bieten, alle relevanten Parameter möglichst einfach einstellen zu können. Den Lebewesen soll man über eine Animation bei ihrem Treiben zusehen können, zusätzlich werden Veränderungen an den Werten aufgezeichnet und in einem Diagramm veranschaulicht.

3 Implementierung

Das Programm wurde in Python 2.7 umgesetzt, als Bibliotheken kamen pygame, matplotlib und numpy zum Einsatz. Grundlage bildete ein Tutorial zu pygame[2] - eine Simulation, in der Jäger verschiedene Arten von Beute jagen. Diesen Code wurde in Folge des Projektes modifiziert. Zuerst erfolgte eine Modularisierung, um die Simulation möglichst mit geringem Aufwand flexibel zu halten. Es wurde nicht mehr zwischen Jägern und Beute unterschieden; stattdessen gab es nur noch Akteure. Jeder Akteur erhielt ein Verhaltensattribut, welches das artenspezifische Verhalten für die Dauer der Simulation festlegt, etwa welche Beute gefressen werden soll und vor welchen Feinden es sich in Acht zu nehmen gilt. Hinzu kommt eine DNA, welche weitere Eigenschaften wie Sehschärfe, Geschwindigkeit, oder Lebensenergie festlegt. Die DNA wird bei jeder Fortpflanzung durch einen genetischen Algorithmus verändert, wodurch Evolution simuliert wird, da die am besten angepassten Akteure überleben.
Die Funktionalität wurde auf sieben Module aufgeteilt. Die Klasse Actor beschreibt allgemein einen Akteur, wie einen Adler oder eine Fliege. Jeder Actor hat eine Position (pos) und eine Bewegungsrichtung (direction), ist in einem Status, der entweder wait (keine Beute oder Feinde in Sicht), explore (Nahrungssuche), run (Flucht), hunt (Jagd), oder lewd (Paarung) sein kann. Ist ein Akteur auf der Jagd, hat er auch ein Ziel (target). Um was für einen Akteur es sich handelt, legt ein Objekt fest, dessen Typ eine Subklasse von Behavior ist, die DNA implementiert die genetischen Algorithmen. Die Klasse Plot kümmert sich um da Zeichnen des Graphen durch matplotlib, während vec2d einen Vektor implementiert.
Zu Beginn der Simulation werden zufällig verschiedene Akteure über das Spielfeld verteilt, es aber auch möglich, dass der Benutzer selbst Akteure hinzufügt (Linksklick erzeugt einen Vogel, Rechtsklick einen Adler). Die Simulation läuft single-threaded in einer großen Schleife. Nach jedem Schritt verliert jeder Akteur abhängig von seinem Status an Energie, trifft er auf Beute, erhält er zusätzliche Energie, tritt er auf einen Artgenossen, paart er sich.
Jeder Akteur sucht sich sein Ziel, dass sowohl von den Zielen in Reichweite als auch von der Präferenz des Akteurs bestimmt wird, denn die DNA legt die Strategie fest, ob etwa die Nahrungsaufnahme oder die Fortpflanzung wichtiger ist. Die für die Situation am besten geeignetste Strategie setzt sich durch; wie in der Natur paaren sich auch hier die erfolgreichsten Akteure, dadurch wird eine Evolution erzeugt.
Akteure gleicher Art können sich zu Schwärmen zusammenschließen, um etwa in der Gruppe zu jagen. Durch die DNA wird die swarminess festgelegt, also wie gerne sich ein Akteur einen Schwarm anschließt oder ob er es lieber alleine versucht.

4 Ergebnisse

Das erklärte Ziel, Emergenz festzustellen, wurde erreicht. Beispielsweise halten sich Fliegen gerne in der Nähe von Adlern auf, um sich vor den Vögeln zu verstecken. Zwar werden Fliegen auch von Adlern gefressen, jedoch sind die Adler langsamer als die gewöhnlichen Vögel, sodass die Überlebenschancen steigen. Weiterhin können langsamere Tiere Tiere mit höheren Geschwindigkeiten in die Ecke drängen und so den Nachteil ausgleichen. Es sind viele weitere beobachtbare Effekte denkbar.
Abbildung predatorandprey_plot_1.png
Abbildung 1 Anzahl der Akteure zur Zeit
Abbildung predatorandprey_plot_2.png
Abbildung 2 Durchschnitts- und Maximalenergie von Vogel und Fliege zur Zeit
Abbildung predatorandprey_plot_3.png
Abbildung 3 Durchschnitts- und Maximalenergie insgesamt und von Adler zur Zeit

5 Download

Ein Download [3] des Quelltextes ist über die Projektseite möglich.

Literatur

[1] Peter Miller, Die Intelligenz des Schwarms, S.172-173, ISBN:978-3-593-38942-4

[2] Eli Bendersky, "Writing a game in Python with Pygame. Part I", http://eli.thegreenplace.net/2008/12/13/writing-a-game-in-python-with-pygame-part-i, Programm abgeändert von David Grellscheid

[3] http://swarm.marv-productions.de/