evolution.naepflin.com
Ivo Näpflin, 10.11.2004    Valid HTML 4.01!     Valid CSS!     Navigation: eine Ebene nach oben, Sitemap

Dokumentation: Artbildung in einer Computersimulation

Inhaltsverzeichnis

1 Vorwort

1.1 Themenwahl

1.2 Danksagungen

2 Einleitung

2.1 Allgemeine Probleme bei der Erforschung der natürlichen Evolution

2.2 Ziel dieser Arbeit

2.3 Umfang

2.4 Methoden

3 Theorie

3.1 Mechanismen der natürlichen Evolution

3.1.1 Einführung

3.1.2 Mutation

3.1.3 Selektion

3.1.4 Genvermischung

3.1.5 Isolation

3.2 Artbildung

3.2.1 Definition Art

3.2.2 Zusammenspiel von Mutation, Selektion, Genvermischung und Isolation

4 Die Simulation

4.1 Einführung

4.2 Funktionsweise

4.3 Genauer Programmablauf

4.3.1 Vorbereitungen

4.3.2 Aussetzen der Tiere

4.3.3 Starten der Simulation

4.3.4 Zugberechnung der Tiere

4.3.5 Essen

4.3.6 Fortpflanzung

4.3.7 Warten

4.3.8 Sterben

4.3.9 Aussterben

4.4 Mechanismen der Evolution in der Simulation

4.4.1 Einführung

4.4.2 Mutation

4.4.3 Selektion

4.4.4 Genvermischung

4.4.5 Isolation

4.5 Artbildung in der Simulation

4.5.1 Definition Art in der Simulation

4.5.2 Definition für erfolgreiche Artbildung in meiner Simulation

4.6 Ergebnisse

5 Zusammenfassung

6 Schlusswort

7 Anhang

7.1 Technische Daten der Simulation

7.1.1 Systemanforderungen

7.1.2 Programmierplattform

7.2 Quelltext der Simulation

7.2.1 Einführung

7.2.2 Objektorientiertes Programmieren (OOP)

7.2.3 Erklärung der einzelnen Klassen der Simulation

7.2.4 Quelltext

7.3 Experimente

7.3.1 Einführung

7.3.2 Experimente

7.4 Quellenverzeichnis

7.4.1 Evolution

7.4.2 Programmierung

7.4.3 Webquellen

7.5 Glossar


Ich möchte Sie noch darauf hinweisen, dass kursiv gedruckte Fachausdrücke im Glossar kurz erklärt sind.

1 Vorwort

1.1 Themenwahl

Die Themenwahl für die Maturaarbeit wird oft als der schwierigste Teil der Arbeit bezeichnet. Ich habe sie eher als Vergnügen, nicht als Arbeit empfunden: Mir stand das ganze Spektrum der Wissenschaft offen und ich hatte (fast) völlige Freiheit in meiner Wahl.
Die Idee, ich könnte ein Computerprogramm schreiben, das künstliche Lebewesen und ihre Evolution simuliert, hatte ich bereits vor der eigentlichen Themenwahl gehabt. Jedoch hatte ich damals nicht unbedingt an eine Realisierung des Projekts gedacht.
In der Maturaarbeit habe ich eine Möglichkeit gesehen, diese Idee in die Praxis umzusetzen. Die Tatsache, dass ich gerne programmiere und mich die Themen Evolution und Entwicklung von Lebewesen interessieren, hat mich schlussendlich dazu gebracht, dieses Gebiet zu thematisieren.

1.2 Danksagungen

Auf dem Weg von der Themenwahl zur Fertigstellung dieser Arbeit haben mich verschiedene Personen unterstützt. Ich möchte diesen Personen hiermit herzlich danken. Meinem Mentor Arthur Bachmann danke ich für seine Unterstützung und Wegleitung in diesem letzten Jahr. Weiter möchte ich Kurt Wisler danken, der mir zwei Computer der Schule zur Verfügung gestellt hat, um Simulationen durchzuführen. Zudem danke ich allen Personen, die mir bei der Fehlerbeseitigung in meiner Dokumentation geholfen haben.
Vielen Dank!

2 Einleitung

2.1 Allgemeine Probleme bei der Erforschung der natürlichen Evolution

Heute wird für die Entstehung und Entwicklung aller Lebewesen der Erde die natürliche Evolution verantwortlich gemacht. Sie ist ein Prozess, der sich über Millionen von Jahre hinzieht. Dadurch wird es sehr schwierig, Theorien zur Evolution in der Natur nachzuprüfen. So sind die meisten Erkenntnisse dazu nicht induktive, sondern deduktive Schlüsse: So kann mit Sicherheit gesagt werden, dass in einer Population, die sich fortpflanzt und in der Mutationen auftreten, sich die Merkmale herausbilden werden, die für die Weitergabe der Erbinformationen nützlich sind, denn wenn ein Stück Erbinformation dazu beiträgt, dass es selbst öfter kopiert wird, wird dessen Quantität in der Population zunehmen.
Ein deduktiver Schluss ist immer wahr. Das heisst aber nicht, dass deduktiv geschlossene Theorien zur natürlichen Evolution auch immer wahr sind: Das Problem an deduktiven Schlüssen ist, dass sie nur gelten, wenn die Voraussetzungen für den Schluss auch wahr sind. So könnte es vielleicht weitere Einflüsse als die bereits bekannten geben, die auf die natürliche Evolution wirken.

2.2 Ziel dieser Arbeit

Ich möchte mit meiner Maturaarbeit herausfinden, wie und unter welchen Voraussetzungen in einer Computersimulation, die künstliche Lebewesen und ihre Evolution simuliert, Arten entstehen können.

2.3 Umfang

Ich behandle in meiner Maturaarbeit zuerst die Grundmechanismen der Evolution. Dabei soll ein grundsätzliches Verständnis der natürlichen Evolution erarbeitet werden. Ich lege meine eigenen Überlegungen zum Zusammenspiel dieser Mechanismen dar und begründe sie. Anhand von diesen Überlegungen sollen nun die Mechanismen zur Artbildung behandelt werden.
Nach dem Erarbeiten dieser Grundlagen der natürlichen Evolution erkläre ich die Funktionsweise meiner Simulation und die Ergebnisse, die ich daraus erhalten habe.

2.4 Methoden

Zuerst habe ich eine solche Simulation programmiert, die eine virtuelle Tierpopulation simuliert. Darin sollten sich die einzelnen Individuen gegenseitig beeinflussen und miteinander um die Weitergabe von Erbinformation konkurrieren. Um Artbildung beobachten zu können, mussten zudem noch die Mechanismen der natürlichen Evolution implementiert werden.
Zur Erarbeitung der dafür notwendigen Theorie zur natürlichen Evolution habe ich mich hauptsächlich an den beiden Büchern "Evolution" von Walter Kleesattel und "Das egoistische Gen" von Richard Dawkins orientiert.
Für meine Feldarbeit, die Programmierung der Simulation, habe ich mich der Programmierumgebung Cocoa unter Mac OS X 10.3 bedient. Vor dem Beginn der Maturaarbeit hatte ich darin nur Grundkenntnisse, habe aber während diesem Jahr sehr viel dazugelernt. Eine wichtige Quelle zur Beantwortung von Fragen, die beim Programmieren aufgekommen sind, war Apples Developer Connection ((Externer Link)http://developer.apple.com), Cocoa Dev Central ((Externer Link)http://cocoadevcentral.com) sowie MacTechNews.de ((Externer Link)http://mactechnews.de). Wenn ich auf Probleme mit der Anwendung von Funktionen gestossen bin, habe ich mich zudem dem öffentlich zugänglichen Quelltext des Messenger-Programms Adium bedient.

3 Theorie

3.1 Mechanismen der natürlichen Evolution

3.1.1 Einführung

Die natürliche Evolution ist ein komplexer Vorgang, der unter anderem zu Weiterentwicklung und Anpassung einer Population führt. Zudem bringt die Evolution Diversität und Artenvielfalt hervor. Für die Evolution ist ein Zusammenspiel aus mehreren Mechanismen verantwortlich. Diese Mechanismen sollen in diesem Kapitel erklärt werden.

3.1.2 Mutation

Mutationen sind die treibende Kraft, die zur Diversität unter den Lebewesen führt.
Bei der Zellteilung der Lebewesen, sowohl bei der Meiose, wie auch bei der Mitose, kommt es ab und zu vor, dass der Kopiervorgang durch Umwelteinflüsse gestört wird. Solche störenden Umwelteinflüsse können zum Beispiel radioaktive Strahlung, UV-Strahlen, abnorme Temperaturen oder chemische Stoffe, so genannte chemische Mutagene sein 1. Eine solche Störung, welche zu einer fehlerhaften Genübertragung führt, wird Mutation genannt. Mutationen ereignen sich unter normalen Umständen zufällig.
Die Mutationsrate, also die Chance, dass eine Zelle bei einer Teilung mutiert, beträgt beim Menschen ungefähr 1/1'000'000 2. Das heisst konkret, dass sich bei einer Million Zellteilungen ein Kopierfehler zuträgt.

3.1.3 Selektion

Als Selektion wird der Mechanismus definiert, der aus einer Population nach gewissen Kriterien bestimmt, ob und wie viel Erbinformation ein Individuum an zukünftige Generationen weitergeben kann.
In der Natur können diese Kriterien zum Beispiel Geschwindigkeit, Grösse oder Intelligenz sein. So hat eine Gazelle, die schneller ist als ein Löwe die kleinere Chance, gefressen zu werden, als ein anderes Individuum seiner Art, das langsamer ist. Durch die höhere Lebenserwartung der schnelleren Gazelle steigt die Anzahl Nachkommen, die sie in die Welt setzen kann. Hier ist die Geschwindigkeit ein Selektionsfaktor. Deshalb werden Gazellen vermutlich immer schneller werden, bis ein Selektionsfaktor gegen eine hohe Geschwindigkeit stärker wirkt. Dies könnte zum Beispiel der Umstand sein, dass eine schnellere Geschwindigkeit auch mehr Energie benötigt.
Oft wirkt die Selektion so, dass die Ausprägungen jedes Individuums zu einem gewissen Punkt hin gedrückt werden: So wird jede Abweichung vom "Jagdinstinkts" eines Löwen bestraft, weil das Verdauungssystem eines Löwen nicht für den Vegetarismus geeignet ist. So wird er vermutlich verhungern. Ebenso würde ein Löwe, dessen Verdauungssystem plötzlich für Vegetarismus geeignet wäre, nicht überleben, denn er besässe vermutlich immer noch seinen "Jagdinstinkt". Erfolgreich wäre diese beiden Mutationen (oder diese beiden Gruppen von Mutationen, denn ein Genfehler würde niemals ausreichen, um so eine komplexe Änderung vorzunehmen) nur gemeinsam.
Die Selektion lässt den Löwen also (zumindest für die nächste Zeit) ein Jäger bleiben.
Folgende Abbildung zeigt zwei Diagramme, welches die Selektion und ihre Auswirkungen verdeutlichen soll. Zudem werde ich bei der Erklärung der Artbildung wieder auf diese Diagramme zurückgreifen:

Nachteil-Ausprägung-Diagramme
Abbildung 1: zwei Nachteil-Ausprägung-Diagramme

Abbildung 1 zeigt zwei Nachteil-Ausprägung-Diagramme. Dabei entspricht eine Verschiebung auf der X-Achse einer Änderung in der Ausprägung des Merkmals, das jeweils rechts angegeben ist. Dazu in Funktion gesetzt ist der Nachteil, den dieses Merkmal mit sich bringt. Ein Tier kann prinzipiell überall auf der Kurve liegen, wird aber von den Evolutionsmechanismen beeinflusst: Durch Mutation wird eine unregelmässige Bewegung auf der Kurve von Generation zu Generation herbeigeführt. Die Selektion bewirkt, dass Tiere, deren Nachteil höher ist, schlechtere Fortpflanzungschancen haben. Dieser Selektionsdruck bewirkt nun, dass sich Tiergenerationen, die sich an einer beliebigen Stelle befinden, in die Richtung entwickeln, in die der Nachteil abnimmt, sie bewegen sich also "bergab". Sie streben zum Tiefpunkt der Selektionsmulde, in der sie sich befinden. Da ich diesen Begriff später noch oft benutzen werde, definiere ich nun eine Selektionsmulde als den Bereich zwischen zwei Hochpunkten oder zwischen dem Nullpunkt und dem nächsten Hochpunkt in der Kurve eines Nachteil-Ausprägung-Diagramms.
Das erste Beispiel aus Abbildung 1 stellt eine mögliche Kurve dar, die den Nachteil von Flügeln verschiedener Länge wiedergibt. Es ist zu sehen, dass diese Kurve zwei Selektionsmulden enthält. Im Tiefpunkt der einen Mulde befinden sich die Säugetiere (obwohl man auch viele andere Tiere hier einordnen könnte). Ihre Flügellänge ist null und der daraus resultierende Nachteil auch, denn diese Tiere investieren nichts in ein Flügelwachstum. Im Tiefpunkt der anderen Selektionsmulde befinden sich die Vögel (wiederum als Stellvertreter für viele andere Tiere). Die Flügellänge entspricht hier der optimalen Grösse für den Flug. Ihre Investition in das Wachstum der Flügel hat sich gelohnt, denn nun besitzen sie einen erweiterten Lebensraum. Eine Flügellänge irgendwo dazwischen wird sich nicht lohnen, da Energie für das Wachstum aufgewendet werden muss, jedoch kein Erlös resultiert. Noch grösser ist der Nachteil für ein Tier, das so grosse Flügel besitzt, dass diese es nur behindern. Hier wird besonders viel Energie für das Flügelwachstum aufgewendet, ohne dass dabei ein Gewinn entsteht.
Im zweiten Beispiel werden die Auswirkungen eines von mir selbst erfundenen Merkmals, des Herzstillstandshormons, dargestellt. Es soll die Chance eines Herzstillstands bei seinem Träger erhöhen. Diese Funktion bietet immer und egal in welcher Ausprägung einen Nachteil. Deshalb gibt es hier auch nur eine Selektionsmulde und nur einen Punkt, zu dem die Tiere hingezogen werden. Dies ist der Punkt, an dem kein Herzstillstandshormon produziert wird. Dies erklärt auch die Tatsache, dass es dieses Hormon heute nicht (mehr?) gibt und ich es erfinden musste.

3.1.4 Genvermischung

Die meisten Lebewesen der Erde vermehren sich, indem sie sich mit einem anderen Individuum derselben Art paaren. Dabei erhält der Nachkomme immer eine Hälfte seiner Gene von einem Elternglied und eine Hälfte vom anderen. Dies führt dazu, dass innerhalb einer Art (wie unten definiert) alle Individuen zum grössten Teil die gleichen Gene besitzen. Diesen Mechanismus definiere ich als Genvermischung.
Wenn Genvermischung in einer Population wirkt, wird es alleine durch Mutation keine Individuen mit grosser Genabweichung zum Durchschnitt geben. Sobald ein solches Individuum da wäre, müsste es sich, um seine Gene weiter zu vererben, mit einem anderen Individuum paaren, welches wahrscheinlich durchschnittlichere Gene besitzt, als das Individuum mit der hohen Abweichung. Also besitzt der Nachwuchs bereits weniger vom Durchschnitt abweichende Gene. In der nächsten Generation wird sich dieser Vorgang, da der Nachwuchs immer noch stark vom Durchschnitt abweichende Gene besitzt, wiederholen, bis schliesslich der Gendurchschnitt fast erreicht ist.
Dieser Prozess wird jedoch unterbunden, wenn Isolation wirkt: So kann eine Gruppe von Tieren allmählich vom Durchschnitt abweichen, wenn sie sich zum Beispiel nur mit Individuen paaren, die ebenfalls vom Durchschnitt abweichen.

3.1.5 Isolation

Durch verschiedene Faktoren kann in der Natur eine Trennung zweier Gruppen von Individuen stattfinden. Solche Faktoren können zum Beispiel geografischer Natur sein: So war Australien schon vor der Entstehung der Säugetiere von den anderen Kontinenten getrennt, wodurch sich dort sehr unterschiedliche Arten bilden konnten 3. Ein biologischer Faktor kann sein, dass zwei Individuen nicht dieselbe Chromosomenanzahl besitzen. Ein Faktor könnte auch sein, dass sich die beiden Gruppen von Tieren einfach nicht treffen, zum Beispiel, weil die eine am Tag aktiv und die andere nachtaktiv ist.
Wenn zwei Gruppen von Individuen sich untereinander nicht mehr paaren, werden sie als isoliert bezeichnet. Die Genvermischung unter den beiden Gruppen ist unterbunden.

3.2 Artbildung

3.2.1 Definition Art

In der Biologie wird eine Art oft als Gruppe aller Lebewesen definiert, die sich untereinander kreuzen lassen 4. In der Praxis sollte man zusätzlich den Aspekt beachten, dass einige Lebewesen zwar dazu fähig wären, sich zu paaren, dies jedoch aus irgendeinem Grund nicht tun. Ein solcher Grund kann zum Beispiel sein, dass eine Gruppe in Amerika und eine andere in Afrika lebt. Zwischen diesen beiden Gruppen werden keine Erbinformationen mehr ausgetauscht.
So könnte man, um den zweiten Gedanken mit einzuflechten eine Art als Gruppe von Lebewesen definieren, die mit keinen Lebewesen ausserhalb dieser Gruppe Geninformationen austauscht. Die Genvermischung mit anderen Gruppen ist somit ausgeschaltet, die Gruppe ist von anderen Gruppen isoliert.
Tiere, die sich zwar nicht direkt kreuzen lassen, zwischen denen aber über einen Umweg Erbinformationen ausgetauscht werden können, gelten biologisch gesehen als eine Art. Ein Beispiel in der Natur sind Möwen: Während sich die Britische Silbermöwe nicht mit der Britischen Heringsmöwe kreuzen lässt, ist aber eine Kreuzung mit der Amerikanischen Silbermöwe möglich. Diese kann man weiter mit der Sibirischen Silbermöwe kreuzen, die sich wiederum mit der Skandinavischen Heringsmöwe kreuzen lässt. Die Skandinavischen Heringsmöwe lässt sich schliesslich mit der Britischen Heringsmöwe kreuzen 5. Somit ist ein Genfluss zwischen den beiden britischen Möwenpopulationen möglich und sie werden einer Art zugeordnet.

3.2.2 Zusammenspiel von Mutation, Selektion, Genvermischung und Isolation

Die folgende Tabelle zeigt, wie sich eine Population unter dem Einfluss der oben beschriebenen Evolutionsmechanismen entwickelt. Dabei wirken immer die Mechanismen, die mit einem X gekennzeichnet sind. Die Fälle, in denen Arten gebildet werden, sind grau schattiert. Diese Fälle werden unterhalb der Tabelle noch genauer beschrieben und untersucht.
In der Spalte "Ergebnis" wird jeweils beschrieben, wie die aus der Situation resultierende Population genetisch aufgebaut ist.

 
Mutation
Selektion
Genvermischung
Isolation
Ergebnis

1

     

X

Alle Tiere der Population sind und bleiben wegen fehlender Mutation genetisch gleich. Durch Isolation werden die Tiere in einzelne Gruppen getrennt, die Population besteht aber weiterhin nur aus Tieren mit denselben Erbinformationen.

2

   

X

 
Entspricht Fall 1.
Die Genvermischung hat hier keinen Einfluss, denn aus Vermischung von gleichen Individuen entstehen wiederum gleiche Individuen.

3

   

X

X

Entspricht Fall 1.
Die Genvermischung wirkt hier in isolierten Gruppen, hat aber weiterhin keine Auswirkungen, denn aus Vermischung von gleichen Individuen entstehen wiederum gleiche Individuen.

4

 

X

   
Alle Tiere der Population sind und bleiben auf Grund fehlender Mutation gleich. Hier wirkt zusätzlich ein Selektionsfaktor. Wenn nun diese Population von gleichen Tieren nicht an den Selektionsfaktor angepasst ist, stirbt sie aus.

5

 

X

 

X

Derselbe Effekt wie in Fall 4 tritt hier auch in den gebildeten Gruppen auf. Da alle Gruppen auf Grund fehlender Mutation gleich sind, stirbt bei fehlender Anpassung an den Selektionsfaktor wiederum die ganze Population aus.

6

 

X

X

 
Der Effekt aus Fall 4 tritt auch hier auf. Durch Genvermischung wird die Population nicht verändert. Sie stirbt aus, wenn sie nicht an den Selektionsfaktor angepasst ist.

7

 

X

X

X

Entspricht Fall 4.
Die Kombination von Isolation und Genvermischung verändert die einzelnen Tiere nicht, sodass sie, wenn sie nicht an den Selektionsfaktor angepasst sind, sterben. Da alle Tiere auf Grund fehlender Mutation gleich sind, betrifft ein solches Aussterben die ganze Population.

8

X

     
Durch Mutation verändert sich die Population. Jedoch ist diese Veränderung nicht gerichtet, sondern völlig zufällig.

9

X

   

X

Entspricht Fall 8.
Die Isolation hat auf die zufällige Veränderung durch Mutation keinen Einfluss.

10

X

 

X

 
Durch die Genvermischung streben alle neuen Individuen dem Durchschnitt der Population zu. Mutationen verändern diesen Durchschnitt jedoch völlig zufällig.

11

X

 

X

X

Innerhalb jeder isolierten Gruppe streben alle neuen Individuen durch Genvermischung den Durchschnitt der Gruppe an. Die einzelnen Durchschnitte der Gruppe verändern sich unabhängig voneinander auf Grund von Mutationen. Jede isolierte Gruppe ist eine einzelne Art.

12

X

X

   
Durch Mutation und Selektion entwickeln sich die Individuen so, dass ihre Ausprägungen im Nachteil-Ausprägung-Diagramm in den Tiefpunkten von Selektionsmulden zu liegen kommen. Wenn mehrere Selektionsmulden vorhanden sind, entstehen so mehrere Gruppen. Da die Genvermischung in diesem Fall nicht wirkt, können diese Gruppen als einzelne Arten bezeichnet werden.

13

X

X

 

X

Hier wirkt derselbe Mechanismus wie in Fall 12. Jedoch werden hier nicht einzelne Individuen in Selektionsmulden gedrückt, sondern die einzelnen isolierten Gruppen.

14

X

X

X

 
Durch die Genvermischung streben alle neuen Individuen dem Durchschnitt der Population zu. Dieser Durchschnitt ist aber durch Mutation variabel, dies aber nicht zufällig, sondern durch den vorherrschenden Selektionsdruck gerichtet.

15

X

X

X

X

Innerhalb jeder isolierten Gruppe strebt jedes neue Tier den Durchschnitt der Gruppe an. Dieser Durchschnitt kann sich durch Mutationen verändern. Durch Selektion wirkt diese Veränderung gerichtet. Die einzelnen isolierten Gruppen werden sich also in Selektionsmulden sammeln.
Jede dieser isolierten Gruppen ist eine eigene Art.

Verschiedene Arten können in vier dieser Fälle entstehen. In Fall 12 und 13 entstehen neue Arten aber auf dieselbe Weise und sie sind deshalb gemeinsam aufgeführt:

1) Arten bilden sich in Fall Nummer 15, in dem alle der vier erwähnten Mechanismen der Evolution wirken. Dies ist der Fall, der auch in der Natur eintritt und ich habe ihn deshalb auch in meiner Simulation angewendet. Die Individuen mutieren zwar, jedoch entstehen aus zwei Gründen keine grossen Unterschiede zwischen ihnen: Der eine Grund ist, dass die Genvermischung wirkt und somit alle Individuen dem Durchschnitt zustreben. Der andere Grund ist, dass die Selektion die Ausprägungen der (durch Genvermischung ungefähr gleichen) Individuen zum gleichen Punkt hin drückt. Da jetzt die Individuen isoliert werden, können sich unterschiedliche Gruppen bilden, die, wenn mehrere Selektionsmulden vorhanden sind, auch zu unterschiedlichen Punkten hin gedrückt werden können. Es entstehen Arten.

2) In Fall Nummer 12 und 13 entstehen ebenfalls Arten, sofern mehrere Selektionsmulden vorhanden sind. Die Tiere werden dann vom Selektionsdruck in die verschiedenen Mulden gedrängt. Es gibt mehrere unterschiedliche Formen der Ausprägung, die evolutionär stabil sind.
Der Mechanismus der Isolation übt hier keinen Einfluss aus, weil die Genvermischung nicht wirkt. Dadurch ist automatisch jedes Individuen von jedem anderen isoliert, da seine Erbinformationen nicht mit fremden vermischt werden.

3) In Fall Nummer 11 bilden sich wegen den Mechanismen der Isolation und der Genvermischung Gruppen. Diese Gruppen verändern sich nun unter dem Einfluss der Mutation ohne Richtungsangabe der Selektion völlig zufällig. Eine Mutation eines einzelnen Individuums wird wegen der Genvermischung auf die ganze Gruppe übertragen.
Diese Gruppen weisen die Eigenschaften einer Art laut Definition (siehe oben) auf.

4 Die Simulation

4.1 Einführung

Als Feldarbeit zu meiner Maturaarbeit habe ich es zu meiner Aufgabe gemacht, die theoretischen Grundlagen der Evolutionstheorie in einer Computersimulation möglichst realitätsgebunden zu übernehmen. Dabei müssen die sehr komplexen Umstände der Natur jedoch abstrahiert werden, um eine genügend hohe Simulationsgeschwindigkeit zu erreichen.
Von den artbildenden Fällen der Evolutionsmechanismentabelle (Kapitel 3.2.2) habe ich Fall Nummer 15 in meiner Simulation angewendet. Dies ist der Fall, in dem Mutation, Selektion, Genvermischung und Isolation wirken.

4.2 Funktionsweise

Um die Funktionsweise meiner Simulation am Besten zu verstehen, stellt man sich ein Spielfeld, ähnlich einem Schachbrett, vor. Ich werde dieses Feld nachfolgend immer Spielfeld nennen, um Verwechslungen mit den einzelnen Feldern des Spielfeldes zu vermeiden. Auf dieses Spielfeld werden nun zufällig virtuelle Tiere gesetzt. Diesen Tieren werden, wiederum zufällig, Parameter zugeordnet, wie zum Beispiel eine gewisse Anpassung an eine Nahrung oder ein gewisses Verhaltensmuster.
Wird nun die Simulation gestartet, beginnen die Tiere sich jeweils anhand ihrer Parameter für einen Spielzug zu entscheiden. Ein solcher Spielzug könnte zum Beispiel sein, in dieser Runde zu essen oder sich fortzupflanzen.
Da die Tiere, zum Beispiel wegen zu wenig Nahrung oder zu hohem Alter, sterben, müssen sie sich fortpflanzen können. Ein gezeugtes Tier erhält den Durchschnitt der ganzen Verhaltens- und Wachstumsparameter seiner Eltern. Zudem treten Mutationen auf.
Im nächsten Unterkapitel wird der Programmablauf genauer erklärt. Falls Sie daran interessiert sind, finden Sie im Anhang den Quelltext des Programms.

4.3 Genauer Programmablauf

4.3.1 Vorbereitungen

Wenn die Applikation "Evolution" gestartet wird, werden die Felder für die Simulation erzeugt. Sie werden zufällig einer Art von Vegetation zugeordnet, entweder Art 1 oder Art 2.
Das Betriebsystem stellt nun die Benutzeroberfläche meiner Simulation dar (Abbildung 2).

Benutzeroberfläche
Abbildung 2: Benutzeroberfläche

Das Fenster mit dem Name "Evolution" ist das Steuerfenster, von dem aus die Simulation gestartet werden kann. "Tierliste" stellt eine Liste der simulierten Tiere dar. Die Zeilen entsprechen den Tiere und die Spalten die verschiedenen Variablen, die einem Tier zugeordnet sind. Nach dem Start der Applikation ist die Tierliste noch leer. "HTML-Export" dient dazu, die Tierliste in eine Datei zu speichern, um sie anschliessend zu archivieren.
Da die Tierliste anfangs noch leer ist, müssen zuerst Tiere ausgesetzt werden. Im Fenster "Einstellungen" kann die Anzahl der Tiere, die ausgesetzt werden sollen, eingestellt werden. Durch ein Klicken auf "Tiere aussetzen" wird gewünschte Anzahl Tiere ausgesetzt.

4.3.2 Aussetzen der Tiere

Beim Aussetzen der Tiere werden neue Tiere erzeugt und in eine Liste aufgenommen. Die meisten der Variablen, die den Tieren zugeordnet sind, werden mit zufälligen Werten belegt. Diese sind jedoch im Umfang so weit eingeschränkt, dass eine stabile überlebensfähige Population entsteht.
Wenn nun die Tiere in der Tierliste erschienen sind (Abbildung 3), kann die Simulation gestartet werden.
Benutzeroberfläche mit ausgesetzten Tieren
Abbildung 3: Benutzeroberfläche mit ausgesetzten Tieren

4.3.3 Starten der Simulation

Wird die Simulation durch Klicken auf "Simulation starten" im Steuerfenster gestartet, deutet der nun animierte Balken im Steuerfenster (Abbildung 4) an, dass die Simulation läuft.

Prozessindikationsbalken
Abbildung 4: Prozessindikationsbalken

Nun werden so lange folgende beiden Prozesse wiederholt, bis die Simulation durch einen Klick auf "Simulation anhalten" gestoppt wird:
Zuerst führen die Tiere ihren jeweiligen Zug aus. Die Variable zur Speicherung des Alters wird jede Runde erhöht, und dem Tier wird Energie für die Lebenserhaltung (entspricht in der Natur zum Beispiel der benötigten Energie für die Temperaturerhaltung) abgezogen. Wenn der Zug von jedem einzelnen Tier berechnet ist, wird den Feldern noch der Befehl gegeben, ihre Nahrungsmittelressourcen wachsen zu lassen.

4.3.4 Zugberechnung der Tiere

Für jedes Tier wird ein Zug und eine Aktivität für die nächste Simulationsrunde berechnet. Nun wird für jeden möglichen Zug und jede mögliche Aktivität, die das Tier durchführen könnte, eine Punktzahl berechnet. Diese Punktzahl ist zudem abhängig von den Verhaltensvariablen des Tieres: So wird ein Tier, das positive Verhaltensvariablen für Nahrung 1 besitzt, kaum Nahrung 2 essen, wenn irgendwo in der Nähe auch Nahrung 1 zu finden wäre.
Wenn allen Möglichkeiten, die dem Tier offen stehen, eine Punktzahl zugeordnet ist, wird unter ihnen zufällig ein Zug ermittelt, welcher durchgeführt werden soll. Züge, denen eine höhere Punktzahl zugeordnet ist, werden mit grösserer Wahrscheinlichkeit durchgeführt.

4.3.5 Essen

Eine der Aktivitäten, die ein Tier ausführen kann ist Essen. Dabei wird der Energiestand des Tieres um einen Wert, der abhängig ist von der Anpassung an die vorliegende Nahrung, erhöht. Falls auf dem Feld, von dem gegessen wird, keine Nahrungsvorräte mehr vorhanden sind, kann die Aktivität nicht durchgeführt werden. Wenn das Tier essen kann, sinkt der Nahrungsvorrat auf dem Feld.

4.3.6 Fortpflanzung

Wenn das Tier sich entscheidet, sich fortzupflanzen, wird zuerst geprüft, ob eine Fortpflanzung möglich ist. Dazu dürfen die beiden Partner nicht gleichgeschlechtlich sein und ein Kriterium, dass die Tiere zur selben Art gehören (siehe Kapitel 4.5.1) muss erfüllt sein.
Im Fall, dass diese Kriterien erfüllt sind, wird ein neues Tier erzeugt. Dem neuen Tier wird der Durchschnitt der Variablen von den beiden Elternteilen vererbt. Zudem werden die Variablen noch einer Mutation unterzogen. Dabei verändern sich die Variablen höchstens um ±10%.

4.3.7 Warten

Falls das Tier keine der beiden oben beschriebenen Aktivitäten tun kann oder will, wartet es. Der Vorteil darin liegt, dass keine Energie dafür aufgewendet werden muss.

4.3.8 Sterben

Sobald ein Tier keine Energie mehr besitzt oder ein zu hohes Alter erreicht, stirbt es. Es wird von der Tierliste gestrichen.

4.3.9 Aussterben

Ich habe bei der Simulation die Erfahrung gemacht, dass wenn die Gesamtpopulation der Tiere weniger als 200 beträgt, dies ein Anzeichen für ihr baldiges Aussterben ist. Um die Daten der letzten verbliebenen Tiere der Population auswerten zu können, wird die Simulation gestoppt.
Wenn nun zu dem Zeitpunkt, an dem die Population weniger als 200 Individuen umfasst, mehrmals auf "Simulation starten" geklickt wird, bis die Anzahl der Tiere auf unter 195 absinkt, wird die Simulation dazu veranlasst, die Population ganz aussterben zu lassen.

4.4 Mechanismen der Evolution in der Simulation

4.4.1 Einführung

In diesem Unterkapitel beschreibe ich, wie ich die Evolutionsmechanismen in der Simulation umgesetzt habe und was dabei die Unterschiede zur Natur sind.

4.4.2 Mutation

Bei der Übergabe der Parameter der Eltern an das neu entstehende Tier wird der Parameter jeweils noch einer Manipulation unterzogen. Dabei verändert sich jeder Wert um eine gewisse Prozentzahl zwischen +10% und -10%, welche zufällig ermittelt wird.
Die Unterschiede zwischen der Mutation in der Simulation und in der Simulation liegen vor allem im Umfang der Veränderung. In der Simulation erfährt jedes neu entstehende Individuum eine Mutation, die dann im ganzen Tier vorhanden ist. In der Natur ist eine Mutation (bei der Meiose, wo sie Auswirkungen auf das ganze Tier hätte), wie in Kapitel 3.1.2 erwähnt, sehr unwahrscheinlich. Es besteht hier wohl auch jedes grössere Lebewesen aus einigen mutierten Zellen. Hier findet sich aber ein weiterer Unterschied zwischen der Simulation und der Natur: In der Natur ereignen sich Mutationen sowohl bei der Mitose, wie auch bei der Meiose. Da es, auf Grund der Notwendigkeit zur Abstraktion, in meiner Simulation keine Mitose gibt, treten nur bei der Meiose Mutationen auf.
In der Simulation läuft die Mutation zudem kontrollierter ab, als in der Natur. In der Simulation sind Mutationen gewollt und inszeniert, während sie in der Natur Fehler beim Kopieren von Genmaterial sind. Hier stellt sich aber auch die Frage – auf die ich jedoch nicht genauer eingehen kann – ob Mutationen in der Natur nicht auch evolutionär gefördert sind. Sie sind schliesslich für die Weiterentwicklung von Lebewesen verantwortlich. Da aber eine Mutation in einer gut angepassten Population eher eine Verschlechterung als eine Verbesserung bringt, glaube ich nicht, dass diese These bestätigt werden kann.

4.4.3 Selektion

In der Simulation entscheiden verschiedene Faktoren darüber, ob ein Tier seine Erbinformationen weitergeben kann. So muss das Tier zum Beispiel mindestens eine kurze Zeit überleben und sich in dieser Zeit fortpflanzen können. Unterschiedlich zur Natur ist wiederum die Einfachheit dieses Evolutionsmechanismus. In der Natur wirken viel mehr Selektionsfaktoren. Ein Beispiel dafür ist der Schutz vor Jägern.

4.4.4 Genvermischung

In meiner Computersimulation sind für die Fortpflanzung jeweils zwei Tiere nötig. Dem neuen Tier wird der Durchschnitt der einzelnen Eigenschaften von Vater und Mutter übergeben. Dadurch nähern sich diese Werte, sofern dies nicht durch einen anderen Evolutionsmechanismus unterbunden wird, von Generation zu Generation dem Populationsdurchschnitt an.
Ein grosser Unterschied zwischen Simulation und Natur ist, dass in der Simulation zwei Brüder oder zwei Schwestern identisch sind (wenn man von Mutationen absieht). Dies liegt daran, dass immer der genaue Durchschnitt der Geninformation weitergegeben wird. In der Natur ist die Erbinformation von Tieren in Chromosomen verteilt und in zweifacher Ausführung vorhanden. Die eine Hälfte der Information wurde vom Vater geerbt, die andere von der Mutter. Bei der Fortpflanzung wird jeweils nur die eine Hälfte weitergegeben, die zweite Hälfte kommt vom Geschlechtspartner. Da jedes Chromosom doppelt vorhanden ist, das eine vom Vater, das andere von der Mutter, wird von jedem Chromosom eines für die Vererbung an den Nachwuchs zufällig ausgewählt. Mit zweimal 23 Chromosomen, wie beim Menschen, ergibt dies eine Breite von 223, also 8'388'608 verschiedenen Kombinationen aus Chromosomen, die ein Elternteil einem Kind vererben kann. Vom anderen Elternteil können wiederum 8'388'608 verschiedene Genkombinationen an das Kind vererbt werden. Die Chance, dass zwei menschliche Geschwister also genau die gleichen Erbinformationen besitzen (eineiige Zwillinge ausgenommen) beträgt eins zu 8'388'608² also eins zu 70'368'744'177'664. Dieser Mechanismus, der in der Natur neben der Mutation für Diversität unter den Lebewesen verantwortlich ist, wird Rekombination genannt.

4.4.5 Isolation

In meiner Simulation wirken mindestens zwei Arten von Isolation. Die eine Art, welche ich geschlechtliche Isolation nenne, ist eine von mir definierte Fortpflanzungsschranke. So können Tiere, welche in einem gewissen Parameter nicht genügend übereinstimmen, sich nicht zusammen paaren. Ich werde im nächsten Unterkapitel noch genauer darauf eingehen.
Die zweite Art der Isolation ist die räumliche Trennung, welche in der Biologie als Separation bezeichnet wird. Bewegung benötigt Energie und ist mit Veränderung der Umgebung verbunden. Deshalb bleibt ein Tier lieber in seiner gewohnten Umgebung. So wird zumindest die direkte Genvermischung zu entfernten Tieren unterbunden. Die Trennung nimmt mit zunehmendem Abstand zu.

4.5 Artbildung in der Simulation

4.5.1 Definition Art in der Simulation

In meiner Simulation sind zwei Tiere in derselben Art, wenn sie sich fortpflanzen können. Ich habe als Entscheidungsfaktor, ob sich zwei Tiere fortpflanzen können, einen willkürlichen Parameter gewählt. Wenn dieser nun um eine gewisse Prozentzahl vom Partnertier abweicht, ist die Fortpflanzung nicht mehr möglich. Über diesen Entscheidungsparameter findet auch die geschlechtliche Isolation statt. Es bilden sich also Gruppen, in denen alle Individuen in diesem Entscheidungsparameter ähnlich sind. Um Artbildung beobachten zu können, scheint es geeignet, als solchen Entscheidungsparameter einen Wert auszuwählen, in dessen Nachteil-Ausprägung-Diagramm Selektionsmulden vorliegen. So wird die Verteilung in die Selektionsmulden durch die Isolation verstärkt, denn die Genvermischung zwischen zwei Gruppen in verschiedenen Selektionsmulden ist unterbrochen. Die beiden Gruppen sind verschiedene Arten.
Konkret hat sich die Anpassung des Tieres an Nahrung 1 und Nahrung 2 als guter Entscheidungsparameter für die Artentrennung herausgestellt. So ist die Spezialisierung auf nur eine der beiden Nahrungen ein Vorteil, denn dies benötigt weniger Energie. Es gibt also mindestens zwei Selektionsmulden, nämlich die Anpassung an Nahrung 1 und die Anpassung an Nahrung 2.

4.5.2 Definition für erfolgreiche Artbildung in meiner Simulation

Von erfolgreicher Artbildung in meiner Computersimulation spreche ich dann, wenn sich verschiedene Gruppen, zwischen denen keine Genvermischung mehr wirkt, gebildet haben und diese einen grossen Teil der Population ausmachen.
Konkret heisst dies wiederum, dass sich bei einem Teil der Population die Anpassung an Nahrung 1 durchsetzen sollte und bei eine anderen die Anpassung an Nahrung 2. Zwischen diesen beiden Gruppen wird keine Genvermischung mehr stattfinden.

4.6 Ergebnisse

Mein Ziel, dass in meiner Simulation Arten entstehen, habe ich erreicht: Einige der Tiere spezialisieren sich auf die Nahrung 1 und vernachlässigen Nahrung 2. Sie werden durch geschlechtliche Isolation davon abgehalten, ihre Gene mit den Tieren zu vermischen, welche sich auf Nahrung 2 spezialisiert haben und Nahrung 1 vernachlässigen.
Die Tabelle unten ist ein Ausschnitt aus der Tierliste einer Simulation mit erfolgreicher Artbildung. Ich habe die verschiedenen Arten mit verschiedenen Farben gekennzeichnet. Weitere Experimente finden sich im Anhang unter 7.3.2.

Evolution Version 0.2.0
Anzahl Tiere: 199
Bereits simulierte Runden: 1076
Fri Sep 17 18:36:47 2004

Energiestand Nahrung1Anpassung Nahrung2Anpassung Nahrung1Parameter Nahrung2Parameter Anpassung Geschlecht Alter StandortX StandortY WartenParameter FortpflanzungParameter FortpflanzungEigeneArtParameter StehenBleibenBonus
26118 2503 1980 4530 4384 1 0 200 5 7 34 132 2000 820
36879 2472 2278 3711 4885 0 0 192 5 8 26 146 2000 796
53762 2542 321 2793 43 1 1 184 6 2 69 170 2000 808
35532 2492 1771 5178 3558 1 1 180 5 8 35 147 2000 808
72006 3240 416 3505 51 1 1 179 4 4 94 207 2000 1038
23460 1456 1758 1315 3014 1 1 171 2 1 50 146 2000 560
64694 596 2995 73 5407 1 0 169 1 1 63 156 2000 1104
68229 4230 538 3697 64 1 0 156 5 3 54 270 2000 1359
32764 374 1872 46 3583 1 1 156 3 1 52 98 2000 691
54839 3854 493 4108 58 1 0 147 6 6 64 244 2000 1242
36041 2767 2161 5238 4744 1 1 143 2 5 32 142 2000 855
28184 2511 2161 5611 5077 1 1 133 2 6 32 162 2000 856
63035 722 3627 87 6229 1 0 126 5 5 48 187 2000 1336
59993 4401 566 4204 67 1 0 120 8 2 45 278 2000 1422
61508 807 4056 98 4412 1 1 110 5 5 39 208 2000 1494
35051 3265 405 3554 54 1 1 104 8 6 60 217 2000 1027
30530 3540 434 3928 61 1 1 86 4 4 56 236 2000 1094
43411 4142 516 4514 67 1 1 79 7 7 77 272 2000 1304
11998 4256 541 4576 66 1 0 46 8 8 74 272 2000 1363
12082 4436 554 4874 73 1 1 44 7 7 64 291 2000 1399
43058.199219 2466.432129 1788.623169 3363.502441 3145.060303 0.924623 0.462312 142.869354 4.532663 4.412060 49.763821 189.517593 2000.000000 996.231140

Die besten Ergebnisse werden erzielt, wenn zuerst 10'000 Tiere ausgesetzt werden und anschliessend simuliert wird, bis die Tiere aussterben. Daraufhin sollen noch einmal 10'000 Tiere ausgesetzt und simuliert werden, bis die Simulation bei einer Populationsgrösse von 200 Tieren automatisch stoppt. Dabei fällt auf, dass die zweite Gruppe ausgesetzter Tiere sich nicht wie die erste am Anfang sehr stark vermehrt. Erst in der zweiten Runde nimmt die Population schwach zu. Dadurch ist die Population stabiler und überlebt auch länger. Die starke Vermehrung der ersten Gruppe wird dadurch verursacht, dass der Tod erst in der zweiten Runde einsetzt, während die Fortpflanzung bereits in der ersten Runde wirkt. In der zweiten Gruppe wirken beide Effekte erst ab der zweiten Runde. Dies ist auf programmiertechnische Gründe zurückzuführen.
Eine weitere Eigenheit meiner Simulation ist die Tendenz der Tierpopulationen, auszusterben. Ich habe es bisher nicht geschafft, eine Version zu programmieren, in der die Population so lange stabil bleibt, dass vermutet werden kann, dass sie praktisch unendlich lange existieren könnte. Gründe für das Aussterben könnten sein, dass die Tiere zu wenig Zeit für das Essen und die Fortpflanzung haben. So würden nur die Tiere überleben, welche sich mehr dem Essen widmen. Die Population nimmt nun wegen mangelnder Fortpflanzung ständig ab. Individuen, die sich zu sehr auf die Fortpflanzung konzentrieren, verhungern. Wenn nur noch sehr wenige Tiere vorhanden sind, wirkt zusätzlich eine räumliche Isolation zwischen ihnen: Bewegung benötigt Energie und wird so im Verhaltensmuster negativ eingestuft. So kann, sobald nur noch wenige Tiere vorhanden sind, keine Fortpflanzung mehr stattfinden, wenn die Tiere ihre Felder nicht verlassen.
Mit der Erhöhung des Wachstums der Nahrung auf den Feldern ist es mir zumindest gelungen, den Tod der Population hinauszuzögern.
Ich habe mit solchen Erfahrungen erlebt, dass ein Ökosystem sehr empfindlich ist und es deshalb ein schwierige Aufgabe ist, ein funktionierendes, stabiles System zu erstellen. In der Natur hat das System Zeit, sich einzupendeln. Ich musste jedoch der Simulation ein funktionierendes System übergeben, das zumindest für eine gewisse Zeit stabil bleibt.

5 Zusammenfassung

Aus meinen theoretischen Überlegungen geht hervor, dass in vier Fällen der Evolutionsmechanismentabelle Artbildung eintritt. Diese sind Fall 11, wo Mutation, Genvermischung und Isolation, Fall 12, wo Mutation und Selektion, Fall 13, wo Mutation, Selektion und Isolation und Fall 15, wo Mutation, Selektion, Genvermischung und Isolation wirken. In meiner Simulation habe ich Fall 15 geprüft und habe Artbildung beobachten können.

6 Schlusswort

Bei meiner Maturaarbeit habe ich vor allem in zwei Bereichen viel gelernt. Zum einen habe ich einen spannenden Einblick in die Theorie zur natürlichen Evolution gewonnen. Hier habe ich gelernt, Umstände in der Natur evolutionstheoretisch zu betrachten. Durch das Buch "Das egoistische Gen" von Richard Dawkins habe ich einen genaueren Einblick in Mechanismen, welche sich durch die natürliche Evolution ergeben, bekommen.
Zum anderen konnte ich im Gebiet der Programmierung Erfahrungen sammeln. So habe ich meine Geschwindigkeit, mit der ich Lösungen für Probleme finde, vergrössern können, da ich gute Techniken zur Fehlersuche gefunden habe.
Bei der Maturaarbeit stellten sich mir natürlich auch Probleme ausserhalb des Programmierens. Ein Problem, das mich fast während meiner ganzen Maturaarbeit begleitet hat, dass ich mein Ziel zu wenig genau formuliert hatte. So wusste ich nicht, was meine Simulation schlussendlich genau machen sollte. Es gab keine genaue Antwort auf meine Fragestellung. Eine Fragestellung, welche mit "ja" oder "nein" beantwortet werden könnte, wäre optimal gewesen. Ich stelle mir dies so vor, dass ich entweder eine These aufstellen würde oder eine vorhandene übernähme und versuchen würde, diese mit einer Simulation zu stützen oder zu widerlegen. Bei der Lektüre des Buches "Das egoistische Gen" von Richard Dawkins habe ich viele geeignete Thesen gefunden. Vielleicht hätte ich dieses Buch vor meiner genauen Themenwahl lesen sollen. Ich hätte so bestimmt mehr und bessere Ideen gehabt. So hätte mich zum Beispiel eine Simulation einer Ameisenpopulation sehr interessiert.
Ein weiteres Problem stellte sich mir bei der Erstellung der Dokumentation. Ich hatte viele Informationen verarbeitet, von denen ich nicht wusste, woher ich sie hatte. Vielleicht hatte ich sie einmal in der Schule gehört, in der Zeitung oder im Internet gelesen oder im Fernsehen gesehen. So wusste ich nicht, welche Quelle ich angeben sollte oder ob ich auf eine Quellenangabe verzichten sollte.
Eine Schwierigkeit, die sich während dem Programmieren stellte, war, ein gutes Gleichgewicht zwischen Komplexität und Geschwindigkeit der Simulation zu finden. Am Anfang der Arbeit strebte ich sogleich eine sehr komplexe Simulation an. So habe ich den Tieren zum Beispiel die Möglichkeit gegeben, sich gegenseitig zu jagen. Folgen davon waren eine langsame Simulationsgeschwindigkeit, wenn es denn überhaupt zu einer Simulation kam: In einem komplexen Computerprogramm können sich kleine Fehler mit grossen Auswirkungen gut verstecken. So musste ich die Simulation Stück für Stück weiter abstrahieren, bis ich schliesslich einen sinnvollen Umfang gefunden hatte.
Ich betrachte die Maturaarbeit in ihrer Gesamtheit als eine gute Erfahrung. Man lernt selbstständig wissenschaftlich zu arbeiten, was in der Zukunft, insbesondere in einer Universität, sicher von Vorteil sein wird. Es ist auch ein gutes Gefühl, auf seine Arbeit zurückzublicken, wenn man zum Beispiel das erste Mal Artbildung in seiner Simulation beobachtet, wenn man die Anzeige der Zeiterfassungssoftware von 99:59:59 auf 100 Stunden springen sieht oder wenn man gerade seine Dokumentation abschliesst.

7 Anhang

7.1 Technische Daten der Simulation

7.1.1 Systemanforderungen

Um die Applikation "Evolution", in welche meine Simulation implementiert ist, ausführen zu können, wird ein Apple-Macintosh-Computer mit Mac OS X 10.3 (oder 10.2 mit beschränkter Funktionalität) benötigt.

7.1.2 Programmierplattform

Ich habe meine Simulation mit Xcode unter Mac OS X Panther (10.3) erstellt. Als Programmierumgebung habe ich die Mac OS X Standardumgebung Cocoa mit der Programmiersprache Objective-C gewählt. Meine Wahl basiert auf zwei Gründen: Der erste Grund ist, dass ich darin bereits ein wenig Erfahrung hatte. Ich hatte damit schon ein Tic Tac Toe Spiel mit Computergegner programmiert. Der zweite Grund ist, dass ich den allgemeinen Eindruck hatte, Cocoa sei einfach zu erlernen. Dies hat sich, meiner Meinung nach, auch als zutreffend erwiesen.

7.2 Quelltext der Simulation

7.2.1 Einführung

In diesem Unterkapitel des Anhangs werde ich den Quelltext meiner Simulation wiedergeben und einige Erklärungen dazu anbringen. Um den Quelltext besser verstehen zu können, empfehle ich, zuerst den genauen Programmablauf (Kapitel 4.3) zu lesen.
Die Simulation ist in der Programmiersprache Objective-C geschrieben. Objective-C ist eine objektorientierte Programmiersprache und baut auf der Sprache C auf. Ich werde im nächsten Artikel noch genauer auf objektorientiertes Programmieren eingehen.
Der gesamte Quelltext wird in digitaler Form über die Website dieser Arbeit (http://evolution.naepflin.com) verfügbar sein.

7.2.2 Objektorientiertes Programmieren (OOP)

Der Vorteil von objektorientiertem Programmieren (OOP) ist, dass der Quelltext geordneter ist und nachträgliche Änderungen einfacher bewerkstelligt werden können. Zudem lässt OOP eine Problemstellung gut in Einzelprobleme unterteilen.
Die charakteristischen Elemente des OOP sind Klassen und Objekte. Klassen sind dabei abstrakt, Objekte konkret. Die Klasse entspricht also der Beschreibung des Objekts. Aus einer Klasse lassen sich – beliebig viele – Objekte erzeugen.
Zum besseren Verständnis füge ich hier einen Vergleich zur realen Welt hinzu: So könnte man zum Beispiel den Dackel "Bello" als Objekt der Klasse "Hund" beschreiben. Der "Hund" selbst existiert nicht, er ist nur eine Beschreibung für ein Ding, welches verschiedene Eigenschaften aufweist. Diese Beschreibung kann für beliebig viele Objekte gelten, so zum Beispiel auch für den Pudel "Fido".
Ich füge hier noch je eine Definition für Klasse und Objekt an:
"Klasse ist [...] ein abstrakter Oberbegriff für die Beschreibung der gemeinsamen Struktur und/oder des gemeinsamen Verhaltens von Objekten [...]."
Quelle: (Externer Link)http://de.wikipedia.org/wiki/Klasse_(objektorientierte_Programmierung) (Q3 im Webquellenverzeichnis)
"Ein Objekt ist [...] eine konkrete Ausprägung einer Klasse [...]."
Quelle: (Externer Link)http://de.wikipedia.org/wiki/Objekt_(objektorientierte_Programmierung) (Q2 im Webquellenverzeichnis)

7.2.3 Erklärung der einzelnen Klassen der Simulation

In diesem Artikel werden die einzelnen Klassen, die meine Simulation beinhaltet, erklärt. Die wichtigsten Variablen und Methoden der einzelnen Klassen sind zudem hier erklärt.

Tier (in "Tier.m" definiert): Diese Klasse beschreibt die Tiere. Für jedes einzelne Tier wird ein Objekt dieser Klasse erzeugt.
Variablen

Zustand
Folgende Variablen werden nicht vererbt und sind während dem Leben des Tieres veränderlich:
Energiestand
In dieser Variable wird die Menge Energie gespeichert, die das Tier noch besitzt. Wenn der Energiestand negativ wird, stirbt das Tier.
Alter
Diese Variable zählt, wie viele Runden das Tier bereits existiert. Wenn sie 200 überschreitet, stirbt das Tier.
StandortX, StandortY
"StandortX" und "StandortY" repräsentieren die X- und Y-Koordinate, wo sich das Tier auf dem Spielfeld gerade befindet.
SchonAktivitaet
Diese Variable sorgt dafür, dass sich ein Tier in einer Runde nicht mehrmals fortpflanzen kann. Dies wäre möglich, wenn ein anders Tier das Tier als Partner wählte. Dadurch wäre ein Tier im Vorteil, welches die Zeit der anderen Tiere gebrauchen würde, um sich fortzupflanzen und seine eigene Zeit zum Essen nützte. Somit würde sich ein unnatürliches Gleichgewicht bilden, in welchem nur wenige Tiere bereit wären, sich von sich aus fortzupflanzen. Diese Variable unterbindet dies.
Form
Folgende Variablen werden vererbt und verändern sich während dem Leben des Tieres nicht:
Geschlecht
Dieser zufällig ermittelte Wert entspricht dem Geschlecht in der Natur: Gleichgeschlechtliche Fortpflanzung ist nicht möglich. Für die Artbildung wäre diese Variable eigentlich nicht nötig, ich habe sie aber der Vollständigkeit halber trotzdem implementiert.
Nahrung1Anpassung, Nahrung2Anpassung
Je nach NahrungAnpassung kann aus der jeweiligen Nahrung 1 oder Nahrung 2 mehr oder weniger Energie gewonnen werden. Die Anpassung kostet jedoch jede Runde zusätzliche Energie. Es lohnt sich also, sich nur auf eine Nahrung zu spezialisieren.
Verhalten
Folgende Variablen werden vererbt und verändern sich während dem Leben eines Tieres nicht (Ausnahme ist angegeben):
Nahrung1Parameter, Nahrung2Parameter
Diese Variable gibt an, wie hoch Nahrung 1 oder Nahrung 2 bewertet wird. Ist die Variable höher, ist die Chance grösser, dass das Tier sich entschliesst, sich auf ein Feld mit Nahrung 1 oder Nahrung 2 zu bewegen.
WartenParameter
Diese Variable gibt an, wie hoch eine Runde nichts tun bewertet wird.
FortpflanzungParameter
Mit dieser Variable wird die Bewertung für die Fortpflanzung mit einem Partner von unterschiedlicher Art angegeben. Ein solcher Fortpflanzungsversuch ist immer erfolglos und "FortpflanzungParameter" sollte deshalb gegen null streben.
FortpflanzungEigeneArtParameter
Dieser Wert gilt beim Entscheidungsprozess als Richtwert. Er ist immer 2'000 und steht im Entscheidungsprozess für Fortpflanzung mit einem Partner derselben Art.
Ein Richtwert hat sich als nötig erwiesen, da die Entscheidungsparameter sonst dazu tendieren, sehr hoch zu werden. Solch hohe Zahlen sehen unübersichtlich aus und sind mühsam auszuwerten.
StehenBleibenBonus
Diese Grösse wird einem Zug, für dessen Ausführung keine Bewegung nötig ist, an Bewertungspunkten gutgeschrieben.
Methoden

Veränderung
Mit diesen Methoden können Variable eines Objekts der Klasse "Tier" verändert werden:
initMitVater:Vater Mutter:Mutter
Ein neues Tier entsteht. Diese Methode setzt die Variablen des Tieres und vererbt und mutiert die Geninformationen von Vater und Mutter.
Essen:Energie
Der Energiestand des Tieres nimmt um den übergebenen Wert "Energie" zu.
Energieabnahme:Aktivitaet
Der Energiestand des Tieres nimmt um den übergebenen Wert "Aktivitaet" ab.
Altern
Die Variable "Alter" wird um 1 erhöht.
StandortWechselX:WechselX WechselY:WechselY
Zu "StandortX" und "StandortY" wird "WechselX" beziehungsweise "WechselY" addiert.
SchonAktivitaetAendern
Die Variable "SchonAktivitaet" wird von 0 zu 1 oder von 1 zu 0 gewechselt.
Abfrage
Diese Methoden geben jeweils die Variable mit demselben Namen wie die Methode aus:
Energiestand

Alter

StandortX

StandortY

SchonAktivitaet

Geschlecht

Nahrung1Anpassung

Nahrung2Anpassung

Nahrung1Parameter

Nahrung2Parameter

WartenParameter

FortpflanzungParameter

FortpflanzungEigeneArtParameter

StehenBleibenBonus

Analyse

AnpassungTrifftZu
Gibt 1 aus, wenn die sich "Nahrung1Parameter" und "Nahrung2Parameter" an "Nahrung1Anpassung" und "Nahrung2Anpassung" angepasst haben.

Feld (in "Feld.m" definiert): Diese Klasse beschreibt die Felder, auf denen sich die Tiere bewegen. Für jedes einzelne Feld wird ein Objekt dieser Klasse erzeugt.
Variablen

Art
Diese Variable gibt an, ob auf diesem Feld Nahrung 1 oder Nahrung 2 zu finden ist, oder ob sich dieses Feld am Rand des Spielfeldes befindet. Ist es am Rand, darf es von den Tieren nicht betreten werden. Dies ist eine einfache Lösung, das Problem zu bewältigen, dass Tiere das Spielfeld zu verlassen versuchen.
TierID
Mit dieser Nummer kann das Tier ermittelt werden, welches sich auf dem Feld befindet.
Beweidung
Diese Variable stellt die vorhandenen Nahrungsmittelressourcen des Feldes dar. Wenn sie null erreicht hat, kann kein Tier mehr Nahrungsmittel von diesem Feld schöpfen.
Methoden

Veränderung
Folgende Methoden verändern Variablen des Objekts der Klasse "Feld":
initAmRand:AmRand
Diese Methode belegt die Variablen mit ihren Standardwerten und bestimmt, ob auf dem Feld Nahrung 1 oder Nahrung 2 wächst. Wenn der Übergabeparameter "AmRand" 1 ist, wird das Feld als Randfeld definiert. Diese Methode wird vor dem Beginn der Simulation ausgeführt.
Nutzung
"Nutzung" verkleinert die Variable "Beweidung".
Wachsen
Jede Runde wächst auf jedem Feld die Vegetation. Die Variable "Beweidung" wird erhöht.
neuesTier
Ein neues Tier setzt sich in die Variable "TierID".
Abfrage
Diese Methoden geben die angegebenen Variablen aus:
Beweidung
Beweidung
getTier
TierID
Art
Art

Simulation (in "Simulation.m" definiert): In dem einen von Cocoa erzeugten Objekt dieser Klasse werden die Berechnungen der Simulation durchgeführt. So findet zum Beispiel der Entscheidungsprozess der Tiere in diesem Objekt statt. Die Liste aller Tiere wird auch hier gespeichert.
Variablen

Tiere
In dieser Liste werden die Tiere gespeichert.
Felder
In dieser zweidimensionalen Liste werden die Felder des Spielfelds gespeichert.
prozessLauf
Diese Variable kann entweder 1 oder 0 repräsentieren. Sie gibt an, ob gerade eine Simulation läuft.
AnzahlFelderX, AnzahlFelderY
Hier wird gespeichert, wie weit sich das Spielfeld erstrecken soll.
ProzessZaehler
Mit dieser Variable werden die Runden der Simulation gezählt. Die Variable wird jede Runde um eins erhöht.
Methoden

Steuerung
Folgende Methoden werden vom Objekt der Klasse "Controller" aufgerufen:
starten
Mit dieser Methode wird die Simulation gestartet. Solange nicht "stoppen" ausgeführt wird oder die Population unter 200 Tiere sinkt, ruft diese Methode "ZugController" für jedes Tier auf und lässt danach jedes Feld wachsen.
stoppen
Diese Methode unterbricht die Endlosschleife, welche "starten" erzeugt.
TiereAussetzenSim:Anzahl
Es werden so viele neue Tiere ausgesetzt, wie dieser Methode über "Anzahl" mitgeteilt wird.
Prozess

ZugController:ID
Diese Methode wird pro Runde für jedes Tier einmal ausgeführt. Auf welches Tier sich ein Aufruf bezieht, wird der Methode über "ID" mitgeteilt. "ZugController" zieht dem Tier die Energie ab, die es für seine eigene Aufrechterhaltung (Körper heizen usw.) benötigt. Falls das Tier älter als 200 Jahre ist oder über keine Energiereserven mehr verfügt, wird das Tier der Methode "TierStirbt" übergeben, sonst wird der Entscheidungsprozess des Tieres mit der Methode "EntscheidungTier:gewaehltesTier" eingeleitet.
Abfrage

AnzahlTiere
"AnzahlTiere" gibt die Anzahl Tiere aus, welche in der Tierliste enthalten sind.
TierMitID:ID
Diese Methode gibt das Objekt der Klasse "Tier" zurück, welches dem Übergabeparameter "ID" zugeordnet ist.
ProzessZaehler
"ProzessZaehler" gibt die gleichnamige Variable aus.
Prozesshilfe

EntscheidungTier:gewaehltesTier
Diese Methode trifft für das ihr übergebene Tier "gewaehltesTier" die Entscheidung, welcher Spielzug in dieser Runde ausgeführt werden soll. Dabei werden alle Möglichkeiten mit Punktzahlen bewertet. Möglichkeiten mit hohen Punktzahlen haben in der nachfolgenden zufälligen Ermittlung des auszuführenden Zuges die grössere Chance. Wenn ein auszuführender Zug ermittelt ist, wird dieser an "Tier:gewaehltesTier willTun:TatID mitBewegungUmX:VerschiebungX UmY:VerschiebungY" weitergeleitet.
Tier:gewaehltesTier willTun:TatID mitBewegungUmX:VerschiebungX UmY:VerschiebungY
Dieser Methode wird ein gewünschter Zug eines Tieres übergeben. Nachdem die Methode prüft, ob der Zug überhaupt möglich ist, wird er ausgeführt. Dabei wird dem Tier auch die benötigte Energie für den Zug abgezogen.
TierStirbt:TierID
"TierStirbt:TierID" löscht ein Tier von der Tierliste und meldet dem Feld, auf dem es sich befunden hat, dass sein Tier nun tot ist.

Controller (in "Controller.m" definiert): Von dieser Klasse wird nur ein Objekt direkt von Cocoa erzeugt. Es verarbeitet die Befehle des Benutzers der Applikation, wie zum Beispiel das Klicken auf ein Element der Benutzeroberfläche. Die Befehle werden an die betreffenden Objekte weitergeleitet.
Variablen

------

Methoden

Anzeigen
Diese Methode wird ausgeführt, wenn der Benutzer im Steuerfenster auf "Aktualisieren" klickt. Sie veranlasst das Objekt der Klasse "TableController", die Tierliste zu aktualisieren.
Start
Durch Klicken auf "Simulation starten" im Steuerfenster wird diese Methode aufgerufen. Sie gibt dem Objekt der Klasse "Simulation" den Befehl, die Simulation zu starten.
Stop
Durch Klicken auf "Simulation anhalten" im Steuerfenster wird die Methode "Stop" aufgerufen. Sie gibt dem Objekt der Klasse "Simulation" den Befehl, die Simulation zu beenden.
TiereAussetzen
Wenn der Benutzer im Fenster "Einstellungen" auf Tiere aussetzen klickt, wird dem Objekt der Klasse "Simulation" der Befehl übergeben, so viele Tiere, wie im dazugehörigen Textfeld definiert, auszusetzen.
Website
Diese Methode leitet den Benutzer auf die Website http://evolution.naepflin.com. Sie wird ausgeführt, wenn im Menü unter "Hilfe" "Website besuchen" gewählt wird.
HTMLExport
Durch den Aufruf dieser Methode durch Klicken auf "Tierliste als HTML-Datei exportieren" wird das Objekt der Klasse "HTMLExport" dazu aufgefordert, die Tierliste zu exportieren.

TableController (in "TableController.m" definiert): Das eine von Cocoa erzeugte Objekt dieser Klasse gibt die Informationen zu den Tieren an die Tabelle im Tierlisten-Fenster weiter.
Variablen

------

Methoden

numberOfRowsInTableView:aTableView
Diese Methode gibt die Anzahl Tiere, also die Anzahl Zeilen der Tierliste aus.
tableView:aTableView objectValueForTableColumn:aTableColumn row:rowIndex
Mit dieser Methode kann eine beliebige Variable eines beliebigen Tieres aufgerufen werden.
tableView:aTableView setObjectValue:anObject forTableColumn:aTableColumn row:rowIndex
Diese Methode wird aufgerufen, wenn der Benutzer versucht, die Tabelle zu verändern. Es passiert nichts.

HTMLExport (in "HTMLExport.m" definiert): Mit dem einen von Cocoa erzeugten Objekt dieser Klasse kann die Tierliste im HTML-Format auf den Computer gespeichert werden. Sie berechnet zudem den Durchschnitt der einzelnen Variablen der Tiere.
Variablen

------

Methoden

Exportieren
Diese einzige Methode der Klasse "HTMLExport" setzt den einzigen Prozess in Gang, für den "HTMLExport" zuständig ist, nämlich den Export der Tierliste auf die Festplatte.

7.2.4 Quelltext

In der HTML-Version der Dokumentation habe ich den Quelltext nicht abgedruckt. Sie können ihn jedoch auf dieser Website herunterladen.

7.3 Experimente

7.3.1 Einführung

In diesem Unterkapitel des Anhangs drucke ich Ausschnitte aus einigen Tierlisten ab, welche ich aus der Simulation erhalten habe. Die einzelnen Tiere, die abgedruckt werden, wurden zufällig ausgewählt. So können die Werte der Ausschnitte ungefähr auf die Gesamtpopulation hochgerechnet werden.
In der untersten Zeile jeder Tabelle ist zudem jeweils fett der Durchschnittswert der gesamten Population angegeben.

7.3.2 Experimente

Evolution Version 0.2.0
Anzahl Tiere: 198
Bereits simulierte Runden: 682
Wed Sep 15 12:55:32 2004

Energiestand Nahrung1Anpassung Nahrung2Anpassung Geschlecht Nahrung1Parameter Nahrung2Parameter Alter StandortX StandortY WartenParameter FortpflanzungParameter FortpflanzungEigeneArtParameter StehenBleibenBonus
87238 3796 3507 1 9159 6254 198 2 6 38 342 2000 1510
71810 3229 3022 0 7713 5023 193 3 3 39 236 2000 1209
67238 3433 3187 0 7837 5462 183 5 2 36 296 2000 1274
67048 3349 3416 1 8613 5817 175 6 3 34 295 2000 1390
41917 2176 2173 0 5158 3688 165 5 7 51 190 2000 698
41691 2482 2548 0 5934 4561 146 7 7 38 234 2000 939
55314 3764 3511 1 8739 6034 124 5 1 33 337 2000 939
36937 3022 2877 1 7548 4999 107 1 6 59 264 2000 1208
29700 3162 2942 1 7634 4868 79 8 7 40 290 2000 1164
15875 3482 3628 0 7297 5756 36 5 8 29 321 2000 1544
55131.718750 3425.502441 3261.894531 0.537688 8377.618164 5695.230957 144.226135 4.708543 4.738693 42.417084 301.361816 2000.000000 1354.492432

Evolution Version 0.2.0
Anzahl Tiere: 199
Bereits simulierte Runden: 830
Wed Sep 15 10:12:48 2004

Energiestand Nahrung1Anpassung Nahrung2Anpassung Geschlecht Nahrung1Parameter Nahrung2Parameter Alter StandortX StandortY WartenParameter FortpflanzungParameter FortpflanzungEigeneArtParameter StehenBleibenBonus
87238 3796 3507 1 9159 6254 198 2 6 38 342 2000 1510
71810 3229 3022 0 7713 5023 193 3 3 39 236 2000 1209
67238 3433 3187 0 7837 5462 183 5 2 36 296 2000 1274
67048 3349 3416 1 8613 5817 175 6 3 34 295 2000 1390
41917 2176 2173 0 5158 3688 165 5 7 51 190 2000 698
41691 2482 2548 0 5934 4561 146 7 7 38 234 2000 939
55314 3764 3511 1 8739 6034 124 5 1 33 337 2000 939
36937 3022 2877 1 7548 4999 107 1 6 59 264 2000 1208
29700 3162 2942 1 7634 4868 79 8 7 40 290 2000 1164
15875 3482 3628 0 7297 5756 36 5 8 29 321 2000 1544
55131.718750 3425.502441 3261.894531 0.537688 8377.618164 5695.230957 144.226135 4.708543 4.738693 42.417084 301.361816 2000.000000 1354.492432

Evolution Version 0.2.0
Anzahl Tiere: 199
Bereits simulierte Runden: 1076
Fri Sep 17 18:36:47 2004

Energiestand Nahrung1Anpassung Nahrung2Anpassung Nahrung1Parameter Nahrung2Parameter Anpassung Geschlecht Alter StandortX StandortY WartenParameter FortpflanzungParameter FortpflanzungEigeneArtParameter StehenBleibenBonus
26118 2503 1980 4530 4384 1 0 200 5 7 34 132 2000 820
36879 2472 2278 3711 4885 0 0 192 5 8 26 146 2000 796
53762 2542 321 2793 43 1 1 184 6 2 69 170 2000 808
35532 2492 1771 5178 3558 1 1 180 5 8 35 147 2000 808
72006 3240 416 3505 51 1 1 179 4 4 94 207 2000 1038
23460 1456 1758 1315 3014 1 1 171 2 1 50 146 2000 560
64694 596 2995 73 5407 1 0 169 1 1 63 156 2000 1104
68229 4230 538 3697 64 1 0 156 5 3 54 270 2000 1359
32764 374 1872 46 3583 1 1 156 3 1 52 98 2000 691
54839 3854 493 4108 58 1 0 147 6 6 64 244 2000 1242
36041 2767 2161 5238 4744 1 1 143 2 5 32 142 2000 855
28184 2511 2161 5611 5077 1 1 133 2 6 32 162 2000 856
63035 722 3627 87 6229 1 0 126 5 5 48 187 2000 1336
59993 4401 566 4204 67 1 0 120 8 2 45 278 2000 1422
61508 807 4056 98 4412 1 1 110 5 5 39 208 2000 1494
35051 3265 405 3554 54 1 1 104 8 6 60 217 2000 1027
30530 3540 434 3928 61 1 1 86 4 4 56 236 2000 1094
43411 4142 516 4514 67 1 1 79 7 7 77 272 2000 1304
11998 4256 541 4576 66 1 0 46 8 8 74 272 2000 1363
12082 4436 554 4874 73 1 1 44 7 7 64 291 2000 1399
43058.199219 2466.432129 1788.623169 3363.502441 3145.060303 0.924623 0.462312 142.869354 4.532663 4.412060 49.763821 189.517593 2000.000000 996.231140

7.4 Quellenverzeichnis

7.4.1 Evolution

Zur Erarbeitung der Theorie zur Evolution habe ich folgende beiden Bücher gelesen:
"Evolution" von Walter Kleesattel, 1. Auflage, Cornelsen Verlag Scriptor, herausgegeben 2002, ISBN 3-589-21632-8
"Das egoistische Gen" von Richard Dawkins, 2. Auflage, Spektrum Akademischer Verlag, herausgegeben 1994, ISBN 3-86025-213-5

7.4.2 Programmierung

Bei Schwierigkeiten mit der Programmierung der Simulation habe ich mich an folgende Quellen gewandt:
- Apple Developer Connection (Externer Link)http://developer.apple.com
- CocoaDevCentral (Externer Link)http://cocoadevcentral.com
- MacTechNews (Externer Link)http://www.mactechnews.de

Als Nachschlagewerke für Programmierpraktiken habe ich den Quelltext von folgenden Programmen verwendet:
- Adium X ((Externer Link)http://adium.sourceforge.net)
- Armin Schneiders Primzahlenprogramm primzahlen_source.c:
#include <stdio.h>

int main(void)
{
	FILE *datei;
	 

	int a=7777, b=2;
	int r=0;
	double c=0;
	int check=0;
	printf("Bitte eine ungerade Startzahl eingeben!\n");
	scanf("%i",&a); //Startzahl initalisierung
	c=a%b;
	if(c!=0)
	{
		printf("\nrunning...\n");
		datei = fopen ( "primzahlen.txt" , "w+" );  //Datei zum schreiben öffnen
		if (datei == NULL )  
		{ 
		
		/* 
		Da ist wohl ein Fehler aufgetreten! 
		*/ 
		printf ("\nDie Datei konnte nicht geöffnet werden!\n");
	
		}
		else
		{		
			while(r==0) //endlosschleife
			{
				check=0;
				for(b=3;check==0&&b*(b-2)<a/2;)
				{
					c=a%b;	//Rest der Divison a/b berechnen
					if(c==0)	//Falls Rest gleich 0 check =1
					{
						check=1; 
					}
					if(check==1)//Falls check gleich 1 nächste zahl testen
					{
						break;
					}
					b=b+2;	
				}
				if(check!=1)	//Falls Check!=1 Ist Zahl eine Primzahl wird in Datei geschrieben primzahlen.txt
				{
					fprintf(datei,"%i\n",a);
				}
				a=a+2;
			}
			fclose (datei);
		}
	}
	else
	{
		printf("\nKeine geraden Zahlen bitte!\n");
	}
return 0;
}

7.4.3 Webquellen

Internetseiten haben leider den Charakter, von ihren Betreibern verändert oder gelöscht zu werden. Um meinen Bezug auf Webquellen auch in Zukunft garantieren zu können, bin ich gezwungen, referenzierte Internetseiten hier als Quellen abzudrucken.

Q1 (Externer Link)http://www.drd.de/helmich/bio/evo/fakt/mut/mut02.html (Stand: 6. September 2004) (Download)PDF-Datei (148 KB)
3.1.1.2 Mutationsraten

Bei Bakterien beträgt die Mutationsrate ca. 1/10.000.000.
Wie ist diese Zahl zu verstehen? Betrachten wir dazu ein bestimmtes Gen, z.B. das X-Gen des Lac-Operons (siehe Genetik Genregulation).

Wenn wir nun eine Milliarde Bakterien der Art Escherichia coli untersuchen, so werden wir bei ca. 100 Individuum eine Mutation in diesem Gen finden.

Sind Mutationen eines Gens (DNA-Mutationen oder Gen-Mutationen als Folge von DNA-Mutationen im Regulatorbereich eines Operons) also sehr unwahrscheinlich?

Erinnern wir uns daran, daß sich E. coli-Zellen unter optimalen Bedinungen alle 20 Minuten teilen. Die Tabelle rechts zeigt die Vermehrung einer Ausgangszelle sowie die Zahl der Zellen mit einem mutierten X-Gen. Bereits nach zwölf Stunden sind in der 36. Generation über 3000 mutierte Zellen anzutreffen. Bei Eukaryoten muß man zwischen somatischen Mutationen und Keimbahnmutationen unterscheiden. Somatische Mutationen betreffen irgendwelche Körperzellen des Individuums und werden nicht auf die nachfolgende Generation übertragen. Für die Evolution spielen solche somatischen Mutationen also keine Rolle. Anders sieht es bei den Keimbahnmutationen aus, also bei Mutationen in den Keimzellen (Ei- und Samenzellen).

Die Mutationsrate beträgt bei Eukaryoten etwa 1/1.000.000, ist also zehnmal höher als mehr Gene haben als Prokaryoten, ist die Wahrscheinlichkeit, eine mutierte Keimzelle anzutreffen, ziemlich hoch. Ein Organismus mit 100.000 Genen hätte bei der Mutationsrate von 1/1.000.000 also 10% mutierte Keimzellen. Man nimmt an, daß beim Menschen ca. 10% bis 40% der Keimzellen mindestens ein mutiertes Gen besitzen.

Bei den Eukaryoten hat man schon vor längerer Zeit festgestellt, daß nicht alle Gene mit der gleichen Rate mutieren. Es gibt stabile und labile Gene. Nicht nur das: auch verschiedene Allele eines Gens können mit unterschiedlicher Rate mutieren. Inzwischen hat man sogar sogenannte Mutatorgene entdeckt, die die Mutationsrate anderer Gene kontrollieren. Also scheinen Mutationen doch nicht so ganz zufällige Ereignisse zu sein, manchmal „helfen“ die Organismen nach und erhöhen gezielt die Mutationsrate bestimmter Gene. In sehr variablen Umwelten mag dies eine gute Überlebensstrategie zu sein.

(C) Ulrich Helmich im Februar 2000
Q2 (Externer Link)http://de.wikipedia.org/wiki/Objekt_(objektorientierte_Programmierung) (Stand: 17. September 2004) (Download)PDF-Datei (36 KB)
Objekt (objektorientierte Programmierung) aus Wikipedia, der freien Enzyklopädie

Ein Objekt ist in der objektorientierten Programmierung eine konkrete Ausprägung einer Klasse (Man sagt auch Exemplar oder Instanz einer Klasse). Das Objekt definiert sich über seine Identität, seinen Zustand und sein Verhalten (Bonmot: "Ist was, hat was, kann was").

- Jedes Objekt besitzt eine Identität, die es einzigartig in der Menge von Objekten eines Systems macht.
- Der Zustand eines Objekts wird durch die Werte der Attribute seiner Klasse bestimmt.
- Das Verhalten eines Objekts ergibt sich aus den zur Verfügung stehenden Methoden der zugrundeliegenden Klasse.

Man kann sich das Erstellen von Objekten nach einer Klasse vorstellen wie das Fertigen von Autos aus dem Konstruktionsplan eines bestimmten Fahrzeugtyps. Jedes erzeugte Auto für sich genommen hat eine einzigartige Identität, denn alle Autos können unabhängig voneinander betrieben werden. Klassen sind die Konstruktionspläne für Objekte.

In objektorientierten Programmen bilden Objekte die Einheiten der Datenkapselung. Im Normalfall dienen sie dazu, Dinge der realen Welt zu modellieren (Abstraktion).

In den meisten objektorientierten Sprachen werden alle Objekte nach dem Konstruktionsplan von Klassen erzeugt. Durch die Definition einer Klasse sind die Merkmale all derjenigen Objekte festgelegt, die aus dieser einen Klasse hervorgehenkönnen. Objekte, die aus von einer Basisklasse abgeleiteten Klassen erzeugt wurden, können genauso wie Objekte dieser Basisklasse verwendet werden.

In rein objektorientierten Sprachen wie Smalltalk werden, dem Prinzip alles ist ein Objekt folgend, auch elementare Typen wie Ganzzahlen (Integer) durch Objekte repräsentiert. Auch Klassen selbst sind hier Objekte, die wiederum Ausprägungen von Metaklassen sind. Viele Sprachen, unter anderem C++ und Java folgen allerdings nicht der reinen Lehre der Objektorientierung; daher sind dort elementare Typen keine vollwertigen Objekte, sondern müssen auf Methoden und Struktur komplett verzichten.

In einigen objektorientierten Programmiersprachen wie zum Beispiel JavaScript,NewtonScript und Self wird auf die Deklaration von Klassen gänzlich verzichtet. Statt dessen werden bestehende Objekte, so genannte Prototypen abgeleitet. Die Attribute und Methoden des Prototypen kommen immer dann zum Einsatz, wenn sie nicht im abgeleiteten Objekt explizit überschrieben wurden. Dies ist vor allem für dieEntwicklung kleinerer Programme von Vorteil, da es einfacher und zeitsparend ist.

Weblinks

Prototypen in der Objektorientierten Programmierung (englisch) (http://lieber.www.media.mit.edu/people/lieber/Lieberary/OOP/Delegation/Delegation.html)

Von "http://de.wikipedia.org/wiki/Objekt_%28objektorientierte_Programmierung%29" Eingeordnet unter: Objektorientierte Programmierung
Q3 (Externer Link)http://de.wikipedia.org/wiki/Klasse_(objektorientierte_Programmierung) (Stand: 17. September 2004) (Download)PDF-Datei (60 KB)
Klasse (objektorientierte Programmierung) aus Wikipedia, der freien Enzyklopädie

Klasse ist in der objektorientierten Programmierung ein abstrakter Oberbegriff für die Beschreibung der gemeinsamen Struktur und/oder des gemeinsamen Verhaltens von Objekten (Klassifizierung). Sie dient dazu, Dinge (Objekte) derrealen Welt zu abstrahieren. Im Zusammenspiel mit anderen Klassen ermöglichen sie die Modellierung eines abgegrenzten Systems der realen Welt( siehe Objektorientiertes Design).

Die Struktur einer Klasse bilden die Attribute (auch Eigenschaften), das Verhalten die Methoden (auch Operation, Funktion, Prozedur) der Klasse.

Aus Klassen erzeugte Objekte werden als Exemplare oder Instanzen der Klasse bezeichnet.

In manchen Programmiersprachen gibt es zu jeder Klasse ein bestimmtesObjekt (Klassenobjekt), das dazu da ist, die Klasse zur Laufzeit zu repräsentieren; dieses Klassenobjekt ist dann auch zuständig für die Erzeugung von Objekten der Klasse und den Aufruf der korrekten Methode.

Klassen können von anderen Klassen abgeleitet werden (Vererbung). Dabei erbt die Klasse die Datenstruktur ( Attribute) und die Methoden von der vererbenden Klasse (Basisklasse). Die abgeleitete Klasse (Subklasse) kann Methoden der Basisklasse überschreiben (sofern diese es erlaubt; die Möglichkeit, dies zuverbieten, hängt von der Programmiersprache ab), d.h. die Methode neu implementieren, und eigene Methoden und Daten (Attribute) hinzufügen. EinObjekt der abgeleiteten Klasse kann überall verwendet werden, wo ein Objekt der Basisklasse erwartet wird; überschriebene Methoden werden dann auf derabgeleiteten Klasse ausgeführt (Polymorphie).

Klassen werden in der Regel in Form von Klassenbibliothekenzusammengefasst, die häufig thematisch organisiert sind. So können Anwender einer objektorientierten Programmiersprache Klassenbibliothekenerwerben, die den Zugriff auf Datenbanken ermöglichen.

Beispiele

Angenommen es wird eine Klasse für eine Tabelle einer einfachen Datenbankentworfen. Ein Objekt ist dann ein einzelner Datensatz ( = Zeile ) in dieser Tabelle.

Ein Klasse Bankkonto könnte beispielsweise mit folgenden Eigenschaftendefiniert werden:

- hat eine Kontonummer (Attribut)
- hat einen Kontoinhaber (Referenz auf einen Kunden)
- hat eine Liste von Buchungen (Liste von Referenzen auf Buchungen)
- hat einen Saldo (Attribut)
- kann eine Einzahlung durchführen (Methode)
- kann eine Auszahlung durchführen (Methode)

Jede Kontobewegung würde dann einem Methodenaufruf entsprechen und der Liste der Buchungen ein Element hinzufügen sowie den Saldo modifizieren.

Um eine Klasse "Schueler" zu erzeugen, kann man verschiedene Eigenschaftendefinieren: Name, Vorname, Geburtstag, Geschlecht, Adresse. Ein spezieller Schüler ist dann ein Objekt dieser Klasse, wenn für ihn eine Instanz erzeugt wurde und wenn seine Daten in die Instanzattribute eingetragen sind.

Programmbeispiel

Das folgende Beispiel ist in C++ geschrieben:

[...]

Dieses Programm definiert eine Klasse Basisklasse und eine davon abgeleitete Klasse abgeleitete_Klasse.

Die Basisklasse hat eine Methode namens machwas(), die Basisklasse::machwas ausgibt (dafür ist die Zeile mit std::cout zuständig). virtual bedeutet in C++ "kann überschrieben werden". Das macht die abgeleitete Klasse dann auch, sie definiert die Methode um, so dass sie abgeleitete_Klasse::machwas ausgibt.

Anschließend folgt die Definition einer eigenständigen Funktion mach_was_mit(...) , die ein Objekt der Basisklasse als Argument bekommt. Auf diesem Objekt wird die Methode machwas() gerufen.

(objekt1) als auch der abgeleiteten Klasse (objekt2) definiert, und dann mach_was_mit(...) zuerst mit einem Objekt der Basisklasse, dann mit einem Objekt der abgeleiteten Klasse aufruft.

Wird dieses Programm kompiliert und ausgeführt, so gibt es [...] aus, obwohl die Funktion mach_was_mit(...) nur für ein Basisklassenobjekt als Argument definiert ist (in der Tat hätte die abgeleitete Klasse sogar in einer später dazu gefügten Quelldatei geschrieben werden können, nachdem die Funktion mach_was_mit(...) schon lange fertig kompiliert war). Dieses Verhalten nennt man Polymorphie.

Einige Programmiersprachen mit Klassen

- SmalltalkPython
- Java
- Objective C
- Object Pascal, Delphi
- C#
- C++
- Objective CAML

Von "http://de.wikipedia.org/wiki/Klasse_%28objektorientierte_Programmierung%29"
Eingeordnet unter: Objektorientierte Programmierung Basisklasse::machwas abgeleitete_Klasse::machwas

7.5 Glossar

C: C ist eine weit verbreitete Programmiersprache
Cocoa: Standardprogrammierumgebung von Mac OS X
evolutionär stabil: Eine Ausprägung eines Merkmals ist evolutionär stabil, wenn jede Mutation der Ausprägung einen Selektionsnachteil mit sich bringt. Jede Ausprägung im Tiefpunkt einer Selektionsmulde ist evolutionär stabil.
Mac OS X: Betriebssystem für Apple-Macintosh-Computer
Meiose: Zellteilung, bei der Keimzellen (Geschlechtszellen) gebildet werden
Mitose: Zellteilung, bei der Körperzellen gebildet werden
Programmiersprache: Computer arbeiten bekanntlich nur mit Nullen und Einsen. Da diese Form der Programmierung für den Menschen jedoch zu kompliziert und zu fehlerträchtig wäre, wurden Programmiersprachen entwickelt, die mit Befehlen, die von der menschlichen Sprache abgeleitet sind (z. B. "if...else...") arbeiten. Ein zusätzliches Programm, der Compiler, muss diesen Text dann zurück in Computersprache übersetzen.
Programmierumgebung: Über dieses Medium kann der Programmierer unter Anderem die Elemente der Benutzeroberfläche (Knöpfe, Textfelder, Fenster usw.) in sein Programm mit einbeziehen.
Quelltext: Dies ist ein Programm, welches sich in der Form einer Programmiersprache befindet. Es muss nun mit einem Compiler übersetzt werden, um ausgeführt werden zu können.
<< zurück

1 Quelle: "Evolution" von Walter Kleesattel, Seite 29
2 Quelle: (Externer Link)http://www.drd.de/helmich/bio/evo/fakt/mut/mut02.html, Q1 im Webquellenverzeichnis
3 Quelle: "Evolution" von Walter Kleesattel, Seite 53
4 Quelle: "Evolution" von Walter Kleesattel, Seite 15
5 Quelle: "Evolution" von Walter Kleesattel, Seite 51
Ivo Näpflin, 10.11.2004    Valid HTML 4.01!     Valid CSS!     Navigation: eine Ebene nach oben, Sitemap