Entwicklung eines Systems zur evo- lutionären

Werbung
F
Entwicklung eines Systems zur evolutionären Adaptation dreidimensionaler
künstlicher Lebewesen
Development Of A System For The Evolutionary Adaptation Of
Three-Dimensional Artificial Creatures
Tim Gottwald
Master Abschlussarbeit
Betreuer: Prof. Dr. Rainer Oechsle
Trier, Januar 2006
Danksagungen
Ein großer Dank geht an Professor Dr. Rainer Oechsle, der mich bei dieser Arbeit
betreut hat und der es mir ermöglicht hat, mein Studium mit diesem außergewöhnlichen und hochinteressanten Thema abzuschließen.
Auch meiner Freundin Angela Otting möchte ich herzlich danken, da sie sich
trotz aller fachlichen Schwierigkeiten bemüht hat, meine inhaltlichen und orthografischen Fehler aufzudecken, indem sie diese Seiten Korrektur gelesen hat.
Ein weiterer Dank geht an Ben Janus, einem ehemaligen Kommilitonen, der
mir einige hilfreiche Hinweise zur Arbeitsweise mit genetischen Algorithmen geben
konnte und an Florian Adolf, ebenfalls ein ehemaliger Kommilitone, der mich auf
die Open Dynamics Engine aufmerksam gemacht hat.
Meinen Eltern möchte ich einen besonderen Dank aussprechen, da sie es waren,
die mir das Studium erst ermöglicht haben.
Kurzfassung
Manche Tiere können sofort nach ihrer Geburt stehen und laufen; bei uns Menschen dauert es viele Monate, bis der erste Schritt getan ist. Mit den in dieser
Arbeit geschaffenen künstlichen Lebewesen wird das Problem der Fortbewegung
untersucht. Die Lebewesen müssen lernen, sich mit den ihnen gegebenen Körpern
fortzubewegen. Für diese schwierige Aufgabe stehen ihnen Verfahren wie genetische Programmierung oder künstliche neuronale Netze zur Verfügung. Die dabei
entwickelten Strategien sind häufig sehr interessant und einfallsreich und nicht
selten sehr amüsant anzusehen.
Um sich möglichst nahe am natürlichen Vorbild orientieren zu können, halten sich die künstlichen Lebewesen in einer dreidimensionalen Umwelt auf, in der
mit Hilfe physikalischer Simulationen ähnliche Bedingungen herrschen wie in der
hiesigen Natur.
Bei der Lösung dieser Aufgabe, dem Erlernen eines effektiven Bewegungsablaufs, zeigt sich wie schon in der Natur, die Vorbild vieler der hier erschaffenen
künstlichen Lebewesen ist, dass der Erfolg auch in der Form des Körpers liegt. Die
evolutionär getriebene Entwicklung, die in der Tierwelt schon die bizarrsten Geschöpfe hervorgebracht hat - hier sei an Beispiele aus dem Insektenreich erinnert wird in dieser Arbeit ebenfalls auf die künstlichen Lebewesen angewendet.
Um all diesen Aufgaben gerecht zu werden, kommen frei verfügbare Bibliotheken
wie Open Dynamics Enginge (ODE) für die physikalische Simulation, Java3D für
die grafische Darstellung im dreidimensionalen Raum sowie eigene Konzepte zur
genetischen Beschreibung der künstlichen Lebewesen und Implementierungen der
genetischen Algorithmen und neuronalen Netze zum Einsatz.
Künstliches Leben“ ist seit jeher ein interdisziplinärer Forschungszweig und
”
allein in dieser Arbeit, die nur einen kleinen Bereich dieser Wissenschaft abdeckt,
finden sich viele Berührungspunkte zu Physik und Biologie.
Inhaltsverzeichnis
1
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2
Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1 Physikalische Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Java 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Neuronale Netze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Genetischer Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Wettkampfsituation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6 Verteiltes Rechnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7 Offene Evolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
4
4
5
5
6
6
6
3
Künstliches Leben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1 Natürliches Leben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Was ist künstliches Leben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Geschichte des KL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Formen künstlichen Lebens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.1 Zelluläre Automaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.2 Biomorphe und L-Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.3 tierra, avida, amoeba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.4 Animate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.5 Von Viren und Würmern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Verwandte Arbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1 Karl Sims virtuelle Kreaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.2 Gene Ruebsamens embodied agents . . . . . . . . . . . . . . . . . . . . . . .
3.5.3 Sigel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.4 Marbachs modulare Roboter . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
8
9
10
11
11
13
14
15
17
17
18
19
20
20
4
Der Genetische Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 Genetik in der Natur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Geschichte der Genetik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.2 Aufbau und Arbeitsweise von Genen . . . . . . . . . . . . . . . . . . . . . .
4.1.3 Evolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Genetik in der Informatik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
22
22
22
26
27
Inhaltsverzeichnis
V
4.3 Fitnessfunktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.1 Lineare skalierte Fitness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.2 σ-Skalierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.3 Exponentielle Skalierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.4 Geteilte Fitness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.5 Mehrkriterienoptimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.6 Fitnessfunktion mit Zusatzbedingungen . . . . . . . . . . . . . . . . . . . .
4.4 Selektionsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.1 Stochastic Sampling with Replacement . . . . . . . . . . . . . . . . . . . .
4.4.2 Remainder Stochastic Sampling . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.3 Stochastic Universal Sampling . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.4 Boltzmann Selektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.5 Lineares Ranking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.6 Wettkampf-Selektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.7 Steady State Reproduktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.8 Deterministisches Crowding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5 Rekombination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.1 One-point-crossover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.2 Two-point-Crossover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.3 k-point-Crossover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.4 Parametrisiertes Uniform Crossover . . . . . . . . . . . . . . . . . . . . . . .
4.5.5 Shuffle Crossover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.6 Punctuated Crossover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5.7 Inversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6 Mutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6.1 Non Uniform Mutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7 Genetische Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
30
30
31
32
32
33
34
34
35
35
36
36
36
37
37
37
38
38
38
39
39
40
40
41
41
5
Künstliche Neuronale Netze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1 Neuronale Netze in der Natur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Aufbau und Funktionsweise einer Nervenzelle . . . . . . . . . . . . . . . . . . . .
5.3 Neuronale Netze in der Informatik . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1 Netzaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4 Lernverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 Backpropagation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6 Netzarchitekturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.1 (Multi Layer) Perzeptron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.2 Elman-Netze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.3 Selbstorganisierende Karten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.7 Optimierung neuronaler Netze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
43
43
45
45
46
47
48
48
49
50
52
6
Open Dynamics Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.1 Eigenschaften von ODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 Bestandteile von ODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2.1 World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
55
56
56
Inhaltsverzeichnis
6.2.2
6.2.3
6.2.4
6.2.5
6.3 ODE
VI
Body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Joint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Collision Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gesamtsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
in der Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
58
61
62
62
7
Java3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1 Der Java3D-Szenengraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Interaktion in Java 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 Vektormathematik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4 Java3D und ODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
64
67
69
69
8
Entwurf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.1 Kreaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.1.1 Genetische Beschreibung der Kreaturen . . . . . . . . . . . . . . . . . . . .
8.1.2 Kreatur-Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.1.3 Einbinden in die physikalische Simulation . . . . . . . . . . . . . . . . . .
8.1.4 Bewegung und Denken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 Die Simulationsumgebung Evita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3 Der Genetische Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
70
70
72
72
73
75
77
9
Implementierung und Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1 XML-Spezifikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2 ODE-Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3 Videogenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.4 Realisierung des genetischen Algorithmus . . . . . . . . . . . . . . . . . . . . . . .
9.5 Grafische Benutzeroberfläche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.5.1 Starten eines genetischen Algorithmus . . . . . . . . . . . . . . . . . . . . .
9.5.2 Ansicht der Resultate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.6 Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.6.1 Statische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.6.2 Testen der Softcomputingverfahren . . . . . . . . . . . . . . . . . . . . . . . .
9.6.3 Systemtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
80
81
82
83
84
84
85
86
86
86
87
10 Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1 Gehirntypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.1Gehirn mit neuronalen Netzen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.2Gehirn mit genetischer Programmierung . . . . . . . . . . . . . . . . . . .
10.2 Erlernen eines Bewegungsablaufs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3 Körperevolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3.1Aufbau der Chromosomen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3.2Genetische Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3.3Zufällige Erzeugung von Chromosomen . . . . . . . . . . . . . . . . . . . .
10.3.4Bewertung der Chromosomen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.3.5Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
88
88
90
93
94
94
95
95
95
96
Inhaltsverzeichnis
10.4 Bewegen vordefinierter Körper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4.1TwoArm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4.2Spinnentiere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4.3Vierbeiner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4.4Sonstige . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VII
96
97
100
102
103
11 Zusammenfassung und Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Abbildungsverzeichnis
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
Beispiele verschiedener Klassen (Quelle: [Wol02] S. 284) . . . . . . . . . . .
Rekursives Muster (Quelle: [Wol02] S. 263) . . . . . . . . . . . . . . . . . . . . . .
Beispielabfolge eines Life-Spiels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Langtons Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Beispiele für Biomorphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Beispiele für L-Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Boid-Schwarm beim Umfliegen von Hindernissen . . . . . . . . . . . . . . . . .
Beispielgraphen und die daraus entstehende Morphologie. (Quelle:
[Sim94b] S. 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9 Beispiele sich bekämpfender Kreaturen (Quelle: [Sim94a] S. 37) . . . .
3.10 Bewegungsablauf eines Dreibeiners (Quelle: [MCV01] S. 178) . . . . . .
3.11 Beispiel eines generierten Roboters (Quelle: [Mar05] S. 71) . . . . . . . .
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
Erbgang mit zwei Merkmalen (dihybrider Erbgang) (Quelle: [HB89]
S. 355) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aufbau der DNS (i.A.a. [HB89] S. 357) . . . . . . . . . . . . . . . . . . . . . . . . .
Chromosomenfeinstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Crossing-over mit Austausch gleicher Chromatiden-Abschnitte
(i.A.a. [HB89] S. 441) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Zeichenstring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Crossover (Quelle: [IG04] S. 40) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mutation (Quelle: [IG04] S. 41) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Überlebens-/Vermehrungswahrscheinlichkeit (Quelle: [IG04] S. 39) .
Two-Point-Crossover (Quelle: [IG04] S.88) . . . . . . . . . . . . . . . . . . . . . .
Two-Point-Crossover mit Ringinterpretation des Chromosoms
(i.A.a. [IG04] S.88) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4-Point-Crossover (i.A.a. [IG04] S.89) . . . . . . . . . . . . . . . . . . . . . . . . . .
Beispiel parametrisiertes Uniform Crossover (i.A.a. [IG04] S.89) . . . .
Inversion (Quelle: [IG04] S.98) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Beispielprogramme als Bäume (Quelle: [IG04] S. 129) . . . . . . . . . . . . .
Crossover: Austausch ausgewählter Teilbäume (Quelle: [IG04] S.
131f) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
12
12
13
13
14
16
18
19
20
21
24
25
25
27
28
28
29
34
38
38
39
39
40
42
42
Abbildungsverzeichnis
5.1
5.2
IX
5.9
Ein typisches Neuron (Nervenzelle) (Quelle:[JS91] S. 36) . . . . . . . . . .
Beispiel-Topologien und ihre Verbindungsmatrizen (Quelle:[Zel94]
S. 79) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schema des Perzeptrons (links) und Ausgabeneuron des
Perzeptrons (rechts) (Quelle:[Zel94] S. 98) . . . . . . . . . . . . . . . . . . . . . . .
Dreistufiges Perzeptron (i.A.a.:[Zel94] S. 102) . . . . . . . . . . . . . . . . . . . .
Architektur eines Elman-Netzes (i.A.a.:[Zel94], S. 141) . . . . . . . . . . . .
Netzstruktur der selbstorganisierenden Karten (i.A.a.:[Zel94] S. 180)
Netzstruktur der selbstorganisierenden Karten (i.A.a.:[Zel94] S. 182)
Distanzfunktionen hgauss , hcylinder , hcone und hcos (Quelle:[Zel94] S.
183) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entfaltung einer Kohonenkarte (Quelle:[Zel94] S. 184) . . . . . . . . . . . .
52
53
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
Kugelgelenk (Quelle:[Smi04] S. 28) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Achsengelenk (Quelle:[Smi04], S. 29) . . . . . . . . . . . . . . . . . . . . . . . . . . .
Radaufhängung (Quelle:[Smi04] S. 32) . . . . . . . . . . . . . . . . . . . . . . . . . .
Schiebeverbindung (Quelle:[Smi04] S. 30) . . . . . . . . . . . . . . . . . . . . . . .
Universalgelenk (Quelle:[Smi04] S. 30) . . . . . . . . . . . . . . . . . . . . . . . . . .
Kontaktverbindung (Quelle:[Smi04] S. 33) . . . . . . . . . . . . . . . . . . . . . . .
Gelenkmotor (Quelle:[Smi04] S. 36) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ODE Gesamtsystem (Quelle:[DS04] S. 37) . . . . . . . . . . . . . . . . . . . . . .
58
59
59
60
60
61
61
62
7.1
7.2
7.3
7.4
Elemente eines Szenengraphen (Quelle: [Bou99] S. 1-4) . . . . . . . . . . .
Beispiel-Szenengraph (Quelle:[Bou99] S. 1-5) . . . . . . . . . . . . . . . . . . . .
Geometrien (Quelle:[Bou99] S. 2-26) . . . . . . . . . . . . . . . . . . . . . . . . . . .
Beispiele für steigende, fallende oder unbestimmter Wellenformen
eines Alpha-Objekts (Quelle:[Bou99] S. 5-4) . . . . . . . . . . . . . . . . . . . . .
65
66
67
68
8.1
8.2
8.3
8.4
8.5
UML-Beschreibung der Chromosomen . . . . . . . . . . . . . . . . . . . . . . . . . .
UML-Beschreibung der Kreaturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Klassenübersicht für das ODE-Binding . . . . . . . . . . . . . . . . . . . . . . . . .
Von XML nach ODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ablauf eines GA zum Erlernen eines Bewegungsablaufs . . . . . . . . . . .
72
73
74
74
79
9.1
9.2
GUI zum Starten eines genetischen Algorithmus . . . . . . . . . . . . . . . . . 85
GUI zum Starten eines Ergebnisses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
10.1
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9
Beispiel eines Berechnungsbaums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Generierter Körperbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TwoArm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fitnessverlauf gerichtete Fitness in X-Richtung . . . . . . . . . . . . . . . . . .
Fitnessverlauf gerichtete Fitness in Y-Richtung . . . . . . . . . . . . . . . . . .
Fitnessverlauf Ruebsamen, Y-Richtung . . . . . . . . . . . . . . . . . . . . . . . . .
Spinnentiere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fitnessverlauf Trippelschritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fitnessverlauf Trippelschritte und Drückbewegungen . . . . . . . . . . . . .
5.3
5.4
5.5
5.6
5.7
5.8
44
46
48
49
50
51
51
92
96
97
98
99
99
100
101
101
Abbildungsverzeichnis
10.10Fitnessverlauf krebsgleich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.11Vierbeiner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.12Fitnessverlauf rückwärtige Bewegung . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.13Fitnessverlauf vorwärtsgerichtete Bewegung . . . . . . . . . . . . . . . . . . . . .
X
102
102
103
104
1
Einleitung
Das Thema künstliches Leben umfasst viele Facetten der Informatik, aber auch
der menschlichen Fantasie. Diese Arbeit beschäftigt sich vertieft mit einem kleinen Teilgebiet dieser Wissenschaft. Hier finden sich Versuche zur evolutionären
Adaptation dreidimensionaler künstlicher Lebewesen.
Die genaue Aufgabenstellung in Kapitel 2 beschreibt die Problemstellung und
Ziele dieser Arbeit. Dabei wird genauer auf den Begriff evolutionäre Adaptation
eingegangen und erläutert, welche Ansätze verfolgt werden.
Kapitel 3 führt in die Thematik des künstlichen Lebens ein. Es handelt von
den Ursprüngen dieser Idee aus Religion und Literatur und stellt viele Bereiche,
Methoden und Möglichkeiten aus Sicht der Informatik vor. Hier begegnen dem
informatikvertrauten Leser bekannte Namen wie von Neumann, Turing oder Babbage. Das Kapitel schließt mit einem kurzen Abriss von Arbeiten, die ähnliche Ziele
wie diese verfolgten. Damit umfasst dieser Teil Themen vom Beginn der Informatik
mit Babbages Rechenmaschine bis zu modernsten Robotersimulationen.
Eines der hier verwendeten Softcomputingverfahren, die genetischen Algorithmen, werden in Kapitel 4 vorgestellt. Dabei wird zunächst der biologische und historische Hintergrund beleuchtet, bevor einzelne Konzepte wie Fitnessberechnung,
Selektionsverfahren oder genetische Operatoren wie Crossover und Mutation behandelt werden.
Kapitel 5 gibt einen kurzen Überblick über den biologischen und historischen
Hintergrund sowie eine kurze Einführung in Architekturen und Lernverfahren
künstlicher neuronaler Netze. Das Kapitel endet mit der Vorstellung eines Verfahrens, das künstliche neuronale Netze mit Hilfe genetischer Methoden optimiert,
der Neuroevolution.
Die zur physikalischen Simulation verwendete Bibliothek Open Dynamics Engine (ODE) wird in Kapitel 6 vorgestellt, es gibt einen kurzen Überblick über den
Umfang und die Arbeitsweise der Bibliothek.
Die Darstellung der physikalischen Simulation soll in einer dreidimensionalen
Umgebung stattfinden. Hier fiel die Wahl auf Java3D. Auf diese Technologie wird
in Kapitel 7 genauer eingegangen. Es werden alle grundlegenden Konzepte und
Möglichkeiten erläutert sowie das Verfahren, ODE und Java3D zur Zusammenarbeit zu bewegen.
1 Einleitung
2
Der objektorientierte und konzeptionelle Entwurf wird in Kapitel 8 vorgestellt.
Hier wird das System erklärt, das alle bisher genannten Bereiche zusammenführt
und mit dem die künstlichen dreidimensionalen Lebewesen simuliert und bewertet
werden. Es erfolgt eine Einführung in die genetische Beschreibung der Kreaturen,
wie sie denken“ und wie sie ihre Bewegungen koordinieren können.
”
Kapitel 9 geht dann genauer auf die Implementierung der einzelnen Teile ein. Es
erläutert die Spezifikation der Gene in XML, beschreibt einige knifflige Programmteile und geht detaillierter auf die Realisierung des genetischen Algorithmus ein,
der in dieser Arbeit verwendet wird.
Eine genaue Beschreibung der hier implementierten Kontrollmechanismen in
Form von Gehirnen, die Evolution des Körperbaus einer Kreatur und die Ergebnisse einiger Versuche mit und ohne vordefinierter Körper finden sich in Kapitel 10.
Ein kurzes Fazit und ein Ausblick auf mögliche Erweiterungen dieser Arbeit
werden in Kapitel 11 gegeben.
2
Aufgabenstellung
Evolutionäre Adaptation dreidimensionaler, künstlicher Lebewesen. Dieser Begriff
beschreibt die Aufgabe und die Zielsetzung dieser Arbeit.
Unter evolutionären Anpassungen (Adaptation) versteht man Eigenhei”
ten in Körperbau und Verhalten, die als Antwort“ auf spezielle Umweltge”
gebenheiten gedeutet werden können.“1
Das Erlernen von Bewegungsabläufen und -strategien steht in dieser Arbeit im
Vordergrund. Und es stellen sich die Fragen, welche Voraussetzungen gelten müssen, um eine gute Strategie zu entwickeln, welche Technologien können eingesetzt
werden, um diese auszubilden, wie müssen Körper aufgebaut sein, die sich besonders effektiv bewegen können? Durch all diese Erkenntnisse soll erreicht werden,
dem Phänomen der Evolution durch Computersimulationen näher zu rücken, in
der Absicht Gründe zu finden, warum sich manche Lebewesen und Formen durchgesetzt haben und andere wiederum nicht.
Inspiriert von den Ergebnissen von Karl Sims sollen künstliche Lebewesen in
einer physikalisch realistischen Umgebung erzeugt werden, deren Verhalten und
Aussehen von Evolution bestimmt ist. Das Hauptziel ist es, die Ergebnisse von Karl
Sims nachzuvollziehen und Kreaturen zu erschaffen, die sich in einer gegebenen
Umgebung etablieren. Hierzu sollen sie in der Lage sein, ihre Anatomie als auch
ihr Verhalten entsprechend anzupassen.
Aus der obigen Aufgabenstellung ergeben sich zunächst vier Themenschwerpunkte, die es zu lösen gilt. Diese ersten Ergebnisse werden aller Vorraussicht nach
den weiteren Verlauf der Arbeit bestimmen. Aber zunächst liegt das Hauptaugenmerk auf:
1.
2.
3.
4.
der physikalischen Simulation,
deren Darstellung mit Java 3D,
dem Erlernen des Verhaltens mit Hilfe neuronaler Netze und
der anatomischen Anpassung durch einen genetischen Algorithmus.
Diese Ziele sollten in jedem Fall erfüllt werden. Das weitere Vorgehen hängt
allerdings stark von den Ergebnissen dieser Ziele ab. So wäre es z.B. möglich, die
1
http://de.wikipedia.org/wiki/Evolutionäre Anpassung
2.2 Java 3D
4
aufkommende Rechenlast zu verteilen, um die einzelnen Probleme von unterschiedlichen Rechnern bearbeiten zu lassen.
2.1 Physikalische Simulation
Der erste Schwerpunkt liegt in der Simulation der physikalischen Umgebung. Diese Aufgabe könnte von Open Dynamics Engine (ODE) übernommen werden. Die
genaue Betrachtung gerade dieser Bibliothek lohnt sich, da sie, im Gegensatz zu
vergleichbaren Angeboten, nicht nur frei verfügbar, sondern auch auf Java portierbar ist. Innerhalb dieser Betrachtung müssen die Möglichkeiten, Einschränkungen,
Vorteile und Nachteile dieser Bibliothek untersucht werden, um letztendlich zu
entscheiden, inwiefern sie für diese Aufgabenstellung geeignet ist, oder ob Alternativen untersucht werden müssen.
Die Bibliothek muss es ermöglichen, die einzelnen Körperteile zu beschreiben,
deren physikalische Maße zu bestimmen und sie untereinander zu verbinden. Hierzu sollten mehrere Verbindungstypen eingesetzt werden können, um z.B. Kugeloder Scharniergelenke zu simulieren. Schließlich muss es möglich sein, diese Verbindungen anzusteuern, um letztendlich die Bewegungen eines Individuums zu
erzeugen.
Die Umgebung, in der die Kreaturen agieren, sollte ebenfalls relativ einfach
erzeugt werden können. Das Einlesen von 3D-Formaten wie z.B. VRML wäre da
sehr hilfreich.
Sollten diese Voraussetzungen erfüllt werden, steht dem Einsatz der Bibliothek
nichts mehr im Weg und ein wichtiger Schritt wäre vollzogen.
2.2 Java 3D
Der nächste Themenschwerpunkt, der sich auch als eher praktisches Problem herausstellt, ist die Darstellung, die mit Hilfe von Java 3D realisiert werden soll. Hier
könnte eine Verbindung zu ODE hilfreich sein und viel unnötige Arbeit ersparen.
D.h. die physikalische Umgebung, die in ODE simuliert wird, soll ohne weiteren
Programmieraufwand in Java 3D dargestellt werden können.
Zusätzlich zur Darstellung wird eine variable Kameraführung benötigt, die manuell angesteuert werden soll oder die die Verfolgung einzelner Kreaturen ermöglicht. Mit Hilfe von Texturen und Lichteffekten könnte die Darstellung zusätzlich
verbessert werden.
Die Generierung von Videos wäre zur Präsentation oder zur Analyse der Ergebnisse hilfreich. Möglichkeiten, mit der sich diese Aufgabe realisieren lässt, müssen
entsprechend untersucht und verifiziert werden. Hier müssen Alternativen wie z.B.
Einzelbildgenerierung, Vidiocapture oder der Einsatz des Java Media Frameworks
(JMF) gegenübergestellt werden, um zu entscheiden, welche sich am ehesten realisieren lässt.
2.4 Genetischer Algorithmus
5
Viele Eigenheiten, Vorteile oder auch Probleme werden wohl erst beim praktischen Einsatz von ODE und Java 3D auftauchen. Dadurch wird sich die Bearbeitung dieser beiden Teilbereiche wohl über den gesamten Zeitraum der Arbeit
erstrecken.
2.3 Neuronale Netze
Ein besonderer Schwerpunkt liegt im Erlernen der richtigen Bewegung oder allgemein dem Verhalten der Kreaturen. Hier ist es naheliegend, ein künstliches neuronales Netz zu verwenden, das die Funktionsweise der Gehirne von Wirbeltieren
simuliert. Welcher Netztyp und welches Lernverfahren hierzu am geeignetsten sind,
gilt es zusätzlich zu erforschen.
Neben der Wahl des Netztyps müssen verschiedene Konfigurationen und Parameter getestet werden, um einen möglichst guten Lernfortschritt zu erzielen. Da
ein solches Netz eine Art Regler darstellt, ist es besonders wichtig, die Informationen zu wählen, die der Regler als Eingabe erhält und die er auswerten muss,
um entsprechend zu reagieren. Die Simulation diverser Sinnesorgane wäre hier angebracht, um z.B. die eigene Ausrichtung oder Geschwindigkeit zu erfahren oder
äussere Einflüsse wie andere Kreaturen, die Umgebung, Hindernisse usw. aufzunehmen.
Andere Arbeiten haben sich an dieser Stelle für genetische Algorithmen bzw.
genetische Programmierung entschieden, obwohl ein neuronales Netz dem biologischen Vorbild, dem Gehirn, am nächsten kommt. Die Entscheidung gegen ein
neuronales Netz könnte aber auch auf schlechten Erfahrungen beruhen, die den
Einsatz dieser Technologie verhinderten. Um nicht in eine Sackgasse zu geraten,
muss daher ein relativ schnelles Einlenken möglich sein, um auf Alternativen umschwenken zu können.
2.4 Genetischer Algorithmus
Ein weiterer Aspekt ist die Definition eines genetischen Algorithmus, der für die
Evolution der Morphologie der einzelnen Kreaturen verantwortlich ist.
Voraussetzung für den Einsatz eines genetischen Algorithmus ist eine entsprechende Beschreibung des Körperbaus, z.B. ein gerichteter Graph, wie er von Karl
Sims verwendet wurde. Der Einsatz der genetischen Methoden: Selektion, Mutation
und Cross Over sollte anhand dieser Beschreibung möglichst einfach zu realisieren
sein.
Ähnlich wie bei den neuronalen Netzen ist es hier nötig, viele Konfigurationsmöglichkeiten bereitzustellen, um verschiedene Aspekte der Genetik einzubringen.
Diese umfassen z.B. unterschiedliche Selektionsstrategien oder unterschiedlich hohe Mutationsraten.
Zu Beginn der Arbeit soll eine Fitnessfunktion die evolutionäre Adaptation
beeinflussen und damit sowohl dem neuronalen Netz als auch dem genetischen
2.7 Offene Evolution
6
Algorithmus als Richtlinie dienen. Ob es möglich ist, auf diese Funktion zu verzichten oder ihren Einfluss zumindest abzuschwächen, könnte ebenfalls noch Teil
dieser Arbeit werden.
2.5 Wettkampfsituation
In der Literatur finden sich häufig Hinweise, dass die Evolution durch Wettkampfsituationen besonders angetrieben wird. Diese Erkenntnis soll auch in dieser Arbeit
nicht außer Acht gelassen werden.
Aus diesem Grund sollten viele unterschiedliche Wettkampfsituation simuliert
werden. Hierunter fallen z.B. Aufgaben wie Wettläufe“, Fortbewegung in schwie”
rigem Gelände oder der Umgang mit Hindernissen. Angesichts der bevorstehenden
Fußballweltmeisterschaft könnte aber auch ein vereinfachtes Fußballspiel simuliert
werden, in dem zwei oder mehrere Kreaturen gegeneinander antreten oder noch
einfacher, ein Torwandschießen bestreiten.
Durch den Einsatz eines genetischen Algorithmus, in dem die einzelnen Lebewesen und ihr Verhalten bewertet werden, kommt es ohnehin zu einer Wettkampfsituation.
2.6 Verteiltes Rechnen
Die weiteren anstehenden Schritte hängen nicht nur mit der eigentlichen Zielsetzung der Arbeit, sondern auch mit den ersten Ergebnissen zusammen. Da sich mit
dem Einsatz von 3D-Technologie, der Berechnung der physikalischen Umgebung,
einem künstlichen neuronalen Netz und dem genetischen Algorithmus einiges an
Rechenlast aufsummiert, könnte es notwendig sein, diese einzelnen Aufgaben auf
mehrere Rechner zu verteilen, um die Performance zu verbessern.
Hierzu könnten erneut einige Technologien zum Einsatz kommen. Durch die
Verwendung von Java liegt der Einsatz von RMI nahe. Eine komfortablere Lösung
mit Hilfe von Jini und Java Spaces wäre ebenfalls denkbar. Hier könnten die benötigten Aufgaben als Dienste von mehreren Rechnern angeboten werden. Ein Dienst
wäre z.B. das Berechnen der physikalischen Simulation oder die Berechnungen des
neuronalen Netzes. Um aber weiterhin die Rechenleistung gering zu halten, ist auch
das Versenden einfacher Textnachrichten denkbar. Diese Möglichkeiten sollten bei
Bedarf untersucht werden.
2.7 Offene Evolution
Ein Fernziel dieser Arbeit soll die Ausweitung des erstellten Systems auf eine offene
Evolution sein. Das bedeutet, dass die Fitnessfunktion, die bisher die Evolution im
neuralen als auch im anatomischen Bereich beeinflusst hat, wegfallen soll, und das
Überleben selbst die Fitness der einzelnen Kreaturen bestimmt. Hinsichtlich dieses
großen Zieles müssen die Kreaturen um einige Eigenschaften erweitert werden,
2.7 Offene Evolution
7
die ihnen automatisch einen Antrieb geben sollen. Genaues lässt sich hier noch
nicht bestimmen, aber es könnte eine innere Bewertung durch Energieauf- und
-abnahme erfolgen oder die Kreaturen erhalten verschiedene Triebe wie Hunger
oder Ähnliches, von denen sie dann gesteuert werden könnten.
Ein ähnliches Verhalten findet sich bereits in dem KL-Spiel Creatures. Dort
verhalten sich die Norns“ entsprechend ihren Bedürfnissen wie z.B. Hunger, Angst
”
oder Langeweile.
Zur Lösung dieser Aufgabe ist eine schrittweise Herangehensweise sinnvoll. In
jedem Schritt können weitere Erkenntnisse durch ausgiebige Analysen gewonnen
werden. Auf diesem Weg käme man dem Ziel der offenen Evolution schrittweise
näher und hätte, sollte die Zeit am Ende nicht reichen, etwas hinterlassen, was als
Grundlage für weitere Arbeiten an diesem Projekt dient.
3
Künstliches Leben
Die Idee, künstliches Leben zu erschaffen, verfolgt die Menschheit schon seit Jahrhunderten. Hierzu gibt es Beispiele in der Religion, wie den Golem, der einer jüdischen Legende zu Folge, aus Lehm erschaffen wurde (16. Jhd) oder in der Literatur
wie z.B. Mary Shelleys Frankenstein (1818). In der modernen Science Fiction finden sich unzählige Beispiele für künstliches Leben: David, der Roboterjunge in
Steven Spielbergs AI oder der Computer H.A.L. in Stanley Kubricks Meisterwerk
2001 - a Space Odyssee (vgl. [Mai03] S. 188ff), um nur einige zu nennen.
Schon in den Anfängen der Informatik gab es erste Ideen und Hoffnungen,
künstliches Leben zu erzeugen. Wobei es sowohl damals als auch heute Skeptiker
gibt, die dies bezweifeln. Lady Lovelace, Partnerin von Charles Babbage, der die erste programmgesteuerte Rechenmaschine entworfen und gebaut hat, glaubte nicht,
dass Maschinen in der Lage seien, kreativ zu handeln. Sie war der festen Überzeugung, dass Computer nur das tun können, wozu sie programmiert wurden. Heute
wissen wir, dass Computer z.B. mit Hilfe der Simulation von neuronalen Netzen
im Stande sind, intuitiv“ zu handeln. Diese Handlungsweise ist zwar auch pro”
grammiert, aber die ausgeführten Handlungen selbst werden nicht mehr explizit
vorgeschrieben (vgl. [Mai03] S. 8f).
3.1 Natürliches Leben
Bevor der Begriff künstliches Leben“ definiert werden kann, sollte klar sein, wie
”
sich natürliches Leben auszeichnet und welche Voraussetzungen hierzu notwendig
sind. Im Laufe der Geschichte wurde die Definition des Lebens, je nach Stand
der Wissenschaft, immer wieder neu formuliert und bis heute gibt es noch keine
endgültige Entscheidung darüber, was das Leben tatsächlich auszeichnet. So ist
z.B. noch ungeklärt, wo Viren einzuordnen sind.
Die Reihenfolge der folgenden Definitionen des Lebens untermauern die ständigen neuen Erkenntnisse der Wissenschaft in Bezug auf das Leben:
• Physiologisch werden Lebewesen durch Eigenschaften wie Atmung, Bewegung
usw. beschrieben. Diese sehr eingeschränkte Ansicht wird schon allein durch
die Einbeziehung von Pflanzen revidiert.
3.2 Was ist künstliches Leben
9
• Diese werden allerdings in einer späteren Definition einbezogen, nämlich der
Wechselwirkung eines Organismus mit seiner Umwelt in Form eines Stoffwechsels als Beweis des Lebens.
• Der biochemische Ansatz berücksichtigt die Fähigkeit, Erbinformationen in Nukleinsäuren (DNA, RNA) zu speichern.
• Die genetische Definition von Leben beharrt nicht auf Nukleinsäuren als Träger
der Erbinformation. Sie legt ihren Schwerpunkt auf die Mutation, Replikation
und Selektion des Erbmaterials.
• Damit ist die Fortpflanzung ein weiterer wesentlicher Aspekt des Lebens.
• Die Wärmelehre (Thermodynamik) erlaubt eine weitere Definition des Lebens,
die besagt, dass alle Lebewesen dem 2. Hauptsatz der Thermodynamik unterliegen. Dieser behauptet, dass die Entropie, also die Unordnung, im Laufe der
Zeit zunimmt und sich nicht umkehren lässt.
(vgl. [Ada98] S. 5, [HB89] S. 11ff, [Kin96] S. 15ff, [Thr94] S. 20ff)
Neben der eigentlichen Definition des Lebens stellt der Ursprung des Lebens
eines der grössten Rätsel dar und bildet den wohl grössten Streitpunkt zwischen
Religion und Wissenschaft. Es wurde zwar nachgewiesen, dass sich unter den Bedingungen der Uratmosphäre durch Energieeinwirkung komplexe Moleküle wie die
Aminosäuren entwickeln können. Der Übergang von Aminosäuren zu Proteinen,
den Bausteinen des Lebens, oder gar einer daraus bestehenden Zelle mit der Eigenschaft sich selbst zu vermehren, ist bis heute ungeklärt.
Fred Hoy hat die Wahrscheinlichkeit der Bildung einer lebenden Zelle aus vorhandenen Aminosäuren folgendermaßen veranschaulicht:
Eine Schutthalde enthält alle Einzelteile einer Boeing 747, aber völlig
”
zerstückelt und ungeordnet. Ein Wirbelsturm fegt über die Halde dahin. Wie
groß ist nun die Wahrscheinlichkeit, daß man anschließend eine vollständig
montierte, flugbereite Boeing 747 dort vorfindet? So gering, daß man sie
nicht zu berücksichtigen braucht, selbst wenn ein Tornado über genügend
Schutthalden hinwegwirbelte, um damit das ganze Universum auszufüllen“
(vgl. [Kin96] S. 29)
3.2 Was ist künstliches Leben
Nachdem feststeht, dass sich natürliches Leben nur schwer definieren lässt, stellt
sich die Frage nach den Voraussetzungen, die künstliche Lebewesen erfüllen müssen. Dabei lässt sich natürlich darüber streiten, ob ein Programm in einem Computer wirklich als lebendig bezeichnet werden sollte. Einige Eigenschaften, die künstliches Leben umfassen könnte, wurden auf der zweiten internationalen Konferenz
zu diesem Thema herausgestellt:
•
•
•
•
Selbstorganisation
Evolution
Evolutionäre Dynamik
Morphogenese
3.3 Geschichte des KL
10
• Lernen und Kommunikation
• u.v.a.
Etwas vergleichbares wie der Turing-Test, der künstliche Intelligenz nachweisen
können soll, wurde für künstliches Leben zwar angedacht, aber nicht realisiert (vgl.
[Kin96] S. 31f, [Thr94] S. 10ff).
3.3 Geschichte des KL
Die ersten Versuche, künstliches Leben im Computer zu erschaffen“, werden den
”
Pionieren der Informatik Alan Turing und John von Neumann zugeschrieben.
Alan Turing hat mit seiner Turing-Maschine einen universellen Automaten entworfen, der neben seines simplen Aufbaus auch mit allen anderen Berechnungsmodellen gleichwertig ist bzw. sich alle anderen Berechnungsmodelle auf die TuringMaschine reduzieren lassen (These von Church).
Die Turing-Maschine besteht aus einem beliebig langen Band, auf das mit einem
Kopf gelesen und geschrieben werden kann. Welche Aktion der Kopf bei welcher
Bandeingabe ausführt, wird in einem endlichen Automaten, einer Zustandstabelle,
festgelegt.
Neben diesem Modell hat Turing noch zusätzlich den Turing-Test entwickelt, um
künstliche Intelligenz zu testen. Dieser Test beinhaltet Fragen, die ein Programm so
beantworten können muss, dass dessen Antworten nicht von möglichen Antworten
eines Menschen unterschieden werden können (vgl. [Kin96] S. 73ff, [Ada98] S. 22ff,
[Mai03] S. 9, 34ff, 87f, [Thr94] S. 12).
John von Neumann, dessen Rechnerarchitektur bis heute in den meisten Computern eingesetzt wird, hat gezeigt, dass es möglich ist, einen Automaten zu konstruieren, der alle Informationen enthält, sich selbst zu replizieren (klonen) (vgl.
[Kin96] S. 76ff, [Ada98] S. 23ff, [Thr94] S. 40ff).
Während der Entstehung dieser Arbeit ist es Forschern vom MIT gelungen,
Roboter zu entwickeln, die sich ganz nach der Vorstellung von Neumanns selbst
replizieren können. Sie bedienten sich der Eigenschaft der DNA, nahezu unbegrenzte Kopien von sich zu erzeugen. Realisiert wurden diese Roboter mit verschieden
farbigen Bauklötzen, die sich auf einem speziellen Luftkissentisch fortbewegen. Die
Bauklötze sind in der Lage andere Bauklötze, die sich auf dem Tisch befinden, zu
erkennen, deren Farbe festzustellen und sich mit ihnen zu verbinden, sofern dies
im Bauplan vorgesehen ist (vgl. [Eid05]).
Von Neumann war es auch, der die ersten Versuche mit zellulären Automaten
durchgeführt hat. Bekannt wurden diese allerdings erst durch das Game of Life“
”
von John Conway, das später vorgestellt wird.
Der Begriff künstliches Leben“ wurde 1987 auf der ersten Konferenz für künst”
liches Leben von Christopher G. Langton geprägt. Auf dieser Konferenz trafen sich
rund 160 Wissenschaftler aus den Bereichen Informatik, Biologie, Anthropologie,
Verhaltensforschung, Physik und anderen Gebieten, um die Simulation von Leben
im Computer und die damit verbunden Möglichkeiten zu diskutieren (vgl. [Kin96]
S. 123, [Thr94] S. xi).
3.4 Formen künstlichen Lebens
11
3.4 Formen künstlichen Lebens
Mittlerweile gibt es so viele Varianten künstlichen Lebens, dass eine grobe Einteilung, wie sie in diesem Kapitel gemacht wird, ihnen nur schwer gerecht werden
kann. Um aber einen kleinen Überblick über all die Möglichkeiten und Ideen zu
geben, die bisher genutzt wurden, um Leben“ im Computer zu erschaffen, wurden
”
einige dieser Konzepte auf Grund ähnlicher Ergebnisse, andere auf Grund ähnlicher
Verfahren zusammengefasst.
3.4.1 Zelluläre Automaten
Lebewesen bestehen aus einer oder mehreren Zellen, die durch eine Art Arbeitsteilung voneinander abhängig sind. Diesem Aspekt hat sich John von Neumann als
erstes angenommen, indem er 80 endliche Automaten mit den zwei Zuständen tot
(0) oder lebend (1) hintereinander geschaltet und diese mit drei einfachen Regeln
versehen hat:
1. Sind beide Nachbarn tot, ändere deinen Zustand nicht.
2. Lebt ein Nachbar und ist der andere tot, gehe in den Zustand lebend“.
”
3. Leben beide Nachbarn, verändere deinen Zustand (also von lebend“ in tot“
”
”
und umgekehrt).
Anstatt nun die Zahlen 0 und 1 zu verwenden, können die Zustände der Zellen auch grafisch dargestellt werden, indem tote Zellen durch ein Leersymbol und
lebende durch ein ausgefülltes Feld gezeichnet werden. Werden nun die einzelnen
Systemzustände in einer Art Zeitreihe untereinander dargestellt, entstehen verschiedenste Muster, die von Stephen Wolfram erstmals in unterschiedliche Klassen
eingeteilt wurden:
•
•
•
•
triviale Muster, z.B. nur tote oder nur lebende Zellen,
periodisch wiederkehrende Muster,
chaotische Muster und
Muster bestehend aus getrennten Teilen.
Einige Beispiele periodisch wiederkehrender Muster werden in Abbildung 3.1 gezeigt.
Abbildung 3.2 zeigt das wohl bekannteste Muster, das Stephen Wolfram entdeckt hat.
John Conway machte dieses Verfahren Ende der 1960er populär. Er entwickelte einen zweidimensionalen, schachbrettartigen Zellularautomaten. Diesen nannte
er Game of Life“, Spiel des Lebens. Im Unterschied zu den bisherigen Ansätzen
”
stellte Conway seine Zellen in den Folgeschritten nicht untereinander dar, sondern veränderte die Zellen direkt im Gitternetz. Dadurch haben sich erneut viele
verschiedene Muster herauskristallisiert:
• statische Muster,
• oszillierende Objekte,
• Gleiter,
3.4 Formen künstlichen Lebens
12
Abbildung 3.1. Beispiele verschiedener Klassen (Quelle: [Wol02] S. 284)
Abbildung 3.2. Rekursives Muster (Quelle: [Wol02] S. 263)
Abbildung 3.3. Beispielabfolge eines Life-Spiels
• uvm.
Diese Art des Zellularautomaten wurde sehr häufig nachgebildet, teilweise auch
mit mehr als nur zwei Zellzuständen. Der Einsatz von Zellularautomaten geht
sogar über das Feld der Informatik hinaus und wurde schon in den Wirtschaftswissenschaften eingesetzt, um wirtschaftliche Entwicklungen u.ä. zu simulieren. Ed
Frankin vom MIT - Dougles Adams lässt grüssen - sieht sogar die Welt selbst als
einen großen zellulären Automaten (vgl. [Kin96] S. 76ff, [Ada98] S. 22ff, [Mai03]
S. 94ff, [Thr94] S. 40ff).
3.4 Formen künstlichen Lebens
13
Den Gedanken von Neumanns, eines sich selbst reproduzierenden Automaten,
konnte dann Chris Langton mit seiner selbst reproduzierenden Schleife realisieren.
Langton gelang es, eine Struktur zu entwerfen, die sich bei einem entsprechenden
Regelsystem komplett selbst reproduziert. Dieser Zellularautomat besteht aus 8
Zuständen und 179 Regeln. Hier ist besonders interessant, dass Langton eine Art
Aussenhülle definiert hat, die durchaus mit der Hülle verglichen werden kann, die
sich um die Erbinformationen im Zellkern schließt (vgl. [Ada98] S. 39ff, [Mai03]
S. 97f, [Thr94] S. 65ff). Abbildung 3.4 zeigt den Aufbau der Schleife in ihrem
Startzustand und die nachfolgenden Schritte. Bei den ersten Schritten werden fast
alle Zustände abgebildet, bis die erste Reproduktion erreicht ist, am Ende des
Bildes sind spätere Zustände dargestellt.
Abbildung 3.4. Langtons Schleife
3.4.2 Biomorphe und L-Systems
Ein erster Ansatz, die Gestalt von Lebewesen“ zu bestimmen, wurde vom Wissen”
schaftler und Schriftsteller Richard Dawkins gemacht. Seine sogenannten Biomorphe sind Strukturen aus sich selbst reproduzierenden und von Genen gesteuerten
Elementen.
Hierbei setzt er auf ein einfaches geometrisches Muster: einen Stamm und zwei
Äste. Im Falle einer Reproduktion wird eine Kopie dieser Struktur an das Ende eines jeden Astes angehängt. Durch genetische Veränderung der Länge des Stammes
oder der Äste sowie dem Winkel des Stammes zur Horizontalen bzw. dem Winkel
zwischen den Ästen ergeben sich viele unterschiedliche Formen und Figuren (vgl.
[Kin96] S. 86ff, [Thr94] S. 59ff).
Abbildung 3.5. Beispiele für Biomorphe
Aristid Lindenmayer entwarf mit Hilfe der Grammatiktheorie von Noam Chomsky die nach ihm benannten L-Systems. Diese werden durch einfache Ersetzungsregeln beschrieben, z.B.:
3.4 Formen künstlichen Lebens
14
1 −→ 2, 32 −→ 4, 13 −→ 1, 14 −→ 2
Die verwendeten Zeichen können nun durch unterschiedliche Symbole ersetzt werden, woraus nach Einsatz der oben benannten Regeln Figuren entstehen, die häufig
an filigrane Strukturen aus der Natur erinnern. Abbildung 3.6 zeigt zwei noch recht
einfache Gebilde, die stark an Pflanzen erinnern. Es gibt aber noch viele weitaus
imposantere Ergebnisse1 , z.B. unter Verwendung von 3D Grafiken (vgl. [Kin96] S.
88ff, [Thr94] S. 124ff).
Abbildung 3.6. Beispiele für L-Systems
Die Beispiele der Biomorphe und L-Systems zeigen, dass ähnliche Ergebnisse auf
vollkommen unterschiedlichen Technologien basieren können. Während Dawkins
auf die Genetik setzt, findet sich bei Lindenmayer der Einsatz der ChomskyGrammatiken.
3.4.3 tierra, avida, amoeba
Das beeindruckenste Ergebnis im Bereich KL erzielte der Ökologe und Biowissenschaftler Thomas Ray von der Universität Delaware mit seiner tierra-Welt, die der
eigentlichen Evolution bisher wohl am nächsten kommt. Die Idee zu diesem Projekt
bekam Ray durch das Spiel Core Wars, in dem Programme um den Speicherplatz
einer virtuellen CPU kämpfen. Auf der Grundlage des Befehlssatzes dieses Spiels
entwickelte Steen Rasmussen Coreworld, mit dem er sich das Auftauchen selbstreproduzierender Programme erhoffte. Er setzte dabei auf die genetische Veränderung der Argumente der einzelnen Befehle. Dieses Projekt inspirierte Ray dazu,
tierra zu entwickeln.
Ray entwarf eine virtuelle CPU mit einem Befehlssatz von 32 Anweisungen.
Diese Sprache nannte er tierra (span. Erde). In tierra steht ein Programm für
ein Individuum. Die ersten selbstreplizierenden Individuen, die in die von ihm
genannte Ursuppe geworfen wurden, entwickelte Ray per Hand. Diese hatten eine
Länge von 80 Befehlen. Ray ging davon aus, dass das kürzeste selbstreplizierende
Programm mindestens 60 Befehle benötigt. Im Verlauf der tierra-Simulation haben
1
L-System von Norbert Klem: http://www.irtc.org/ftp/pub/stills/2001-06-30/warm up.jpg
3.4 Formen künstlichen Lebens
15
Programme bzw. Individuen die Möglichkeit, sich selbst zu replizieren, um damit
Nachkommen zu schaffen. Durch Mutationen können diese Programme zusätzlich
verändert werden. Anders als in einer normalen CPU sterben“ die Programme
”
nach einiger Zeit und werden dann aus dem Speicher gelöscht.
Rays Vermutung, ein Programm benötigt mindestens 60 Befehle, um sich weiterhin selbst zu kopieren, wurde von tierra widerlegt. Die Simulation hat Programme
mit 45 oder sogar 22 Befehlen hervorgebracht, die sich trotzdem über einen längeren Zeitraum behaupten konnten. Wie war dies möglich? Im Laufe einer Simulation
haben sich Parasiten und sogar Hyper-Parasiten gebildet, die den Code von grösseren Programmen kopiert haben und damit selbst Platz sparen konnten.
Wie im richtigen Leben hat Ray auf eine Fitnessfunktion verzichtet. Für ihn ist
das Überleben selbst der wichtigste Indikator für eine hohe Fitness.
Rays Ergebnisse wurden von vielen mit Erstaunen aufgenommen und haben
zum Weiterforschen ermutigt. Nennenswerte Abkömmlinge sind avida und amoeba. Die Entwickler von amoeba haben sich z.B. zum Ziel gesetzt, den Beginn des
Lebens zu simulieren. Sie wollten, dass sich ein selbstreproduzierendes Programm
zufällig und ohne ihr Zutun entwickelt. Um das Erreichen dieses Ziels wahrscheinlicher zu machen, wurde der Befehlssatz von amoeba auf 16 Befehle reduziert, wobei
fünf für ein selbstreproduzierendes Programm ausreichen. Und tatsächlich haben
sich im Laufe der Zeit Programme entwickelt, die in der Lage sind, sich selbst zu
reproduzieren (vgl. [Ada98] S. 42ff, [Thr94] S. 106ff).
3.4.4 Animate
Die verbreitetste Form künstlichen Lebens und wohl auch die Form mit den meisten
verschiedenen Ausprägungen sind die Animate. Der Name hat seinen Ursprung in
der Simulation von Tieren oder allgemein gesprochen komplexen Lebewesen. Er
lässt sich aus den englischen Wörtern Animal (Tier) und Automat bilden. Mit
Hilfe von Animaten lassen sich Eigenschaften von Lebewesen in vielerlei Hinsicht
simulieren und untersuchen. Hierzu zählen:
•
•
•
•
neural-motorische Fähigkeiten
Schwarmverhalten
Biosoziologische Phänomene
...
Einer der ersten bekannteren Animate ist John Hollands Frosch. Hierbei handelt
es sich um eine Rechnersimulation eines Frosches, der zwei grundlegende Eigenschaften besitzt: fressen und vermeiden, selbst gefressen zu werden. Hauptaufgabe
dieses Frosches ist es, Objekte, die in sein Blickfeld geraten, zu klassifizieren. Je
nach Größe, Abstand, Geschwindigkeit und Bewegungsart, sei es fliegend, kriechend usw., muss der Frosch entscheiden, ob er zuschlägt, um seine Nahrung zu
sichern, oder ob er flieht und sich versteckt, um nicht einem größeren Tier zum
Opfer zu fallen. Holland verwendete hierzu den von ihm entwickelten genetischen
Algorithmus, um die Verhaltensregeln des Frosches zu entwickeln (vgl. [Kin96] S.
42, [Thr94] S. 74f).
3.4 Formen künstlichen Lebens
16
Craig Reynolds Boids (Bird-oids) sollen Vögel mit Hilfe von Zellularautomaten
simulieren. Dabei werden den Automaten einige Grundregeln übergeben:
1. Jeder Vogel versucht, im Zentrum des Schwarms zu bleiben.
2. Jeder Vogel hält zu seinen Nachbarn einen Mindestabstand ein.
3. Richtung und Geschwindigkeit passt jeder Vogel an die Richtung und Geschwindigkeit des Nachbarn an.
Zusätzlich benötigen die Boids noch einige Zusatzregeln, die zum Ausweichen von
Hindernissen benötigt werden. Bei obiger Beschreibung wird deutlich, dass Boids
zur Simulation und Untersuchung von Schwarmverhalten eingesetzt werden. In
Abbildung 3.7 wird ein Boid-Schwarm dargestellt, der durch ein paar Hindernisse
fliegt. Die Simulation von Reynolds war sogar so realistisch, dass sein System im
Zeichentrickfilm Batman Returns“ verwendet wurde (vgl. [Kin96] S. 88f, [Thr94]
”
S. 121ff).
Abbildung 3.7. Boid-Schwarm beim Umfliegen von Hindernissen
Ein weiteres großes Feld im Bereich der Animate stellt die Simulation von Ameisenkolonien dar. Hier war es Chris Langton, der mit seinen Vants (Virtual Ants)
untersucht hat, wie das Verhalten eines Tieres in einer Kolonie das Verhalten der
anderen Tiere beeinflussen kann. In dieser Simulation bewegen sich die virtuellen Ameisen auf einem schachbrettartigen Feld. Sowohl Felder als auch Ameisen
nehmen verschiedene Zustände, beschrieben durch Farben, an. Die Bewegungen
einer Vant sind abhängig vom eigenen Zustand und von dem des Feldes, auf dem
sie steht. Entsprechend werden auch die Folgezustände geändert. Die jeweiligen
Zustände, Zustandsänderungen und Bewegungen werden in der folgenden Tabelle
(Tabelle 3.1) beschrieben (vgl. [Kin96] S. 97ff, [Thr94] S. 118ff).
Zustand Vant Zustand Feld Aktion nachher Zustand Feld nachher
rot
grün
Linksdrehung
schwarz
rot
schwarz
Rechtsdrehung
grün
blau
grün
Rechtsdrehung
schwarz
blau
schwarz
Linksdrehung
grün
Tabelle 3.1. Verhaltensmuster von Langtons Vants (vgl. [Kin96] S. 98)
Neben diesen eher abstrakten Simulationen gibt es auch zahlreiche Beispiele,
die sich vor allem auf die Evolution der Anatomie konzentrieren. Zu den herausragendsten Arbeiten in dieser Richtung gehören die Kreaturen von Karl Sims, die
3.5 Verwandte Arbeiten
17
zudem einen großen inspirativen Einfluss auf diese Arbeit haben. Hierzu aber mehr
im Kapitel Verwandte Projekte“.
”
Durch das ständige Anwachsen der Leistungen von Computern sind vor allem
auf dem Spielesektor die Ansprüche enorm gestiegen. Neben immer realistischeren
Grafiken verlangt die Spielergemeinde immer intelligentere Computergegner, mit
denen sie sich messen kann. Dadurch werden viele KL-Technologien in der Spieleentwicklung eingesetzt. Aber auch Animate finden in diesem Umfeld eine Nische.
Beispiele hierbei sind der virtuelle Fishtank von Nearlife, der seinen Platz im Museum of Science in Boston gefunden hat oder das Spiel Creatures, das mittlerweile
in den Händen von Gameware Development liegt. Creatures kann mit einem überdimensionalen Tamagotschi verglichen werden. Der Spieler hat die Aufgabe, kleine
Kreaturen, Norns genannt, zu züchten und ihnen beizubringen, in ihrer Umwelt zu
überleben. Norns sind stark triebgesteuert und reagieren entsprechend ihrer Stimmungslage, ihrem Hunger oder Durst oder ihrer Langeweile immer anders. Durch
Belobigung oder Bestrafung kann der Spieler Norns erziehen, indem er ihnen ein
direktes Feedback auf ihre Handlungen gibt. Neben dem Lernen besitzen Norns ein
ausgeklügeltes Biosystem, das z.B. durch Krankheiten oder Gifteinnahme beeinflusst werden kann. Zu guter Letzt sind diese kleinen, aufgeweckten Wesen in der
Lage, sich untereinander fortzupflanzen, um ihre Gene und damit ihre Eigenschaften weiterzugeben. Bei den Nachkommen wird dies am auffälligsten in Fellfarbe
und -muster deutlich. Ähnlich wie Thomas Rays tierra könnte Creatures immer
weiter gespielt werden. Hauptziel des Spielers sollte eine sich selbst erhaltende Population von Norns sein, die in der Lage ist, auf die Gefahren ihrer Umwelt Acht zu
geben, die Möglichkeiten, die sie in ihrer Umwelt bekommt, zu nutzen und Wissen
und ihre Erfahrung an ihre Nachkommen weitergeben können.
3.4.5 Von Viren und Würmern
Im Vergleich zu den Norns oder Lindenmayers L-Systems sind Computerviren
alles andere als amüsant. Trotz allem müssen sie in die Reihe der künstlichen
Lebewesen aufgenommen werden. In der Biologie werden sie oft nur als beinahe
lebendig eingestuft, in der Welt der künstlichen Lebewesen sind sie auf Grund ihrer
Eigenschaft, sich selbst zu reproduzieren, einer der ältesten Vertreter. Mittlerweile
gibt es sogar viele wissenschaftliche Arbeiten über diese lästigen Parasiten.
Aber auch wegen der grossartigen Ergebnisse, die Thomas Ray machte, seine
Parasiten zählen schließlich auch zu den Viren, sollte man diese Spezies nicht ausser
Acht lassen (vgl. [Thr94] S. 24f).
3.5 Verwandte Arbeiten
In diesem Abschnitt werden Arbeiten vorgestellt, die zu dieser Arbeit inspiriert
haben oder die ähnliche Ziele verfolgen.
3.5 Verwandte Arbeiten
18
3.5.1 Karl Sims virtuelle Kreaturen
Der erste, der sich Gedanken über die Entwicklung der Morphologie von Lebewesen
im dreidimensionalen Raum gemacht hat, war Karl Sims [Sim94b]. Seine Ergebnisse auf diesem Gebiet, die er 1994 auf der SIGGRAPH Konferenz vorgestellt hat,
sind bis heute noch unerreicht.
Seine Kreaturen haben mit Hilfe eines genetischen Algorithmus ihren Körperbau
entwickelt und zusätzlich gelernt, sich entsprechend fortzubewegen. Sims hat den
Kreaturen mehrere Aufgaben gegeben, die sie erreichen sollten. Darunter fallen:
•
•
•
•
•
Laufen,
Springen,
Schwimmen,
Verfolgen eines beweglichen Punktes und
Bestehen in einem Wettkampf gegen andere Kreaturen.
Die Morphologie seiner Kreaturen wurden durch gerichtete Graphen beschrieben. Ein Knoten eines solchen Graphen steht für ein Körperteil, eine Kante für ein
Gelenk zwischen zwei Körperteilen. Abbildung 3.8 zeigt verschiedene Beispielgraphen und der daraus resultierenden Anatomie der Kreaturen.
Abbildung 3.8. Beispielgraphen und die daraus entstehende Morphologie. (Quelle: [Sim94b] S. 2)
3.5 Verwandte Arbeiten
19
Die Bewegung erfolgt über Effektoren, die vom Gehirn“ einer Kreatur ange”
steuert werden. Effektoren sind vergleichbar mit Muskeln, die Gelenke bewegen.
Als Eingabe bekommt das Gehirn einer Kreatur diverse Sensordaten, die ihm Auskunft über Gelenkwinkel, Bodenberührung oder Lichtveränderungen geben. Die
Berechnung der Effektordaten geschieht über sogenannte Neuronen, die verschiedene mathematische Operationen auf den Sensordaten ausführen. Obwohl Sims
von Neuronen spricht, ist diese Methode eher mit genetischer Programmierung als
mit künstlichen neuronalen Netzen vergleichbar.
Eines der interessantesten Experimente, die Sims mit seinen Kreaturen gemacht
hat, war ein Wettkampf um einen Block. Dabei hat die Kreatur gewonnen, die die
längste Zeit den Block berührt hat bzw. die einen größeren Teil des Blocks berührt
hat. Die Ziele des Wettkampf werden durch Abbildung 3.9 verdeutlicht.
Abbildung 3.9. Beispiele sich bekämpfender Kreaturen (Quelle: [Sim94a] S. 37)
3.5.2 Gene Ruebsamens embodied agents
Gene Ruebsamen [Rue04] wurde ebenfalls von Karl Sims Ergebnissen beeindruckt
und verfolgte einen ähnlichen Ansatz. Doch anstatt, wie Sims, die physikalische Simulation selbst zu implementieren, verwendet Ruebsamen die C-Bibliothek ODE,
die auch in dieser Arbeit eingesetzt wird.
Ein weiterer wesentlicher Unterschied zu Sims ist, dass sich Ruebsamen nur
auf das Verhalten seiner von ihm benannten embodied agents konzentrierte, den
Körperbau definierte er jeweils per Hand. Statt auf eine einfache Neuronenstruktur
mit unterschiedlichen mathematischen Formeln zu setzen, probierte er sein Glück
mit der noch relativ neuen Methode der neuronalen Evolution. Darunter versteht
man die Verbesserung neuronaler Netze mit Hilfe eines genetischen Algorithmus,
wobei die Gewichte als Gene verstanden werden, die untereinander ausgetauscht
(Crossover) oder deren Wert verändert wird (Mutation). Auch Ruebsamen setzte
dabei auf das Konzept von Sensoren und Effektoren, um Eingabe und Ausgabe zu
steuern.
Im Gegensatz zu Sims beließ es Ruebsamen bei einer einzigen Aufgabe, die seine
embodied agents erfüllen mussten. Sie sollten sich lediglich möglichst schnell und
weit auf der x-Achse fortbewegen.
3.5 Verwandte Arbeiten
20
3.5.3 Sigel
Ein ganz anderes Ziel verfolgt das Sigel-Projekt der Universität Dortmund. Sigel
steht für Simulator für GP-evoluierte Laufrobotersteuerungen. Dabei handelt es
sich um einen Robotersimulator, der nach Angabe des Aufbaus eines Laufroboters
einen möglichst effizienten Bewegungsablauf entwickeln soll.
Ähnlich wie Sims und Ruebsamen wird hier auf das Konzept der Sensoren und
Effektoren zurück gegriffen. Der grösste Unterschied besteht erneut in der Verarbeitung dieser Daten. Sigel setzt hierfür eine Art Assembler ein, dessen Registerinhalte dann mit Hilfe genetischer Programmierung angepasst und entwickelt werden
sollen (vgl. [MCV01]). In Abbildung 3.10 wird die Simulation eines dreibeinigen
Roboters dargestellt.
Abbildung 3.10. Bewegungsablauf eines Dreibeiners (Quelle: [MCV01] S. 178)
3.5.4 Marbachs modulare Roboter
Daniel Marbach [Mar05] hat in seiner Masterarbeit auf der école polytechnique
fédérale de Lausanne eine Verbindung zwischen der Arbeit von Sims und dem
Sigel-Projekt geschaffen. Er fixiert sich nicht nur auf die Bewegung von Robotern,
sondern ist auch überzeugt von der Wirkungskraft der Evolution bezüglich des
Aufbaus von Robotern.
Ähnlich wie das Sigel-Projekt arbeitet Marbach auf einer Simulation der Roboter, die er mit der ODE-Bibliothek realisiert hat, um sich die Implementierung
der physikalischen Simulation zu ersparen. Die simulierten Roboter setzen sich aus
unterschiedlichen Bauteilen zusammen, die miteinander verknüpft werden können.
Dieser Vorgang ist mit Legosteinen vergleichbar, die den Bau unterschiedlichster
Formen begünstigen.
Um die Kombination der unterschiedlichen Bauteile und deren genetische Entwicklung zu beschreiben, verwendet Marbach Lindenmayers L-Systems. Die Bewegungen werden schließlich über genetische Programmierung erlernt. Abbildung 3.11
zeigt die Simulation eines hieraus entstanden Roboters. In dieser Abbildung sind
vor allem die einzelnen Bauteile eines solchen Roboters deutlich zu erkennen.
3.5 Verwandte Arbeiten
Abbildung 3.11. Beispiel eines generierten Roboters (Quelle: [Mar05] S. 71)
21
4
Der Genetische Algorithmus
In vielen Fällen kann die Wissenschaft auf Konzepte zurückgreifen, die ihr die
Natur vorgelebt hat. So werden Methoden oder Phänomene der Natur zumindest
abstrakt in der Technik umgesetzt. Flugzeuge imitieren z.B. die aerodynamische
Form der Vogelflügel, ohne jedoch die eigentliche Flugtechnik nachzubilden. Aber
auch in der Informatik werden Konzepte der Natur aufgegriffen, um Probleme
besser lösen zu können. Die Genetik ist da nur eines von vielen Beispielen (vgl.
[IG04] S. 33).
4.1 Genetik in der Natur
4.1.1 Geschichte der Genetik
Evolutionäre oder Genetische Algorithmen (kurz EA bzw. GA) greifen auf die
von Charles Darwin (1809 - 1882) erarbeitete Evolutionstheorie zurück. Hauptbestandteil dieser Theorie ist die in der Natur auftretende Fähigkeit, sich an eine
verändernde Umwelt anzupassen. Dabei spielt das von Darwin beschriebene Naturgesetz Überleben des Stärkeren“ (survival of the fittest) eine wesentliche Rolle.
”
Zur selben Zeit wie Darwin lebte Gregor Mendel (1822 - 1884), ein Augustinerabt, der Versuche mit Erbsenpflanzen anstellte, indem er sie, abhängig von ihrer
Blütenfarbe kreuzte. Aus den daraus entstandenen Nachkommen leitete er die nach
ihm benannten Mendelschen Regeln ab. Mit der Arbeit Mendels ist die klassische
Genetik entstanden.
In der heutigen Zeit wird vor allem in der Molekulargenetik geforscht, die sich
mit dem Aufbau der Gene beschäftigen und die im nächsten Abschnitt kurz vorgestellt werden soll (vgl. [IG04] S. 217ff, [HB89] S. 332ff).
4.1.2 Aufbau und Arbeitsweise von Genen
Das Geheimnis der Evolution findet sich im Mikrokosmos der Zellen. Es werden
zwei Arten von Zellen unterschieden:
• prokaryotische Zellen, die keinen Zellkern (Nukleus) besitzen und
• eukaryotische Zellen, die eben einen solchen Zellkern beinhalten.
4.1 Genetik in der Natur
23
Eukaryotische Zellen bilden die Mehrheit im Zellvorkommen eines Lebewesens und
beherbergen im Innern des Zellkerns die Träger der Erbinformationen, die Chromosomen.
Jede Spezies besitzt eine feste Anzahl Chromosomen. Der Mensch hat z.B. 46,
wobei die Anzahl der Chromosomen nichts über die Komplexität eines Lebewesens
aussagt. Schimpansen und Kartoffeln besitzen jeweils 48 Chromosomen, ein Karpfen sogar 104, wohingegen Mais mit nur 20 Chromosomen auskommt (vgl. [IG04]
S. 218).
Aber die eigentlichen Erbinformationen liegen in den Genen, die in den Chromosomen enthalten sind. Gene beschreiben eine bestimmte Eigenschaft des Lebewesens, Allel genannt. Ein typisches Beispiel ist die Augenfarbe eines Menschen
(z.B. grün, blau oder braun). Dabei wird zwischen dominanten und rezessiven
Ausprägungen unterschieden. Dieses Phänomen ist allerdings nur durch die doppelte Anzahl jedes Chromosoms (diploide Chromosomen) gegeben. Jeder Elternteil
steuert dabei die Hälfte der Chromosomen bei. Erbt z.B. ein Kind vom Vater ein
Chromosom mit der Ausprägung blaue Augen“ und von der Mutter ein Chromo”
som, das das Allel für braune Augen“ trägt, so setzen sich die braunen Augen
”
als dominantes Allel durch, was dem Kind braune Augen beschert. Durch das diploide Auftreten eines Chromosoms gehen die Informationen des rezessiven Allels
zunächst nicht verloren, sondern können in späteren Generationen wieder auftreten
(vgl. [IG04] S. 218).
Abbildung 4.1 zeigt einen Erbgang mit zwei Merkmalen von Kühen. Das erste
Merkmal beschreibt die Fellfarbe der jeweiligen Kuh, wobei das schwarze Fell dominanter ist als das braune Fell. Die zweite Merkmalsausprägung ist das Fellmuster,
wobei der Besitz eines Musters als rezessives Allel erkennbar ist.
Doch auf welche Weise speichern die Gene diese Informationen und wie können
sie wieder ausgelesen werden? Um diese Fragen zu beantworten, muss die chemische
Zusammensetzung der Gene erläutert werden.
Die Motoren für Stoffwechselvorgänge im Körper sind die Enzyme. Diese wiederum sind Proteine, Makromoleküle aus ein oder mehreren Polypeptidketten, die
sich aus Aminosäuren zusammensetzen. Ein Lebewesen besitzt hierzu in der Regel
20 Aminosäuren. Damit liegt die Aufgabe der Gene in der Festlegung der Reihenfolge der Aminosäuren.
Die eigentlichen Träger der Gene sind die Nukleinsäuren. Bekanntester Vertreter ist die Desoxyribonukleinsäure (DNS, engl. DNA). In den Nukleinsäuren
sind 4 Basen vorhanden, mit denen Proteine codiert werden können. In der DNS
handelt es sich um die Basen Guanin, Adenin, Thymin und Cytosin. Die bekannte Doppelhelix-Struktur ergibt sich aus einem stickstoffhaltigen Ring aus einem
Zucker und Phosphorsäure und der paarweisen Verbindung der Basen. Nach dem
verwendeten Zuckerbaustein wird die Nukleinsäure benannt. Die Ribonukleinsäure
(RNA) benutzt die Ribose, die DNS die Desoxyribose. Jeweils zwei der vier Basen
sind in der Lage, sich mittels Wasserstoffbrücken zu verbinden, Adenin mit Thymin
und Cytosin mit Guanin. Dadurch entsteht bei der DNS die typische DoppelhelixStruktur (siehe Abbildung 4.2). Die gegenüberstehenden Stranghälften beschreiben
so das Negativ ihres Gegenüber (vgl. [HB89] S. 355ff).
4.1 Genetik in der Natur
24
Abbildung 4.1. Erbgang mit zwei Merkmalen (dihybrider Erbgang) (Quelle:
[HB89] S. 355)
Chromosomen entstehen dadurch, dass sich ein DNS-Strang um Proteinpartikel
windet. Dadurch entsteht eine stabilere Struktur, die in Abbildung 4.3 dargestellt
wird.
Weil die DNS 20 Aminosäuren mit nur 4 Basen codieren muss, wird jeweils ein
Triplett, eine Kombination dreier aufeinanderfolgender Basen, als Codierung verwendet. Mit den damit entstehenden 43 = 64 Codewörtern können folglich alle 20
Aminosäuren codiert werden. Die überschüssigen Codewörter werden entweder zur
Mehrfachcodierung von Aminosäuren verwendet oder sie stehen für verschiedene
4.1 Genetik in der Natur
25
Abbildung 4.2. Aufbau der DNS (i.A.a. [HB89] S. 357)
Abbildung 4.3. Chromosomenfeinstruktur
Steuerzeichen. Unter den Begriff Steuerzeichen fallen Start- oder Stop-Codons, die
den Anfang oder das Ende eines Codewortes anzeigen. Interessant ist die Tatsache,
dass der genetische Code universell gilt, d.h. jedes Lebewesen verwendet die gleiche
Codierung der einzelnen Proteine (vgl. [HB89] S. 355ff, [IG04] S. 217ff).
Gerade im genetischen Code lassen sich viele Parallelen zur Informatik ziehen.
Ist doch ein Computerprogramm nichts anderes als eine Kette von Wörtern und
Steuerzeichen. Die Kommunikation in Computernetzwerken bedient sich ebenfalls
4.1 Genetik in der Natur
26
mehrerer Steuerbefehle und Verfahren Codierfehler vorzubeugen, was sich durch
nahezu alle Schichten des OSI-Referenzmodells zieht. Aber auch die Codierung ist
interessant, findet man doch in der Informatik häufig ein Alphabet, das sogar aus
nur zwei Zeichen codiert wird: 0“ und 1“ (vgl. [GC02] S. 101ff).
”
”
4.1.3 Evolution
Die Evolution beschreibt die stammesgeschichtliche Entwicklung von Lebewesen,
deren Adaption an ihre Umwelt und die Entstehung neuer Arten. Doch wie kommt
es zu diesen Anpassungen oder Änderungen, dass sie sogar neue Arten hervorbringen? Ein wichtiger Faktor der Evolution ist die Selektion. Sie steht in enger
Verbindung mit der Theorie von Charles Darwin, dass nur die Stärkeren überleben.
Die gängigste Form der natürlichen Auslese ist die Fortpflanzung, da sich dabei
zwei verschiedene Chromosomensätze miteinander kombinieren und zu einem neuen zusammenfügen. Werden dadurch Eigenschaften vererbt, die einem Lebewesen
einen Vorteil gegenüber seinen Artgenossen verschaffen, ist dieses eher in der Lage
sich gegen Konkurenten durchzusetzen und sich weiter fortzupflanzen.
Eine eher durch den Zufall geprägte Form ist die Mutation, oft hervorgerufen durch radioaktive Strahlung, UV-Licht oder Chemikalien. Zum einen kann es
zu Veränderungen der Chromosomen kommen. Dabei werden mehrere Arten von
Änderungen oder Eingriffen unterschieden: Die Deletion bezeichnet den Verlust
eines Chromosomenteils, was in den meisten Fällen den Tod für das betroffene
Lebewesen bedeutet. Bei Verlust des Endstücks spricht man von Defizienz. Treten
nach der Zellteilung Gene doppelt auf, so wird dies als Duplikation bezeichnet. Im
Falle der Inversion wird die Reihenfolge der Chromosomen zumindest teilweise vertauscht. Auch die Veränderung der Chromosomenzahl zählt zu den Mutationen.
Bekannt ist dieses Phänomen beim Menschen durch die Krankheit Trisomie 21,
auch Down-Syndrom oder Mongolismus genannt. Betroffene Menschen besitzen
ein zusätzliches 21. Chromosom (vgl. [IG04] S. 219ff, [HB89] S. 349, 398f).
Genmutationen, bei denen es zu Veränderungen der Codewörter auf dem DNSStrang kommen kann, sind ebenfalls möglich. Diese Änderungen müssen nicht
zwingend auffallen. Tritt die Mutation bei einem rezessiven Allel auf, wirkt sie
sich zunächst nicht auf das betroffene Lebewesen aus, sondern wird vielleicht erst
in späteren Erbgängen in Erscheinung treten oder vielleicht auch nie. Durch die
Mehrfachcodierung von Aminosäuren kann es vorkommen, dass zwar eine genotypische Veränderung auftritt, diese aber keinen Einfluss auf die phänotypischen
Ausprägungen des Lebewesens hat, da der mutierte Codeabschnitt zur gleichen
Transformation führt. Dies ist auch ein Grund, warum der Einfluss der Mutation
auf die Evolution noch bis heute umstritten ist und eher als evolutionshemmend
als -fördernd gesehen wird. Andererseits hat die Natur mit der Mutation einen Weg
gefunden, das Festfahren der Evolution in eine bestimmte Entwicklungsrichtung
zu verhindern (vgl. [IG04] S. 219ff).
Ein weiteres Phänomen wurde von Thomas Morgan (1866 - 1945) bei Versuchen mit der Fruchtfliege Drosophila endeckt. Er fand heraus, dass es während der
Meiose, einem Zustand der Zellteilung, bei der sich die Chromosomen paaren und
4.2 Genetik in der Informatik
27
umeinander schlingen, zu einem Bruch von Nicht-Schwesterchromatiden kommen
kann, wobei sich die abgetrennten Teile gegeneinander austauschen (siehe Abbildung 4.4). Bei der Spiralisierung der Chromosome bilden sich Chromomare, an
denen ein solcher Bruch entstehen soll. Dies sichert die Lebensfähigkeit des Lebewesens, das aus der neuen Kombination entsteht. Dieser Vorgang wird Crossingover bezeichnet. Anders als die Mutation führt das Crossing-over keine zufälligen
Änderungen durch, sondern wird von der Natur gezielt und bewusst eingesetzt, um
die Entwicklung voranzutreiben oder sie in eine andere Richtung zu lenken (vgl.
[IG04] S. 219ff, [HB89] S. 441).
A
u
s
t
a
u
s
c
h
u
s
u
s
t
a
u
s
c
h
A
u
s
t
a
u
s
c
h
crossing-over
Chromomar
A
A
t
a
u
s
c
h
Abbildung 4.4. Crossing-over mit Austausch gleicher Chromatiden-Abschnitte
(i.A.a. [HB89] S. 441)
4.2 Genetik in der Informatik
Wie schon in der Einleitung dieses Kapitels erwähnt, greift die Wissenschaft gern
auf Konzepte der Natur zurück. In der Informatik werden viele Konzepte der Genetik in den sogenannten Evolutionären Algorithmen aufgegriffen. Evolutionäre
Algorithmen umfassen Themen wie Evolutionsstrategien, Genetische Algorithmen
als auch deren Unterart, die Genetische Programmierung. Die Verfahren weisen im
Allgemeinen sehr viele Ähnlichkeiten auf. Eine Unterscheidung ist hauptsächlich
geschichtlich bedingt. Im Hinblick auf Evolutionäre Algorithmen können viele Begriffe aus der Genetik wiederverwendet werden, obwohl sie nicht unmittelbar mit
ihrem natürlich Vorbild übereinstimmen.
Der Genetische Algorithmus wurde in den 1970er Jahren von John Holland entwickelt. Er sieht die Entwicklung einer Population verschiedener Individuen über
mehrere Generationen hinweg vor. Dabei muss allerdings das Individuum mit dem
Begriff Chromosom gleichgestellt werden, da jedes Individuum nur ein Chromosom
besitzt. Ein solches Chromosom besteht aus einem String, der sich aus den Zeichen
0 und 1 zusammensetzt. Damit ist ein Gen ein Zeichen dieses Strings und sein Wert
bezeichnet eine Ausprägung bzw. ein Allel. Dieser Zeichenvektor kann folglich als
Genotyp bezeichnet werden, seine Interpretation letztendlich als Phänotyp (vgl.
[IG04] S. 34). Ein Beispiel eines solchen Chromosoms zeigt Abbildung 4.5.
Der eigentliche Algorithmus arbeitet mit einer Fitnessfunktion, die die Überlebenswahrscheinlichkeit eines jeden Indiviuums bestimmt. Je höher der Wert dieser
Funktion ist, desto besser ist das Individuum an seine Umwelt angepasst.
4.2 Genetik in der Informatik
Variable
28
x1
x2
x3
... 1 1 0 1 0 1 1 0 0 1 0 1 1 0 ...
Gen Allel
Abbildung 4.5. Zeichenstring
Die Umwelt eines Individuums in einem Genetischen Algorithmus muss hier
sehr abstrakt aufgefasst werden, da es sich um sehr unterschiedliche Ausprägungen handeln kann und vom jeweiligen Einsatzgebiet abhängt. Häufig werden genetische Algorithmen eingesetzt, um Probleme zu lösen, die in der Komplexitätstheorie behandelt werden und die auf herkömmliche Weise praktisch nicht lösbar sind.
Die Rede ist hier von den NP-vollständigen Problemen, wie zum Beispiel das des
Handlungsreisenden (Travelling Salesman Problem, TSP). In diesem Fall wäre ein
Individuum eine Route für den Handlungsreisenden. Die Fitness wäre die zurückgelegte Entfernung. Da es sich hierbei um ein Minimierungsproblem handelt, muss
die Fitness natürlich minimiert werden, d.h. das Individuum mit der geringsten
Wegstrecke scheint sich in seiner Umwelt“ am geeignetsten zu verhalten.
”
Die Aufgabe des Algorithmus besteht nun darin, über mehrere Generationen
hinweg immer bessere Individuen zu schaffen. In den meisten Fällen wird mit
einer zufälligen Population begonnen, aus der sich die späteren Generationen bilden. Dabei spielt die Selektion eine grosse Rolle. Sie sorgt für die Auswahl der
stärksten“ Individuen und sichert deren Fortbestand. Nachfolgende Generatio”
nen werden dann durch Rekombination oder Mutation dieser ausgewählten Eltern
erzeugt.
Die Rekombination wird bei den genetischen Algorithmen auch als crossover
bezeichnet. Zwei Individuen werden miteinander gekreuzt, um zwei Nachfolgeindividuen zu bilden. Dabei werden die Chromosomenstrings jeweils an der gleichen
Stelle getrennt und überkreuz ausgetauscht (siehe Abbildung 4.6). Beim cross-over
werden zwei unterschiedliche Konzepte der Natur zusammen geführt: Die Aufteilung der Erbinformationen zweier Individuen, wie sie bei der geschlechtlichen
Fortpflanzung geschieht, und das crossing-over-Phänomen, das ursprünglich nur
bei einem Lebewesen auftritt.
cross-over
Abbildung 4.6. Crossover (Quelle: [IG04] S. 40)
4.3 Fitnessfunktion
29
Mutation ist eine weitere Möglichkeit des genetischen Algorithmus, Nachkommen zu verändern, um eine bessere Lösung anzustreben oder ein lokales Optimum
zu überspringen. Bei diesem genetischen Operator werden einfach ein oder mehrere
Zeichen gekippt, d.h. aus einer 0 wird eine 1 und umgekehrt (siehe Abbildung 4.7).
Mutation
Abbildung 4.7. Mutation (Quelle: [IG04] S. 41)
Damit lässt sich ein Genetischer Algorithmus in folgende Schritte aufteilen:
1.
2.
3.
4.
Schaffen einer Startpopulation
Berechnung der Fitness
Selektion und
Anwendung der genetischen Operatoren (Rekombination, Mutation) zur Bildung der nächsten Generation.
Dieser Vorgang wird dann ab Schritt 2 entweder eine bestimmte Anzahl von Generationen lang oder bis zum Erreichen einer bestimmten Fitnessschwelle wiederholt.
Der Wunsch, den Genetischen Algorithmus stetig zu verbessern oder ihn an
unterschiedliche Problemstellungen anzupassen, hat viele Verfahren und Strategien hervorgebracht, um Fitness, Selektion oder genetische Operatoren effizienter zu
gestalten. Die folgenden Kapitel geben daher einen tieferen Einblick in die unterschiedlichen Ansätze und Ideen.
4.3 Fitnessfunktion
Die Überlebens- bzw. Vermehrungschancen jedes einzelnen Individuums werden
durch seine Fitness bestimmt. Diese wird durch die Fitnessfunktion berechnet.
Dabei gilt, je höher die Fitness, desto stärker das Chromosom. Wie später bei der
Untersuchung verschiedener Selektionsverfahren deutlich wird, ist es sinnvoll, den
Wertebereich der Fitnessfunktion auf R+ einzuschränken.
Werden genetische Algorithmen zur Lösung von Optimierungsproblemen eingesetzt, kann die Fitnessfunktion mit der Zielfunktion gleichgesetzt werden. Aber
in vielen anderen Bereichen ist dies nicht so einfach möglich, was zu verschiedenen Ansätzen geführt hat. Zur Berechnung der eigentlichen Fitness wird in jedem
nachfolgend erklärten Verfahren eine vorläufige Fitness f it∗ verwendet, die dann
weiter verfeinert wird (vgl. [IG04] S. 37f, 68f).
4.3.1 Lineare skalierte Fitness
Eine häufig angewandte Strategie bei der Definition der Fitnessfunktion ist der
Einsatz von Belohnung und Bestrafung der Chromosomen. Im Fall der linear ska-
4.3 Fitnessfunktion
30
lierten Fitness erfolgt die Belohnung durch die Konstante a ∈ R+ und die Bestrafung durch den Penalty-Faktor b ∈ R. Die lineare statische Skalierung errechnet
sich demnach wie folgt:
f it(c) = a ∗ f it∗ (c) + b
wobei der Faktor b kleiner als die eigentliche Fitness sein muss, was allerdings das
Wissen über das gesuchte Optimum vorraussetzt.
Deshalb wird statt der statischen die dynamische Variante der linearen Skalierung verwendet, bei der die kleinste gemessene Fitness einer Population P (t) statt
dem Faktor b zur Bestrafung“ verwendet wird.
”
f it(c, P (t)) = a ∗ f it∗ (c) − min{f it∗ (ci )|ci ∈ P (t)}
Durch diesen Schritt werden die Unterschiede der Fitness deutlicher hervorgehoben, was allerdings die Gefahr beinhaltet, ein Superindividuum zu erhalten, das
sich gegenüber allen anderen Chromosomen durchsetzt und was wiederum zu einer
vorzeitigen Konvergenz führt (vgl. [IG04] S. 69f).
4.3.2 σ-Skalierung
Die σ-Skalierung erweitert die lineare Skalierung um populationsabhängige Faktoren wie mittlere Fitness und Streuung. Hier werden der Faktor a ∈ R und die
Standardabweichung σ(P (t)) der Bewertung der Population verwendet:

∗
∗
∗

f it (c) − (f it − a ∗ σ(P (t)) falls f it (c) ≥
f it(c, P (t)) =
(f it∗ − a ∗ σ(P (t)))


0
sonst
Eine Variante dieses Verfahrens sieht folgende Berechnung vor:
(
f it∗ (c) + (f it∗ − a ∗ σ(P (t)) falls f it∗ ≥ a ∗ σ(P (t)))
f it(c, P (t)) =
0
sonst
Bei letzterer Variante werden die Populationen im Lauf der Zeit immer homogener, was zu einem niedrigeren Selektionsdruck führt, da schlechte Chromosomen
überhaupt nicht mehr am Auswahlprozess teilnehmen (vgl. [IG04] S. 70).
4.3.3 Exponentielle Skalierung
Die exponentielle Skalierung wurde 1985 von Gilles unter dem Namen Power
”
Scaling“ entwickelt und sieht folgende einfache Form vor:
f it(c) = (f it∗ (c))k mit k ∈ R
Unter Berücksichtigung einer Belohnung a ∈ R+ , einer Bestrafung b ∈ R und einer
Konstanten k ∈ R oder einer Abbildung k(t, s) : N × R → R ergeben sich zwei
Varianten:
4.3 Fitnessfunktion
31
• Exponentielle Skalierung:
f it(c) = (a ∗ f it∗ (c) + b)k
• Ungleichmäßig exponentielle Skalierung:
f it(c) = (a ∗ f it∗ (c) + b)k(t,s)
Dabei nimmt die Funktion k(t, s) Bezug auf das Populationsalter bzw. die Generation t und eine Spannweite s. Michalewicz, der diese Variante entwickelt hat,
definiert k wie folgt:
k(t, s0 ) =
s∗
s0
P1
∗ tan
t
π
∗
T +1 2
P2 ( ss∗0 )α
mit s∗ = 0.1, α = 0.1, P1 = 0.05, P2 = 0.1 und T = maximale Anzahl von
Generationen. Die Spannweite s0 wird aus dem Quotienten der Streuung der Bewertung der Anfangspopulation und der mittleren Bewertung aller Elemente der
Anfangspopulation berechnet (vgl. [IG04] S. 70ff).
4.3.4 Geteilte Fitness
Der Hintergrund dieser Strategie liegt in der Unterbindung der Ausbildung von
Superindividuen und damit einer vorzeitigen Konvergenz. Dieses Verfahren zählt
zu den Nischentechnologien, die sich das Vorbild der Natur zu Nutze machen, in
der sich Lebewesen einen Lebensraum teilen, indem sie Nischen ausbilden. Eine
ökologische Nische ist nicht zwingend ein räumlicher Begriff, sondern er beinhaltet
viel mehr als das, worunter unter anderem Ernährung, Art und Ort der Brutplätze
oder Tag- oder Nachtaktivität fallen.
Um eine solche Nische in einem genetischen Algorithmus zu erhalten, müssen
Chromosomen miteinander vergleichbar sein und verglichen werden. Liegen die
Chromosomen als binärer String vor, könnte die Hammingdistanz als Ähnlichkeitsmaß herangezogen werden. Das bedeutet, dass dieses Verfahren eine Abstandsgleichung d(c1 , c2 ) benötigt, die die Ähnlichkeit zweier Individuen bestimmt und eine
Sharing-Funktion Sh(d(c1 , c2 )), die diese Ähnlichkeit in das Intervall [0, 1] abbildet.
Dabei liegt der Wert der Sharing-Funktion umso höher, je größer die Ähnlichkeit
ist. Die Fitness eines Chromosoms wird dann wie folgt berechnet:
f it(c) =
f it∗ (c)
popsize
P
Sh(d(c, ci ))
i=1
Goldberg und Richardson haben folgende Form der Sharing-Funktion ausgearbeitet:
α
(
1 − d(cσ1Sh,c2 )
falls d(c1 , c2 ) < σSh
Sh(d(c1 , c2 )) =
0
sonst
4.3 Fitnessfunktion
32
α und σSh sind Konstanten, wobei in der Regel α = 1 gesetzt wird. σSh kann
durch die Anzahl der erwarteten Optima bestimmt werden. Da diese jedoch in
den meisten Fällen nicht bekannt sind, muss ein passender Wert gefunden werden.
Vorteil dieses Verfahrens ist, dass Chromosomen, die in einer kleineren Nische
auftreten, bevorzugt werden (vgl. [IG04] S. 72f, [HB89] S. 73ff).
4.3.5 Mehrkriterienoptimierung
Viele Probleme, die mit Hilfe genetischer Algorithmen gelöst werden sollen, weisen
mehrere Kriterien auf, die die Individuen erfüllen müssen. So könnte bei der Lösung des Traveling Salesman Problems nicht nur die zurückzulegende Wegstrecke,
sondern auch die Fahrzeit, die sich durch unterschiedliche Strassentypen ergibt, in
die Bewertung einfließen. Für k Kriterien errechnet sich die Fitness dann durch:
f it(c) =
k
X
αi f iti (c)
i=1
wobei αi eine Gewichtung des jeweiligen Kriteriums darstellt. Die Fitness zum jeweiligen Kriterium kann wiederum durch eines der bisherigen Verfahren berechnet
werden (vgl. [IG04] S. 73ff).
4.3.6 Fitnessfunktion mit Zusatzbedingungen
In vielen Fällen teilt sich der Lösungsraum eines Optimierungsproblems in erlaubte und verbotene Zonen auf, in denen sich die Individuen aufhalten. Um den Ort“
”
eines Individuums festzustellen, werden Rand- bzw. Nebenbedingungen erhoben,
die erfüllt sein müssen, damit das Chromosom eine korrekte Lösung liefert. Um
Chromosomen aus einer verbotenen Zone heraus zu manövrieren, wird ein Strafwert (penalty) pen(c) verwendet. Liegt dieser Wert bei 0, hat das Chromosom alle
Bedingungen erfüllt und befindet sich im erlaubten Bereich. Zusätzlich zu dem
Strafwert fließt eine populationsabhängige Gewichtungsfunktion w(t) in die Berechnung ein:
f it(c) = f it∗ (c) + w(t) ∗ pen(c)
Die Gewichtung w(t) könnte sich durch
w(t) = α ∗
t
T
errechnen, wobei α eine Konstante ist, t die aktuelle Generation und T die maximale Anzahl an Generationen. Dabei sollte darauf geachtet werden, dass die Gewichtung nicht zu groß ausfällt, da dadurch die eigentliche Fitness vernachlässigt
wird. Zusätzlich besteht die Gefahr, dass der Algorithmus auf schnell gefundene
korrekte, aber nur suboptimale Lösungen konvergiert (vgl. [IG04] S. 76ff).
4.4 Selektionsverfahren
33
4.4 Selektionsverfahren
Die Auswahl der Chromosomen bzw. der Individuen, aus denen die Nachfolgegeneration gebildet werden soll und auf die die genetischen Operatoren angewendet
werden, wird Selektion genannt. Im Laufe der Zeit sind viele verschiedene Verfahren entwickelt worden, die diese Auswahl treffen. Die Aufgabe eines Selektionsverfahren besteht in der Berechnung einer Selektionswahrscheinlichkeit pt (ci ) für
jedes Chromosom ci mit i ∈ {1, ..., popsize} zu einem Zeitpunkt t. Dabei werden
mehrere Ansätze verfolgt:
1. Bei statischen Selektionsfunktionen wird die Selektionswahrscheinlichkeit im
Vorfeld festgelegt, ist für alle Chromosomen gleich und ändert sich im Laufe
der Berechnungen nicht.
2. Dynamische Selektionsfunktionen berechnen die Selektionswahrscheinlichkeit
für jedes Individuum einer Generation neu.
3. Diskriminierende Selektionsverfahren bevorzugen die stärksten Individuen einer Population und bestimmen deren Selektionswahrscheinlichkeit auf Grund
ihrer Fitness. Dabei kann es sein, dass schwächere Chromosomen eine Selektionswahrscheinlichkeit von 0 erhalten.
4. Nicht diskriminierende Selektionsverfahren ermöglichen auch schwächeren Individuen, sich fortzupflanzen, wodurch eine mögliche vorzeitige Konvergenz verhindert werden kann.
5. Die Eliteselektion sieht die Übernahme der k (k > 0) besten Chromosomen in
die nächste Generation vor.
6. Die reine Selektion überlässt den kompletten Auswahlvorgang dem Zufall.
Um die einzelnen Verfahren untereinander zu vergleichen bzw. deren Unterschiede herauszufiltern, wurden zwei Messwerte entwickelt:
1. Der Bias, der die Abweichung der erwarteten Anzahl der Kopien eines Chromosoms von der tatsächlichen Anzahl der Kopien, die in die Auswahl aufgenommen werden, bestimmt.
2. Der Spread, der die Spannweite der Anzahl der unterschiedlichen gewählten
Chromosomen beschreibt (vgl. [IG04] S.79ff).
Die Auswahl der Chromosomen, die zur Erzeugung der nächsten Generation benötigt werden, erfolgt durch die Roulettrad-Selektion. Dieses Verfahren benötigt
eine vorher berechnete Selektionswahrscheinlichkeit p(c), die die Wahrscheinlichkeit eines Chromosoms c angibt, in diese Auswahl aufgenommen zu werden. Um
diese Selektionswahrscheinlichkeit zu bestimmen, gibt es mehrere Verfahren, von
denen einige im nächsten Abschnitt vorgestellt werden. Die neue Population P (t)
ergibt sich bei diesem Verfahren wie folgt:
• Berechnen einer Zufallszahl r ∈ [0, 1].
• ci ∈ P (t − 1) mit i ∈ {1, ..., popsize} wird in die neue Population P (t) aufgenommen, wenn gilt:
j<i
j≤i
X
X
p(cj ) ≤ r <
p(cj )
j=0
j=0
4.4 Selektionsverfahren
34
Dieses Vorgehen wird popsize-mal wiederholt. Abbildung 4.8 zeigt ein Beispiel
der Roulettrad-Selektion, bei der die Zufallszahl r die Funktion des Roulettrades
übernimmt (vgl. [IG04] S.39).
Abbildung 4.8. Überlebens-/Vermehrungswahrscheinlichkeit (Quelle: [IG04] S.
39)
Im Folgenden werden verschiedene Selektionsverfahren und deren Eigenschaften
vorgestellt.
4.4.1 Stochastic Sampling with Replacement
Dieses Verfahren ist das gängigste, um die Selektionswahrscheinlichkeit für die
Roulettrad-Selektion zu berechnen und findet sich in deshalb auch unter eben
diesem Namen in einiger Literatur wieder. Die Selektionswahrscheinlichkeit des
i-ten Chromosoms berechnet sich bei diesem Verfahren wie folgt:
f it(ci )
p(ci ) = P
f it(c)
c∈P (t)
Falls die Summe der einzelnen Fitnesswerte bei 0 liegt, erhält jedes Chromosom
1
.
die einheitliche Selektionswahrscheinlichkeit p(c) = popsize
Der Bias dieses Verfahrens ist sehr hoch. Es kann sogar passieren, dass das beste
Chromosom nicht in die nächste Generation aufgenommen wird. Dieser Umstand
unterstreicht, dass es sich hier um ein nicht diskriminierendes Verfahren dynamischer Natur handelt. Dynamisch deshalb, weil die Selektionswahrscheinlichkeiten
in jeder Generation neu berechnet werden müssen (vgl. [IG04] S.38f, 80).
4.4.2 Remainder Stochastic Sampling
Das Remainder Stochastic Sampling gibt es in zwei Varianten. Einmal mit Zurücklegen und einmal ohne. Die ersten Schritte sehen in beiden Varianten allerdings
gleich aus:
4.4 Selektionsverfahren
35
• Die Selektionswahrscheinlichkeit p(c) wird zunächst auf üblichem Wege erzeugt:
f it(ci )
p(ci ) = P
f it(c)
c∈P (t)
• Von jedem Chromosom c ∈ P (t − 1) werden dann zunächst bp(c) ∗ popsizec
Chromosomen direkt in P ∗ (t), einer Art Zwischenpopulation, eingefügt. In der
Regel ist die Population nach diesem Schritt noch nicht vollständig und die
Folgeschritte unterscheiden sich je nach Variante.
• Eine neue Fitness wird für jedes Chromosom c errechnet:
ff
it(c) := p(c) ∗ popsize − bp(c) ∗ popsizec
Im mit Zurücklegen-Fall werden die fehlenden Chromosomen anhand der Selektionswahrscheinlichkeit pe(c), die sich aus der neuen Fitness ff
it(c) ergibt, durch
die Roulettrad-Selektion ausgewählt.
Im anderen Fall, ohne Zurücklegen, wird die Finess ff
it(c) direkt als Auswahlwahrscheinlichkeit verwendet und bei jedem Chromosom der Reihe nach ausgewürfelt, ob es in die nächste Generation eintreten darf oder nicht.
Remainder Stochastic Sampling ist ein dynamisches, nicht diskriminierendes
Elite-Selektionsverfahren, bei dem die besten Individuen in jedem Fall überleben,
den schwächeren aber auch eine Überlebenschance gegeben wird. Zusätzlich werden
Bias und Spread im Vergleich zum Stochastic Sampling deutlich verringert (vgl.
[IG04] S.81f).
4.4.3 Stochastic Universal Sampling
Das Stochastic Universal Sampling arbeitet ähnlich wie das Stochastic Sampling,
schafft es aber, einen Bias von 0 und einen minimalen Spread zu erzeugen. Die Selektionswahrscheinlichkeit wird auf die gleiche Art und Weise berechnet. Abhängig
von dieser Wahrscheinlichkeit ist diesmal auch die Anzahl der ausgewählten Chromosomen. Diese berechnet sich p(t) ∗ popsize.
Auch hier handelt es sich um eine dynamische, nicht diskriminierende EliteSelektion (vgl. [IG04] S.82f).
4.4.4 Boltzmann Selektion
Die Besonderheit der Boltzmann Selektion liegt in der Einführung einer sogenannten Temperaturvariablen T , die zur Bestimmung der Selektionswahrscheinlichkeit
einbezogen wird:
ef it(ci )/T
P
p(ci ) =
ef it(c)/T
c∈P (t)
Im Laufe mehrerer Generationen sinkt die Temperatur T . Dadurch werden die
Unterschiede zwischen hoher und niedriger Fitness grösser, was zu einem höheren
Selektionsdruck führt. Daraus ergibt sich ein dynamisch, nicht diskriminierendes,
reines Selektionsverfahren, bei dem das Überleben des stärksten Individuums nicht
garantiert wird (vgl. [IG04] S.83).
4.4 Selektionsverfahren
36
4.4.5 Lineares Ranking
Hauptziel des linearen Rankings ist die Verhinderung der vorzeitigen Konvergenz
des genetischen Algorithmus. Dabei geht diesmal die Fitness der einzelnen Chromosomen nur bedingt auf deren Selektionswahrscheinlichkeit ein. Das Verfahren
geht von einer, nach der Fitness, absteigenden Sortierung der Chromosomen aus.
Es werden zwei Erwartungswerte festgelegt:
• Emax mit 1 ≤ Emax ≤ 2 für die Anzahl der Kopien des besten und
• Emin mit Emin = 2 − Emax für die Anzahl der Kopien des schlechtesten Chromosoms.
Die Festlegung von Emax und Emin muss folgende Bedingung erfüllen:
popsize
∀i ∈ {1, ..., popsize} : p(ci ) ≥ 0 und
X
p(ci ) = 1
i=1
Die Selektionswahrscheinlichkeit p(ci ) wird durch
i−1
1
∗ Emax − (Emax − Emin ) ∗
p(ci ) =
popsize
popsize − 1
errechnet.
Lineares Ranking ist ein reines, statisches Selektionsverfahren und nur dann
diskriminierend, falls Emax = 2. Aber auch hier müssen Spread und Bias relativ
hoch eingeschätzt werden (vgl. [IG04] S.83f).
4.4.6 Wettkampf-Selektion
Bei diesem Verfahren werden popsize Wettkämpfe zur Übernahme in die nächste
Generation geführt. Ein solcher Wettkampf wird von q vielen Chromosomen bestritten, die zufällig ausgewählt werden. Das Chromosom mit der höchsten Fitness
überlebt. Werden die Chromosomen absteigend bezüglich ihrer Fitness sortiert, ist
es möglich, die Selektionswahrscheinlich, so Bäck, mathematisch zu bestimmen:
pi =
1
∗ ((popsize − i + 1)q − (popsize − i)q )
q
popsize
.
Der Selektionsdruck kann bei diesem Verfahren durch die Anzahl der Wettkämpfer q reguliert werden. Bias und Spread liegen hier relativ hoch. Die WettkampfSelektion ist ein reines, statisches und nicht diskriminierendes Auswahlverfahren
(vgl. [IG04] S.84f).
4.4.7 Steady State Reproduktion
Dieses Verfahren unterscheidet sich wesentlich von allen bisher vorgestellten. Hier
werden nur soviele Chromosomen zufällig ausgewählt, auf denen ein genetischer
4.5 Rekombination
37
Operator, sei es Mutation oder Cross-over, angewendet werden soll. Für die Auswahl der zu verändernden Chromosomen können allerdings bekannte Selektionsverfahren verwendet werden. Das Einsetzen der neuen Individuen ist über mehrere
Verfahren möglich:
• Ersetzen der schlechtesten Chromosomen.
• Ersetzen zufällig ausgewählter Chromosomen oder
• Ersetzen mit Hilfe eines exponentiellen Rankings.
Der Name rührt daher, dass nicht die ganze Population ausgetauscht wird, sondern
nur ein Teil (vgl. [IG04] S.85).
4.4.8 Deterministisches Crowding
Ein Ansatz zur Verhinderung von Konvergenz sind Nischentechniken. Deterministisches Crowding ist ein Vertreter dieser Methode. Nach Anwenden der genetischen
Operatoren werden die neuen Individuen mit der Elterngeneration verglichen und
ersetzen das Chromosom, dem sie am ähnlichsten sind. Dieser Vergleich kann sowohl auf die genetische Struktur als auch phänotypisch erfolgen. Hier ist folglich
das grösste Problem dieses Verfahrens angesiedelt: Es muss jeweils ein Vergleichsbzw. Ähnlichkeitsmaß definiert werden. Aber auf diesem Weg wird verhindert, dass
sich einige wenige Lösungen durchsetzen (vgl. [IG04] S.86).
4.5 Rekombination
Rekombination oder Crossover ist neben der Mutation einer der beiden genetischen Operatoren eines genetischen Algorithmus und greift damit ein wichtiges
Konzept der Natur auf: die Verteilung des Erbmaterials zweier Individuen auf ihre
Nachkommen.
Im Wesentlichen werden drei verschiedene Arten von Crossover unterschieden:
• allgemeines Crossover,
• Crossover-Operatoren für Reihenfolgeprobleme (z.B. TSP) und
• Inversion.
4.5.1 One-point-crossover
Der einfachste Crossover-Operator, das one-point-crossover, wurde bereits auf Seite
28 beschrieben. Hierbei werden zwei Chromosomen an jeweils der gleichen Stelle
geteilt und deren Enden miteinander vertauscht.
Das grösste Problem dieses Verfahrens ist der Positional Bias“, der die Abhän”
gigkeit der Austauschwahrscheinlichkeit eines Gens von dessen Position im Chromosom beschreibt. Die Wahrscheinlichkeit, das erste Allel auszutauschen liegt bei
0, die Wahrscheinlichkeit des letzten Allels bei 1. Auch die Anzahl neuer Chromosomen hält sich durch die Verteilung von nur zwei Teilstücken in Grenzen (vgl.
[IG04] S.40, 87).
4.5 Rekombination
38
4.5.2 Two-point-Crossover
Das two-point-crossover ist eine Erweiterung des einfachen Crossover-Operators.
Hierbei werden zwei Punkte auf den Elternchromosomen gewählt, zwischen denen
der Austausch stattfindet, was auch in Abbildung 4.9 zu sehen ist.
cross-over
Abbildung 4.9. Two-Point-Crossover (Quelle: [IG04] S.88)
Nun könnte die Vermutung entstehen, dass auch, oder gerade, in diesem Verfahren der positional bias greift. Dies wird dadurch verhindert, dass das Chromosom
als Ring interpretiert wird (siehe Abbildung 4.10). Durch diese Art der Interpretation ist es möglich, dass ein Bereich gewählt wird, der sowohl das erste als auch
das letzte Allel einschließt (vgl. [IG04] S.88).
Abbildung 4.10. Two-Point-Crossover mit Ringinterpretation des Chromosoms
(i.A.a. [IG04] S.88)
4.5.3 k-point-Crossover
Statt sich auf ein oder zwei Kreuzungspunkte festzulegen, ist es auch möglich,
deren Anzahl auf k zu erhöhen. Je höher k gewählt wird, desto niedriger ist der
positional bias. Auch bei diesem Verfahren wird ein Chromosom als Ring aufgefasst. Abbildung 4.11 zeigt ein 4-point-Crossover (vgl. [IG04] S.89).
4.5.4 Parametrisiertes Uniform Crossover
Das parametrisierte Crossover arbeitet ähnlich wie das k-point-Crossover. Allerdings wird hierbei für jedes Allel gewürfelt, ob es ausgetauscht werden soll oder
4.5 Rekombination
39
cross-over
Abbildung 4.11. 4-Point-Crossover (i.A.a. [IG04] S.89)
nicht. Die Austauschwahrscheinlichkeit pc wird dabei im Vorfeld festgelegt und
liegt in der Regel zwischen 0.5 und 0.8. Ist pc = 0.5, spricht man auch vom Uni”
form Crossover“ (vgl. [IG04] S.89).
cross-over
Abbildung 4.12. Beispiel parametrisiertes Uniform Crossover (i.A.a. [IG04] S.89)
4.5.5 Shuffle Crossover
Ein weiterer Versuch den positional bias zu unterbinden, ist das Shuffle Crossover,
bei dem drei wesentliche Schritt gemacht werden:
1. Bei beiden beteiligten Chromosomen wird die Reihenfolge der Allele zufällig
durcheinander gewürfelt. Die neue Reihenfolge ist bei beiden Chromosomen
gleich.
2. Anwendung eines Crossover-Operators. Dabei kann jedes der bereits bekannten
Verfahren eingesetzt werden.
3. Wiederherstellen der alten Reihenfolge auf beiden Chromosomen.
Durch dieses Verfahren kann der positional bias selbst beim one-point-Crossover
auf Null reduziert werden (vgl. [IG04] S.90).
4.5.6 Punctuated Crossover
Das Punctuated Crossover ist eine Erweiterung des k-point-Crossover, wobei versucht wird, die Punkte, an denen das Crossover durchgeführt wird, neben den
eigentlichen Chromosomen weiter zu entwickeln. Um dies zu erreichen, wird jedes
4.6 Mutation
40
Chromosom um einen Bitstring der Länge l erweitert. Eine 1 auf diesem erweiterten Teilstück besagt, dass das Chromosom an der entsprechenden Stelle geteilt
werden darf, eine 0 verbietet eine Teilung an der entsprechenden Stelle. Diese Chromosomenerweiterung wird im Verlauf des Algorithmus nur bei der Rekombination verwendet, Mutation und Berechnung der Fitness beachten diese Erweiterung
nicht.
Vom Einsatz dieser Strategie wird erhofft, dass sich Kreuzungspunkte mit besonders positivem Einfluss herauskristallisieren und jene, die einen zerstörerischen
Einfluss auf gute Chromosomen nehmen könnten, unterbunden werden (vgl. [IG04]
S.90).
4.5.7 Inversion
Die Inversion ist im Grunde auch eine Erweiterung des two-point-Crossovers, mit
deren Hilfe eine Umordnung von besonders erfolgreichen Gensequenzen und damit
deren Verbesserung stattfinden soll.
Der Name verrät das Vorgehen dieses Verfahrens: Die Reihenfolge der Gene
zwischen den beiden Kreuzungspunkten wird vor der Rekombination umgedreht,
was in Abbildung 4.13 gezeigt wird.
1 2 3 4 5 6 7 8 9
1 2 6 5 4 3 7 8 9
Abbildung 4.13. Inversion (Quelle: [IG04] S.98)
Wird das Chromosom nicht als Ring aufgefasst, erhöht sich auch hier der positional bias (vgl. [IG04] S.97f).
4.6 Mutation
Die Mutation spielt, wie auch in der Natur, beim genetischen Algorithmus keine
grosse Rolle. Sie dient im Wesentlichen dazu, ein lokales Optimum zu überspringen
und die Evolution damit etwas anzutreiben. Die von einer Mutation betroffenen
Chromosomen müssen üblicherweise auch nicht die beste Fitness vorweisen, wie es
beim Crossover oft der Fall ist. Dort wird versucht, das Beste aus zwei Chromosomen zu kombinieren. Die Mutation verändert einfach nur die vorliegenden Gene,
wobei das Ergebnis dieses Operators nicht unbedingt zu einer Verbesserung führen
muss.
Aus diesem Grund gibt es auch nur vergleichsweise wenige Verfahren, die sich
mit der Mutation beschäftigen. Liegen die Chromosomen in Form eines Bitstrings
vor, wird üblicherweise eine Mutationswahrscheinlichkeit von 1/n gewählt, wobei
4.7 Genetische Programmierung
41
n die Anzahl der Gene im Chromosom ist. Fällt nun ein Gen einer Mutation zum
Opfer, wird das Bit einfach gekippt, d.h. aus einer 0 wird eine 1 und aus einer 1
wird eine 0 (vgl. [IG04] S.40ff, 98f).
4.6.1 Non Uniform Mutation
Ein Verfahren, das eingesetzt wird, falls die Gene von reellen Zahlen repräsentiert
werden, ist die Non Uniform Mutation. In diesem Verfahren nimmt das Alter der
Population Einfluss auf die Mutation.
Sei c = (a1 , ..., al ) ein Chromosom mit ai ∈ R und ak das für die Mutation
gewählte Gen. ∆(x, y) ist eine mit steigendem x monoton fallende Funktion, die
später durch die Generation beinflusst wird, und mit ak ∗ ∆(x, y) den Definitionsbereich [uk , ..., ok ] besitzt. Mit Hilfe einer binären Zufallszahl z errechnet sich die
Änderung des Gens ak wie folgt:
(
ak + ∆(t, ok − ak ) falls z = 0
a0k =
ak − ∆(t, ak − uk ) falls z = 1
Da ∆(x, y) mit steigender Generationenzahl sinkt, werden die Veränderungen
im Laufe der Zeit immer geringer, wodurch verhindert werden soll, dass gut ausgebildete Individuen zerstört werden können (vgl. [IG04] S.99f).
4.7 Genetische Programmierung
Die Genetische Programmierung wurde Anfang der 1990er von Koza entwickelt
und stellt eine Abwandlung des einfachen genetischen Algorithmus dar. Interessant
dabei ist, dass die verwendeten Chromosomen keine feste Länge mehr benötigen,
sondern dass diese variieren kann. Statt einen Zeichenstring zu verwenden, besteht
ein Chromosom bei der genetischen Programmierung aus einer Liste bzw. einem
Programmbaum. Besonders geeignet dafür ist die Programmiersprache LISP (LISt
Processing), aus deren Listen eine Baumstruktur hergestellt werden kann.
Ein Chromosom C setzt sich aus Funktionssymbolen F und Terminalsymbolen
T zusammen. Im einfachsten Fall könnten auch hier die Terminalsymbole 0 und 1
(T = {0, 1}) und entsprechende binäre Funktionen
F = {and, or, not, if..then..else}
verwendet werden. Möglich wären aber auch Variablen und Konstanten, die reelle
Werte annehmen können und entsprechende Funktionen, wie Division, Multiplikation, Logarithmus, usw. Zwei Beispielprogramme und deren entsprechende Bäume
werden in Abbildung 4.14 gezeigt.
Auch hier sind die genetischen Operatoren Rekombination (crossover) und Mutation möglich, wobei in den meisten Fällen der genetischen Programmierung auf
die Mutation verzichtet wird, da der crossover-Operator hier reichhaltiger“ als bei
”
den genetischen Algorithmen ist. Eine Rekombination zweier Chromosomen wird
einfach durch den Austausch zweier Knoten und deren Unterbäumen realisiert
(siehe Abbildung 4.15) (vgl. [IG04] S. 127ff).
4.7 Genetische Programmierung
42
+
+
3
*
2
5
3
IF
>
6
5
x
6
y
Abbildung 4.14. Beispielprogramme als Bäume (Quelle: [IG04] S. 129)
or
or
or
x1
and
and
not
not
not
not
x0
x0
x1
x0
x0
x1
crossover
or
or
x1
or
not
not
x0
x0
and
and
not
not
x0
x1
x0
x1
Abbildung 4.15. Crossover: Austausch ausgewählter Teilbäume (Quelle: [IG04]
S. 131f)
5
Künstliche Neuronale Netze
Mit künstlichen neuronalen Netzen (kurz: kNN) wird versucht, Eigenschaften natürlicher Gehirne in der Technik nachzubilden. Dazu zählen die Fähigkeiten zu Lernen, zu abstrahieren oder zu klassifizieren. All diese Eigenschaften können durch
künstliche neuronale Netze erreicht werden.
Dabei ist wichtig herauszuheben, dass künstliche neuronale Netze eine völlig
neue Technologie der Informationsverarbeitung darstellen. Die sonst gebräuchliche von Neumann-Architektur wird hier nicht verwendet, da künstliche neuronale
Netze hochgradig parallel arbeiten müssen. Allerdings werden kNNs selten in die
Praxis umgesetzt, sondern in der Regel auf herkömmlichen Rechnern - eben mit
von Neumanns Architektur - simuliert.
5.1 Neuronale Netze in der Natur
Vorbild künstlicher neuronaler Netze sind Gehirne bzw. Nervensysteme von Wirbeltieren. Diese bestehen aus vielen Milliarden (ca. 100 Milliarden beim Menschen)
Neuronen, die massiv parallel arbeiten und untereinander durch ein engmaschiges
Netz verbunden sind.
Neuronen sind Nervenzellen, eben der Zelltyp, der in Gehirnen auftritt. Die Besonderheit im Gegensatz zu anderen Zellen ist, dass sich Neuronen nicht erneuern
können. Andere Zellen, z.B. die der Haut, sterben ab und werden durch neue ersetzt, wozu die Nervenzellen nicht in der Lage sind. Die Verbindungen zwischen
den Neuronen werden in den ersten Lebensjahren ausgebildet. Die Leistungsfähigkeit erhält ein solches Nervensystem vor allem durch dessen extreme Vernetzung,
wodurch ein einzelnes Neuron keine direkten Aufgaben hat und entsprechend entbehrlich ist. Das zeigt, dass ein solches Nervensystem vor allem durch seine Architektur der enormen Vernetzung profitiert (vgl. [JS91] S. 19ff, 36ff, [Zel94] S. 23f,
35ff).
5.2 Aufbau und Funktionsweise einer Nervenzelle
Abbildung 5.1 zeigt die wichtigsten Elemente einer Nervenzelle.
5.2 Aufbau und Funktionsweise einer Nervenzelle
44
Abbildung 5.1. Ein typisches Neuron (Nervenzelle) (Quelle:[JS91] S. 36)
Der Zellkörper (Soma) unterscheidet sich nicht wesentlich von üblichen Zellen.
Der Unterschied liegt hier vor allem in der Funktionalität und dass er sich, im
Gegensatz zu herkömmlichen Zellen, nicht teilen kann. Im Soma werden die eingegangen Signale aufgefangen und aufsummiert. Ob und wie stark ein Neuron auf
ein ankommendes Signal reagiert, wird ebenfalls im Soma entschieden.
Die Signale empfängt das Neuron über die Dendriten, hauchdünne Geißel, die
ankommende Signale anderer Zellen aufnehmen und an den Zellkörper weiterleiten.
Das Ausgangssignal einer Nervenzelle wird über eine Nervenfaser, das Axon,
weitergeleitet, dessen Länge zwischen einigen Millimetern bis zu fast einem Meter
liegen kann. Über diese Strecke muss ein Axon in der Lage sein, ein Signal an
andere Neuronen weiterzuleiten. Die Signalübertragung erfolgt über Ionenströme.
Im Inneren des Axons häufen sich positiv geladene Kaliumionen. Ausserhalb eines
Axons herrscht eine niedrigere Konzentration positiver Ladung vor. Durch eine
Wanderung der Kaliumionen aus dem Axon heraus soll dieses Konzentrationsgefälle ausgeglichen werden. Nach diesem Spannungsausgleich liegt die Spannungsdifferenz bei 40 bis 60 Millivolt. Dieser Zustand wird Ruhepotential bezeichnet.
Das Soma nimmt nun solange elektrische Signale auf, bis es die Schwelle von ca.
70 Millivolt überschreitet. Nachdem diese Schwelle übertreten wurde, schnellt das
elektrische Potenzial in die Höhe und das Neuron feuert“ mit ungefähr 100 Milli”
volt. Dieser Impuls, der nun über das Axon zu anderen Neuronen übertragen wird,
nennt sich Aktionspotential. Zwischen zwei Aktionspotentialen benötigt eine Nervenzelle eine gewisse Erholungsphase, in der es in den Bereich des Ruhepotentials
zurückfällt. Dadurch wird eine dauerhafte Erregung verhindert.
Die Endknöpfchen, an denen ein Axon auf die Dendriten einer anderen Nervenzelle trifft, werden Synapsen genannt. Diese wirken entweder erregend oder
hemmend auf die empfangende Nervenzelle (vgl. [JS91] S. 36ff, [Zel94] S. 35ff,
[HB89] S. 204ff, [Caw03] S. 191f).
5.3 Neuronale Netze in der Informatik
45
5.3 Neuronale Netze in der Informatik
5.3.1 Netzaufbau
Künstliche neuronale Netze orientieren sich in ihren Aufbau zwar an dem biologischen Vorbild der Nervenzelle, idealisieren diese jedoch stark. Genauso wie ihr
Vorbild bestehen Neuronen eines kNN aus drei wesentlichen Bestandteilen:
1. dem Zellkörper, in dem die Summenbildung der Eingangssignale erfolgt und
der den Ausgangsimpuls erzeugt,
2. die Dendriten, über die die Eingangssignale eintreffen und
3. dem Axon, das den Impuls einer Zelle an das Netz weitergibt.
Die Synapsen werden durch Verbindungsgewichte realisiert, die das Eingangssignal
hemmen oder verstärken können.
Die Ausgabe einer Zelle, also eines Neurons, wird aus drei Bestandteilen ermittelt:
1. Der Aktivierungszustand ai (t), der die Aktivierung einer Zelle i zum Zeitpunkt
t beschreibt.
2. Die Aktivierungsfunktion fact , die den Aktivierungszustand aj (t + 1) des Neurons j zum Zeitpunkt t + 1 berechnet. Diese Berechnung erfolgt unter Einfluss
der vorangegangenen Aktivierung aj (t), der Netzeingabe netj (t) und einem
Schwellwert Θj :
aj (t + 1) = fact (aj (t), netj (t), Θj ).
3. Eine Ausgabefunktion fout , die das Ausgabesignal der Zelle anhand der Aktivierung errechnet:
oj = fout (aj ).
Als Ausgabefunktion wird sehr häufig die Identität (id) verwendet. Dadurch wird
die Ausgabe hauptsächlich durch die Aktivierungsfunktion bestimmt, für die häufig
sigmoide (S-förmige) Funktionen, wie sin, tanh oder die logistische Funktion 1+e1−x
verwendet werden.
Das Netz selbst kann als gerichteter, gewichteter Graph verstanden werden. Dabei stellen die Kanten die gewichteten Verbindungen zwischen den Neuronen dar.
Das Gewicht (weight) zwischen Zelle i und Zelle j wird demnach wij bezeichnet. In
Abbildung 5.2 werden unterschiedliche Verbindungsmöglichkeiten und die daraus
resultierenden Topologien gezeigt. Besteht zwischen zwei Zellen keine Verbindung,
wird dies durch eine 0 in der Gewichtsmatrix gekennzeichnet.
Die für die Aktivierung benötigte Netzeingabe netj (t) berechnet sich wie folgt
aus den jeweiligen Aktivierungen bzw. Ausgaben der mit einer Zelle verbunden
Neuronen und den jeweiligen Gewichtungen dieser Verbindungen:
X
netj (t) =
oi (t)wij
i
womit auch die Aufsummierung der eintreffenden Signale, wie sie im biologischen
Vorbild erfolgt, mathematisch umgesetzt ist (vgl. [Zel94] S. 71ff).
5.4 Lernverfahren
46
a) feedforward, ebenweise verbunden
b) feedforward mit shortcut connections
c) direkte Rückkopplung
d) indirekte Rückkopplung
e) laterale Rückkopplung
f) vollständig verbunden ohne direkte Rückkopplung
Abbildung
5.2.
(Quelle:[Zel94] S. 79)
Beispiel-Topologien
und
ihre
Verbindungsmatrizen
5.4 Lernverfahren
Neuronale Netze sind wie ihre natürlichen Vorbilder lernfähig. Im Falle künstlicher
neuronaler Netze zielt das Lernen auf eine Veränderung der Netzgewichte ab. Dabei
werden drei verschiedene Ansätze unterschieden:
Überwachtes Lernen (supervised learning): Die Überwachung bei dieser Methode übernimmt ein externer Lehrer“. Das Netz wird auf verschiedene Ein”
gabemuster trainiert, indem es zu den jeweiligen Eingabewerten das korrekte
bzw. das erwartete Ausgabemuster zum Vergleich zu seiner eigenen Ausgabe
erhält. Mit Hilfe dieser Vergleichsdaten werden die Netzgewichte angepasst. Ziel
dieses Trainings ist es, möglichst viele Übereinstimmungen zwischen Netzausgabe und übergebenem Ausgabemuster zu erhalten. Das überwachte Lernen ist
die schnellste Möglichkeit, ein Netz zu trainieren. Allerdings ist dieser Ansatz
biologisch nicht sehr plausibel, da die Aktivierungen der Ausgabeneuronen vorgegeben werden. Ein weiteres Problem ergibt sich, wenn keine ausreichenden
Daten vorliegen, die das Netz einstudieren könnte.
Bestärkendes Lernen (reinforcement learning) ist eher aus von der Natur
abgeleitet. Ein Lehrer“ sagt dem Netz, ob seine Ausgabe zu dem gegebenen
”
5.5 Backpropagation
47
Eingabemuster richtig oder falsch ist (Belohnung oder Bestrafung). Alternativ kann dem Netz auch ein Korrektheitsgrad zur Kontrolle gegeben werden,
im Sinne einer prozentualen Korrektheit. Ein solcher Korrektheitsgrad ist vergleichbar mit der Fitnessfunktion eines genetischen Algorithmus. In der Praxis
findet diese Methode eher weniger Anklang, da sie viel mehr Zeit in Anspruch
nimmt als die des überwachten Lernens.
Unüberwachtes Lernen (unsupervised learning): Die von Kohonen entwickelten
Selbstorganisierenden Karten (self organizing maps: SOM) sind vergleichbar
mit dem visuellen Kortex von Säugetieren und dienen letztendlich zur Klassifizierung der Eingabedaten. Das Verfahren wird deshalb unüberwacht bezeichnet, da das Netz über die Gewichtsänderungen entscheidet und hierfür kein
Ausgabemuster benötigt.
Neuronale Netze stellen für den Benutzer eine Black-Box dar. In den seltensten
Fällen ist es möglich, den Grund für die Gewichtung einer Verbindung nachzuvollziehen (vgl. [Zel94] S. 93ff, [Caw03] S. 195ff).
5.5 Backpropagation
Backpropagation ist die populärste Methode zum überwachten Lernen vorwärtsgerichteter Netze. Das Verfahren wurde zudem vielfach modifiziert, um es für
verschiedene Problemstellungen zu optimieren oder um es zusätzlich für rückgekoppelte Netze verwenden zu können. Dieser Abschnitt stellt den einfachen
Backpropagation-Algorithmus vor.
Backpropagation ist ein Gradientenabstiegsverfahren, das den Fehler, den das
Netz verursacht, minimieren soll. Der Fehler eines Netzes entsteht durch die Belegung seiner Gewichte:
E(W ) = E(w1 , ..., wn )
d.h. der Algorithmus soll möglichst schnell eine Gewichtsverteilung berechnen, die
ein globales Minimum der Fehlerfunktion darstellt.
Das Verfahren benötigt eine Reihe von Eingabemustern und passenden Ausgabemustern, die es zu trainieren gilt. Das Netz sollte mehrmals mit denselben
Mustern trainiert werden. Die Gewichtsänderung für das Backpropagation wird
von der Delta-Lernregel (Widrow-Hoff-Regel) abgeleitet und berechnet sich wie
folgt:
X
∆wij = η
opi δpj
p
Wobei p das jeweilige Eingabemuster (pattern) darstellt, η den Lernfaktor oder die
Schrittweite bezeichnet und üblicherweise zwischen 0 und 1 liegt, opi die Ausgabe
des Neurons j bei Eingabe p beschreibt und δ den Faktor bezeichnet, der sich je
nach Lage des Neurons entsprechend verändert:

0
fact
(netpj )(tpj − opj ) falls j Ausgabezelle
δpj = f 0 (net ) P δ w
falls j verdeckte Zelle
pj
pk jk
 act
k
5.6 Netzarchitekturen
48
allerdings kann dieser Ausdruck noch weiter vereinfacht werden, falls die logistische
Aktivierungsfunktion verwendet wird:

opj (1 − opj )(tpj − opj ) falls j Ausgabezelle
δpj = o (1 − o ) P δ w
falls j verdeckte Zelle
pj
pk jk
 pj
k
Der Wert tpj ist der Ausgabewert an der Stelle j, den es zu trainieren gilt.
Zusätzlich finden sich viele Ansätze, das Backpropagation auf weitere Architekturen, z.B. rückgekoppelte Netze, anzuwenden oder um typische Probleme, die
bei Gradientenverfahren auftreten, zu umgehen oder einzudämmen. Diese Verfahren werden an dieser Stelle jedoch nicht beschrieben, sondern finden sich in der
entsprechenden Literatur (vgl. [Zel94] S. 105ff, [Caw03] S. 195ff).
5.6 Netzarchitekturen
Im Laufe der Entwicklung künstlicher neuronaler Netze sind viele unterschiedliche
Ausprägungen entstanden, die entweder gezielt für bestimmte Problemstellungen
gedacht sind, oder die die Umsetzung unterschiedliche Konzepte der Natur verfolgen.
Die hier aufgeführte Liste erhebt keinen Anspruch auf Vollständigkeit. Vielmehr werden die Netztypen vorgestellt, die in dieser Arbeit zumindest kurzzeitig
Verwendung gefunden haben.
5.6.1 (Multi Layer) Perzeptron
Die Geschichte der künstlichen neuronalen Netze beginnt Anfang der 1960er mit
der Entwicklung des Perzeptrons von Frank Rosenblatt. Das Schema des Perzeptrons wird in Abbildung 5.3 dargestellt. Es besteht aus einer Eingabeschicht, die
über fest gewichtete Verbindungen mit der eigentlichen Verarbeitungsschicht verbunden ist. Diese besitzt Verbindungen mit trainierbaren Gewichten zu den Ausgabezellen.
Ebene 1
variable Verbindungen
Ebene 0
∑
festen
Verbindungen
Eingabeschicht
w1
o1
...
o2
wn
on
Abbildung 5.3. Schema des Perzeptrons (links) und Ausgabeneuron des Perzeptrons (rechts) (Quelle:[Zel94] S. 98)
5.6 Netzarchitekturen
49
Als Ausgabe- bzw. Aktivierungsfunktion wurde zu Beginn eine binäre Schwellwertfunktion verwendet, um binäre Funktionen zu berechnen. Die anfängliche Euphorie, die mit der Entdeckung des Perzeptrons einherging, fand ihr jähes Ende,
als man feststellte, dass diese Architektur noch nicht einmal in der Lage war, eine
einfache XOR-Berechnung durchzuführen.
Dieses Problem wurde allerdings Jahre später durch die Erweiterung des Netzes um eine weitere Schicht, der sogenannten verdeckten Schicht, behoben. Diese
Schicht kann wiederum aus mehreren Schichten bestehen, wobei alle Verbindungen, die daraus entstehen, trainierbar sind (siehe Abbildung 5.4). Diese Erweiterung nennt sich Multi Layer Perceptron (MLP) und beschreibt die gängigste
Netztopologie.
Eingabe
Ebene 1
Ebene 2
Ebene 3
Abbildung 5.4. Dreistufiges Perzeptron (i.A.a.:[Zel94] S. 102)
MLPs werden vorwiegend durch das überwachte Lernverfahren Backpropagation trainiert (vgl. [Zel94] S. 73f, 95ff, [Caw03] S. 192ff).
5.6.2 Elman-Netze
Elman-Netze bzw. die damit eng verwandten Jordan-Netze werden vermehrt zur
Zeitreihenanalyse verwendet. Darunter versteht man die Untersuchung zeitlich aufeinanderfolgender Muster, die nicht getrennt voneinander untersucht werden können, da eine gewisse Abhängigkeit zwischen den einzelnen Mustern besteht. Ein
typisches Einsatzgebiet von Zeitreihenanalysen sind Wetter- oder, noch spezieller,
Hochwasservorhersagen.
Um nun ein neuronales Netz empfänglich für solche Zeitreihen zu machen, erhält
es eine Art Kurzzeitgedächtnis, in welchem es sich seine letzten Zustände merken
kann. Dies wird technisch durch eine zusätzliche Neuronenschicht und einer 1:1
Rückkopplung der verdeckten Schicht erreicht, wie es in Abbildung 5.5 gezeigt
wird.
5.6 Netzarchitekturen
50
Eingabe
Kontext
trainierbare Gewichte
1:1 Übertragung
verdeckt
trainierbare Gewichte
Ausgabe
Abbildung 5.5. Architektur eines Elman-Netzes (i.A.a.:[Zel94], S. 141)
Jordan-Netze arbeiten ähnlich, jedoch werden die Kontextzellen dort mit der
Ausgabeschicht verbunden. Aber es ist auch möglich, die Topologie eines ElmanNetzes derart auszuweiten, dass, falls mehrere verdeckte Schichten existieren, sowohl diese als auch die Ausgabezellen über eine separate Kontextschicht verfügen.
Diese Erweiterung wird hierarchisches Elman-Netz genannt.
Häufig werden auch direkte Rückkopplungen der Kontextzellen verwendet, die
ebenfalls nicht trainierbar sind, sondern mit einem festen Gewicht λ belegt sind.
Zum Trainieren dieser sogenannten partiell rekurrenten Netze werden abgewandelte Formen des Backpropagation-Algorithmus verwendet (vgl. [Zel94] S. 137ff).
5.6.3 Selbstorganisierende Karten
Die selbstorganisierenden Karten (englisch: self organizing maps, SOM) oder, nach
Ihrem Entdecker“, Kohonen-Karten genannten Netze sind das Paradebeispiel für
”
Netze, die mittels unüberwachtem Lernen trainiert werden. Das hierbei entstehende Verhalten des Netzes ist sehr gut vergleichbar mit der Funktionalität der
Netzhaut eines Auges und wird vornehmlich zur Klassifikation oder Clusterbildung
verwendet.
Kohonen-Karten besitzen im Grunde nur eine Neuronenschicht zur Verarbeitung der Daten mit einer vorgeschalteten Eingabeschicht. Jedes Neuron der eigentlichen Verarbeitungsschicht ist über die üblichen gewichteten Verbindungen
mit der Eingabeschicht verbunden. Zusätzlich bestehen Verbindungen zwischen
den Neuronen der Verarbeitungsschicht, wodurch eine Nachbarschaftsbeziehung
entsteht, die später eine wichtige Rolle spielt. Abbildung 5.6 soll noch einmal verdeutlichen, dass jedes Neuron den n-dimensionalen Eingabevektor über n gewich-
5.6 Netzarchitekturen
51
tete Verbindungen erhält, und dass sie untereinander zu einem zweidimensionalen
Gitter verknüpft sind.
w1j
w2j
... wnj
Wj = (w1j, w2j,..., wnj)
Eingabeschicht
X = (x1j, x2,..., xn)
Abbildung 5.6. Netzstruktur der selbstorganisierenden Karten (i.A.a.:[Zel94] S.
180)
Das Lernen der Kohonen-Karten erfolgt unüberwacht, was bedeutet, dass keine
Musterlösungen zu den gegebenen Eingabemustern vorgegeben werden. Vielmehr
soll das Netz die zum Training verwendeten Daten in Cluster einteilen. Hierzu
wird zu jedem Eingabevektor X = (x1 , x2 , ..., xn ) das Neuron j gewählt, dessen
Gewichtsvektor Wj = (w1j , w2j , ..., wnj ) dem Eingabevektor am ähnlichsten ist:
kX − Wc k = minj (kX − Wj k)
wobei hier häufig die euklidische Norm oder das Skalarprodukt verwendet wird.
Das Neuron c beschreibt das Gewinnerneuron.
Die nun folgenden Änderungen der Gewichtsvektoren erfolgen nicht nur auf dem
Gewinnerneuron, sondern auch auf Neuronen, die sich in seiner Nähe“ befinden.
”
Mit der Distanz ist wirklich eine Entfernung gemeint und nicht etwa der Unterschied, der bei dem Vergleich der Eingabe mit den Gewichtsvektoren entsteht. Die
räumliche Distanz zwischen den Neuronen wird bei der Veranschaulichung einer
eindimensionalen Anordnung der Verarbeitungsschicht, wie sie in Abbildung 5.7
gezeigt wird, deutlich.
Nachbarschaftsradius
1
2
unverändert
3
verändert
4
5
6
stark verändert
7
8
9
verändert unverändert
Abbildung 5.7. Netzstruktur der selbstorganisierenden Karten (i.A.a.:[Zel94] S.
182)
5.7 Optimierung neuronaler Netze
52
Damit ist die Distanz zwischen den Neuronen, die mit der Funktion hcj (t) ermittelt wird, ein wichtiger Bestandteil der Berechnung der Gewichtsänderung des
Netzes:
Wj (t + 1) = Wj (t) + η(t)hcj (t) [X(t) − Wj (t)]
η(t) beschreibt die zeitlich veränderliche Lernrate, die überlicherweise durch eine
monoton fallende Funktion mit 0 < η(t) < 1 realisiert wird.
In der Praxis wird häufig auf den Zeitparameter t zur Berechnung der Distanz
verzichtet. Statt dessen wird ein Parameter d eingesetzt, der die Grösse des Nachbarschaftsradius angibt, und der Wert z = krc − rj k, der die Entfernung zwischen
den Neuronen bestimmt. Mit Hilfe dieser Parameter gibt es etliche Alternativen
zur Berechnung der Distanz:
2
hgauss (z, d) = e−(z/d)
(
1 falls z < d
hcylinder (z, d) =
0 sonst
(
1 − dz falls z < d
hcone (z, d) =
0
sonst
(
cos dz π2
falls z < d
hcos (z, d) =
0
sonst
Wie sich diese Nachbarschaftsfunktionen in einem zweidimensionalen Verbindungsgitter auswirken, zeigt Abbildung 5.8.
Abbildung 5.8. Distanzfunktionen hgauss , hcylinder , hcone und hcos (Quelle:[Zel94]
S. 183)
Abbildung 5.9 zeigt die Entfaltung einer solchen Kohonenkarte über den Zeitraum von 3000 Lernschritten. Die Gitternetzform entsteht durch die Verbindungen
zwischen den Neuronen. In diesem Fall verteilen sich die Eingabemuster nahezu
quadratisch auf die vorhandenen Neuronen (vgl. [Zel94] S. 179ff).
5.7 Optimierung neuronaler Netze
Mit künstlichen neuronalen Netzen ist es möglich, Fuzzy-Regel-Systeme, eine weitere Methode des Softcomputing, zu optimieren (vgl. [DN94]). Aber auch neuronale
5.7 Optimierung neuronaler Netze
53
Abbildung 5.9. Entfaltung einer Kohonenkarte (Quelle:[Zel94] S. 184)
Netze können optimiert werden. Dies ist durch eine geeignete Kombination neuronaler Netze und genetischer Algorithmen (siehe Kapitel 4) möglich, die auch als
Neuroevolution bezeichnet wird.
Ziel der Optimierung neuronaler Netze ist die Minimierung der Fehlerfunktion
E(W ), die durch die Werte der Verbindungsgewichte errechnet wird. Das bedeutet, dass die Gewichte so codiert werden müssen, dass sie von einem genetischen
Algorithmus verändert werden können. Am naheliegendsten ist die Hintereinanderreihung der einzelnen Gewichte (w1 , w2 , ..., wn ). Da diese in der Regel als Gleitkommzahlen repräsentiert werden, könnten sie beispielsweise binär in 20 Bits codiert werden. Zusätzlich zu den Gewichten könnten die Schwellwerte der Neuronen
mitoptimiert und in den Bitstring eingebunden werden.
Bei den genetischen Operatoren sollte das Crossover einzelne Netzparameter
nicht zerschneiden. Dies haben Experimente von Montana und Davis Ende der
1980er ergeben. Das bedeutet, dass die Netzparameter durch Crossover nur vertauscht, nicht aber verändert werden.
Die Veränderung der Gewichts- bzw. Schwellwerte soll einzig und allein durch
Mutation erfolgen. Die Mutation operiert dabei nicht auf der Bitebene der Codierung, sondern direkt auf dem reellen Wert. Dabei wird dem Parameter α mit einer
Wahrscheinlichkeit p (z.B. Mutationrate) die Zufallszahl hinzuaddiert.
5.7 Optimierung neuronaler Netze
54
Eine weitere Aufgabe der Neuroevolution ist die Anpassung der Netztopologie
des kNN.
Laut Rojas ([Roj91]) gibt es noch keinen Vergleich der Leistungen von Lernalgorithmen wie dem Backpropagation und genetischer Optimierung. Für Problemstellungen, zu denen es keine Trainingsdaten für das überwachte Lernen eines
Netzes gibt, ist die Methode der Neuroevolution ein adäquater Ersatz (vgl. [Roj91]
S.392ff, [Rue04] S. 24ff).
6
Open Dynamics Engine
Eine der grössten Herausforderungen dieser Arbeit ist die physikalische Simulation.
Dieser Herausforderung stellt sich Russell Smiths Open Dynamics Engine, kurz
ODE. Dabei handelt es sich um eine frei verfügbare (open source) C-Bibliothek
zur Simulation fester Körper. ODE ist hervorragend geeignet zur Simulation von
Fahrzeugen oder Kreaturen, die sich mit Hilfe von Armen und Beinen fortbewegen.
Und da es ein schnelles und stabiles System ist, ist es ideal, die Ziele, die in dieser
Arbeit verfolgt werden, zu erreichen.
Der Einsatz von ODE in vielen kommerziellen Spielen zeigt, dass es sich hierbei um ein Produkt von hoher Qualität und Stabilität handelt. Daneben wird
ODE häufig für Robotersimulationen verwendet. Auch hier wird die Leistungsfähigkeit dieser Bibliothek deutlich. Denn gerade in der Robotik sind ausgereifte
und realistische Simulationen sehr wertvoll. Auf diese Weise können die Roboter in
Situationen simuliert werden, die für einen praktischen Test zu gefährlich wären.
Oder es können Umgebungen simuliert werden, die im Labor nicht ohne weiteres
herzustellen sind, so z.B. die Mondatmosphäre.
6.1 Eigenschaften von ODE
ODE dient zur Berechnung und Simulation dynamischer Phänomene gegliederter,
fester Körper. Darunter fallen sowohl Fahrzeuge unterschiedlicher Art, die z.B. von
Rädern angetrieben werden können, als auch jegliche Arten von Kreaturen, die sich
mit Armen und Beinen fortbewegen. Natürlich ist es möglich, ODE darüber hinaus
zu verwenden, um andere physikalische Gegebenheiten zu simulieren.
Die äußeren Bedingungen der Umgebung sind vom Benutzer beliebig einstellbar
und können noch während der Simulation verändert werden. Dadurch eignet sich
ODE vor allem für interaktive Echtzeit-Simulationen.
Da physikalische Simulationsumgebungen einen enormen Rechenaufwand in Anspruch nehmen, wurde bei ODE viel Wert auf Geschwindigkeit und Stabilität der
Simulation gelegt und weniger auf physikalische Genauigkeit. In der Regel fallen
diese Ungenauigkeiten nicht auf, es sei denn, ODE wird für quantitative Technik eingesetzt, bei der Berechnungsfehler schlimmere Auswirkungen hätten, als es
beispielsweise bei Computerspielen der Fall wäre.
6.2 Bestandteile von ODE
56
ODE besitzt eine eigene Kollisionsabfrage und -behandlung, wobei es auch
möglich ist, eigene Implementierungen zu verwenden. Die Kollisionsabfrage hat
die Aufgabe, festzustellen, welche Körper sich wie berühren und welche Auswirkungen das auf sie hat. Bei der Implementierung eines Billardspiels würde die
Kollisionsbehandlung feststellen, welche Kugeln sich berühren und wie sich dieser
Zusammenprall auf deren Verlauf auswirkt.
Alles in allem bildet ODE ein Werkzeug zur Berechnung und Simulation dynamischer Umgebungen, wobei die Betonung auf dem Begriff Berechnung liegt.
Die Darstellung der simulierten Körper gehört nicht zu der Aufgabe der Open Dynamics Engine. Hierfür gibt es allerdings zahlreiche Möglichkeiten. So ist es z.B.
möglich die Simulation durch Java3D rendern zu lassen (vgl. [Smi04] S. 1f, 6).
6.2 Bestandteile von ODE
Das Besondere an ODE ist, dass es sehr einfach gehalten ist. Die Bibliothek gliedert
sich im Grunde in zwei Bereiche, die physikalische und die geometrische Welt. Die
physikalische Welt besteht aus:
• World,
• Body,
• Joint und JointGroup;
Die geometrische aus:
• Space,
• Geom,
• Collision Detection.
Was sich hinter den einzelnen Begriffen verbirgt und wie diese zusammenhängen,
wird in den folgenden Abschnitten erklärt. Da ODE in mehrere Programmiersprachen portiert und ein Java-Wrapper in dieser Arbeit verwendet wird, werden die
einzelnen Elemente als Klassen bezeichnet.
6.2.1 World
Das wichtigste Element einer Simulation in ODE ist world. Wie der Name es
schon vermuten lässt, bildet diese Klasse die Welt ab, die simuliert werden soll. In
ihr werden alle anderen Objekte verwaltet. Sollten in einer Anwendung mehrere
Welten erzeugt werden, können sie nicht interagieren.
Neben der Verwaltung der einzelnen Körper besitzt die Welt verschiedene Parameter, die vom Benutzer verändert werden können. Zu diesen Parametern zählt
vor allem die Schwerkraft, die in der Welt vorherrscht, auf der Erde sind dies
g = 9.81 sm2 . Da die Schwerkraft in ODE durch einen Vektor beschrieben wird, würde die Simulation der Erdgravitation durch folgenden Vektor beschrieben werden:


0
g= 0 
−9.81
6.2 Bestandteile von ODE
57
Neben diesem Parameter können Werte, die die Simulation beeinflussen, eingestellt
werden. Hierunter fällt der ERP, der Error Reduction Parameter, der festlegt, wie
stark Fehler korrigiert werden sollen, die durch Berechnungen bezüglich der Gelenke aufgetreten sind. Der Wert kann zwischen 0 (keine Fehlerbehebung) und 1
(Behebung aller Fehler) liegen. Er ist standardmäßig auf 0.2 eingestellt und zeigt
somit erneut, dass ODE eher auf Geschwindigkeit als auf ganz exakte Berechnungen abzielt. Mit dem CFM-Wert (Constraint Force Mixing) können gewisse
Einschränkungen, die für Verbindungen gelten, abgeschwächt werden. Normalerweise sind die Einschränkungen hart“, so sollte in einem Kugelgelenk die Kugel
”
niemals die Pfanne verlassen. Andererseits können solche Einschränkungen abgeschwächt werden, um realere Effekte zu erzielen. Im Falle einer Kollision verhalten
sich die betroffenen Körper ohne Veränderung des CFM wie zwei Stahlkörper und
prallen sofort voneinander ab, ohne sich zu durchdringen. Schwächt man dieses
Verhalten ein wenig ab, können elastische Kollisionen simuliert werden, welche bei
der Berührung von weichen“ Lebewesen, Gummibällen oder ähnlichem auftreten.
”
Die letzte Aufgabe der Welt ist es, den Ablauf der Simulation zu steuern und
schrittweise zu berechnen. Hierzu dienen die Methoden step bzw. quickStep().
Letztere führt zu einer schnelleren, aber weniger genauen Berechnung. Die Schrittgröße in Sekunden und die Anzahl der pro Schritt durchzuführenden Iterationen
bestimmen zusätzlich die Genauigkeit der Simulation (vgl. [Smi04] S. 7ff, 15ff, 41ff,
[DS04] S. 7ff).
6.2.2 Body
Körper werden durch die Body-Klasse beschrieben. Physikalische Eigenschaften eines Körpers sind Masse, Position, Ausrichtung und seine Bewegung. Die Masse
eines solchen Körpers wird einfach durch einen reellen Wert beschrieben, wobei
es zusätzlich möglich ist, den Ort des Masseschwerpunkts festzulegen. Die Position des Körpers, seine lineare Beschleunigung und die Winkelbeschleunigung, die
die Bewegung beschreiben, werden durch Vektoren definiert. Um die Ausrichtung
festzulegen, gibt es mehrere Möglichkeiten:
• Der herkömmliche Weg ist eine Rotationsmatrix, bei der aber das Problem des
Gimbal Locks auftreten kann. Dieser Fehler tritt auf, wenn mehrere Rotationen hintereinander ausgeführt werden. Die Drehung über eine Rotationsmatrix
erfolgt über das lokale Koordinatensystem des zu drehenden Körpers, welches
sich nach der ersten Drehung bereits verändert hat. So kann es sogar vorkommen, dass eine Rotation überhaupt nicht mehr durchgeführt werden kann. Der
Vorteil einer Matrix ist, dass nicht nur Rotationen, sondern auch Transformationen wie z.B. Skalierungen durchgeführt werden können (vgl. [Ebe04b] S. 18,
26).
• Die Verwendung von Achse und Winkel, wobei der Körper um die als Vektor angegebene Achse mit dem gegebenen Winkel gedreht wird. Diese Art der
Rotation ist im Grunde eine Vorstufe zur Quaternionen-Rotation. Die Darstellung von Achse und Winkel erfolgt über ein 4-Tupel bzw. einen 4-dimensionalen
Vektor: (x, y, z, α)T (vgl. [Ebe04b] S. 19f, 26).
6.2 Bestandteile von ODE
58
• Die Rotation mit Hilfe von Quaternionen geht noch einen Schritt weiter. Quaternionen fanden ihren Ursprung vor mehr als 150 Jahren in dem Bereich der
komplexen Zahlen, wobei eine genaue Erklärung hier Fehl am Platz ist. Die
Haupteigenschaft der Quaternionen ist ihre Repräsentation als vierdimensionaler Vektor, wie er bereits für die Achse-Winkel-Rotation verwendet wurde.
Der Unterschied zu der oben erwähnten Methode ist, dass Quaternionen normalisiert werden und untereinander interpoliert werden können (vgl. [Ebe04a]
S. 1ff, [Ebe04b] S. 21ff).
Die geometrische Beschreibung eines Körpers wird durch ein Objekt der Klasse
Geom definiert. Diese geometrische Beschreibung ist notwendig, um z.B. mögliche
Kollisionen zu berechnen, was auch im entsprechenden Abschnitt (6.2.4) beschrieben wird.
Um Körper in Bewegung zu versetzen, ist es möglich, sie Kräften oder Drehimpulsen auszusetzen. Im Falle von Fahrzeugen oder Kreaturen wird allerdings von
dieser Art der Bewegung abgeraten. Dort sollen sogenannte Motoren eingesetzt
werden, die die Gelenke oder Räder in Bewegung versetzen. Hierzu aber mehr im
nächsten Abschnitt (vgl. [Smi04] S. 5f, 19ff, [DS04] S. 10ff).
6.2.3 Joint
Um jeweils zwei Körper miteinander zu verbinden verwendet ODE Gelenke (joints).
Es wird zwischen 7 verschiedenen Gelenktypen unterschieden:
1. Das Kugelgelenk (ball and socket joint) dient zur Verbindung zweier Körper ohne Einschränkung der Freiheitsgrade. Die Position des Gelenks wird
durch seine Ankerkoordinaten festgelegt (siehe auch Abbildung 6.1).
Abbildung 6.1. Kugelgelenk (Quelle:[Smi04] S. 28)
2. Das Achsen- oder Scharniergelenk (hingejoint) besitzt nur einen Freiheitsgrad, der sich auf eine Achse bezieht. Der Vektor, mit dem diese Achse beschrieben wird, kann vom Benutzer festgelegt werden. Abbildung 6.2 zeigt ein
Scharniergelenk mit senkrechter Achse. Die Bewegungsfreiheit der Achse kann
auch eingeschränkt werden, indem Start- und Stopp-Parameter angegeben werden. Diese liegen im Bereich −π bis +π und decken damit die möglichen 360◦
ab.
6.2 Bestandteile von ODE
59
Abbildung 6.2. Achsengelenk (Quelle:[Smi04], S. 29)
3. Die Radaufhängung (hinge2joint) ist prädestiniert für die Simulation von
Fahrzeugen. Sie besteht im Grunde aus zwei hintereinander agierenden Achsengelenken (siehe Abbildung 6.3). Bei der Radaufhängung kann allerdings nur
die erste Achse durch Start- und Stopp-Parameter eingeschränkt werden, die
zweite ist für den Antrieb eines Rads gedacht und kann deshalb immer unbegrenzt gedreht werden.
Abbildung 6.3. Radaufhängung (Quelle:[Smi04] S. 32)
4. Eine Schiebeverbindung (sliderjoint) kann zur Simulation von Kolben oder
ähnlichem verwendet werden. Auch hier wird, wie in Abbildung 6.4 gezeigt,
eine Achse verwendet, um welche die Schiebeverbindung gedreht als auch hin
und her geschoben werden kann. Auch hier können die Grenzen der Verbindung
eingestellt werden.
5. Das Universalgelenk (universaljoint) bietet die meisten Bewegungsfreiräume
neben dem Kugelgelenk. Es besteht aus zwei zueinander senkrechten Achsen,
die beide eingeschränkt werden können (siehe Abbildung 6.5).
6. Eine einfache Verbindung (fixedjoint) zwischen zwei Körpern fixiert diese
aneinander. Da dadurch im Grunde ein neuer einzelner Körper entsteht, ist es
sinnvoller diesen Körper komplett zu definieren, damit das System nicht mit
zu vielen Gelenken rechnen muss.
6.2 Bestandteile von ODE
60
Abbildung 6.4. Schiebeverbindung (Quelle:[Smi04] S. 30)
Abbildung 6.5. Universalgelenk (Quelle:[Smi04] S. 30)
7. Kontaktverbindungen (contactjoint) sind Ausnahmefälle in ODE. Sie werden nicht vom Benutzer erzeugt, sondern während der Simulation bei einer
Kollision, um diese besser beschreiben zu können und evtl. von der Anwendung angepasst zu werden. So können z.B. Reibung, Kräfte, Elastizität oder
der ERP (Error Reduction Parameter) einer Kollision definiert werden (siehe
Abbildung 6.6).
Die Bewegung dieser Gelenke sollte nicht über direkte Kraft- oder Impulseinwirkung erfolgen. Im Gegensatz dazu ist es möglich, die Achsen eines Gelenks jeweils
mit einem sogenannten Motor zu bewegen (siehe Abbildung 6.7).
Die Bewegung wird durch Festlegen einer Geschwindigkeit, mit der sich der Motor drehen soll und der maximal aufzuwendenden Kraft, die eingesetzt werden soll,
um diese Geschwindigkeit zu erreichen, erzeugt. Es ist auch denkbar, Servolenkungen oder -motoren zu simulieren, indem diese Kraft vorher festgelegt wird, was ein
gängiges Verfahren ist. Sollten die Begrenzungen der Gelenke erreicht werden, ist
es für den Motor nicht möglich, das Gelenk über diese Grenzen hinaus zu bewegen.
Zusätzlich können Gelenke in jointgroups verwaltet werden. Diese Gelenkgruppen werden von ODE gezielt bei Kollisionen eingesetzt, damit die Kontaktverbindungen, die in einem Schritt erzeugt werden, gemeinsam gelöscht werden
6.2 Bestandteile von ODE
61
Abbildung 6.6. Kontaktverbindung (Quelle:[Smi04] S. 33)
Abbildung 6.7. Gelenkmotor (Quelle:[Smi04] S. 36)
können. Allgemein lässt sich sagen, dass die Gruppierung von Gelenken vor allem
beim späteren Entfernen von Vorteil ist (vgl. [Smi04] S. 25ff, [DS04] S. 13ff).
6.2.4 Collision Detection
Die geometrische Welt von ODE beschäftigt sich im Wesentlichen mit der Kollisionsabfrage, also der Berechnung, welche Körper sich wann, wo, wie stark berühren
und wie sich diese Kollision auf diese Körper auswirken.
geoms beschreiben das geometrische Aussehen eines Körpers. Neben selbstdefinierten Dreiecks-Netz-Beschreibungen von Geometrien, wie sie häufig in der
3D-Programmierung Verwendung finden, bietet ODE bereits einige Körper, wie
Kugeln, Ebenen oder Quader, an. Mit Hilfe der geometrischen Beschreibung der
Körper ist es letztendlich möglich, zu berechnen, ob es zu Kollisionen kommt oder
nicht.
ODE verwendet Räume“ (spaces), um die Laufzeit der Kollisionsabfrage zu
”
reduzieren. Bei einer Welt bestehend aus N einzelnen Körpern würde die Überprüfung, welche dieser N Körper sich berühren, eine Laufzeit von O(N 2 ) in Anspruch
nehmen. Diese Laufzeit kann durch die Verteilung von Objekten, die sich nicht be-
6.3 ODE in der Praxis
62
einflussen können, in unterschiedliche Räume“ verringert werden. Es werden dann
”
nur noch die Körper gegeneinander geprüft, die sich in einem Raum“ befinden.
”
Alternativ zu den Räumen können Körper Kollisionsgruppen zugeteilt werden,
indem ihnen eine Gruppennummer übergeben wird. Anschließend kann bestimmt
werden, welche Gruppen miteinander kollidieren können und welche nicht.
Im Falle einer Kollision erzeugt das Kollisionsabfrage-System eine Kontaktverbindung, die damit eine Brücke zwischen der physikalischen und geometrischen
Welt bildet (vgl. [Smi04] S. 51ff, [DS04] S. 23ff).
6.2.5 Gesamtsystem
Abbildung 6.8 zeigt das Gesamtsystem von ODE. In der Abbildung wird vor allem
die Verbindung der physikalischen und der geometrischen Welt durch die geometrische Beschreibung (geoms) und die Kontaktverbindungen deutlich (vgl. [DS04]
S. 37ff).
World
Physikalische
Welt
Geometrische
Welt
enthält
Joint
Joint
Joint
enthält
Body
Joint
Joint
verbindet zwei
fasst
mehrere
zusammen
JointGroup
Joint
Space
beschreibt Form
Geom
Joint
Joint
prüft auf
Kollisionen
verbindet
kollidierende
ContactJoint
Joint
Joint
erzeugt
Collision
Abbildung 6.8. ODE Gesamtsystem (Quelle:[DS04] S. 37)
6.3 ODE in der Praxis
Einer der wenigen Kritikpunkte, die dem System vorgeworfen werden können, ist,
dass es keine Einheiten verwendet. Smith rät sogar dazu, Längen und Massewerte
um den Wert 1 zu verwenden. Das ist auch ein Grund, warum ODE nicht unbedingt für Ingenieure geeignet ist. Genau genommen verwendet ODE MKS (Meter,
Kilogramm, Sekunde) als Einheiten, die aber nirgends beschrieben bzw. verfeinert
werden können. Da sich ODE auf einfache physikalische Simulationen spezialisiert
hat, dürften die Angaben in MKS ausreichen. ODE greift bei der Repräsentation
der Zahlenwerte auf den Datentyp FLOAT zurück, was einen Wertebereich von
10−38 bis 1038 ermöglicht.
6.3 ODE in der Praxis
63
Der Benutzer von ODE muss entscheiden, ob seine Anwendung mehr Wert auf
Geschwindigkeit, Stabilität oder auf Genauigkeit legen soll. Die Genauigkeit und
damit die Stabilität kann durch Einstellungen wie dem ERP oder dem CFM, aber
auch durch den Verzicht auf direkte Krafteinwirkung gewahrt werden. Genauigkeit
und Geschwindigkeit stehen häufig in gegenseitigem Konflikt und es gilt, einen
zufriedenstellenden Kompromiss zu finden, bei dem keiner der beiden Faktoren
negativ aus dem Ruder läuft. Um die Geschwindigkeit ohne Genauigkeitsverlust
zu erhöhen, lohnt eine Laufzeitabschätzung, die Smith für eine Gruppe von
• m1 Gelenken mit
• m2 Freiheitsgraden und
• n Körpern
pro Zeitschritt aufgestellt hat. Diese verhält sich ungefähr proportional zu:
O(m1 ) + O(m32 ) + O(n).
Daraus ergibt sich, dass eine Reduzierung der Gelenke bzw. Verbindungen, die auch
bei Kollisionen verwendet werden, als auch eine Verringerung der Freiheitsgrade
nützlich zur Verbesserung der Laufzeit wäre, ohne die Genauigkeit zu beeinflussen.
Aus diesem Grund ist eine Anforderung einer der nächsten Versionen von ODE,
Freiheitsgrade, die in einem Simulationsschritt nicht verändert werden, nicht in die
Berechnungen einzubeziehen (vgl. [Smi04] S. 73ff, [DS04] S. 39).
7
Java3D
Java3D ist eine High-Level-API zum Umgang mit dreidimensionalen Welten. Dabei
ist es zunächst egal, welche Low-Level-API zur tatsächlichen Darstellung verwendet wird. Die Auswahl besteht zwischen Open GL oder DirectX. In beiden Fällen
greift Java3D auf native Funktionen zu. Deshalb ist Java3D auch nicht wirklich
plattformunabhängig einsetzbar, sondern muss in jedem Betriebssystem separat
installiert werden.
Das Spektrum von Java3D reicht von der Darstellung und Interaktion dreidimensionaler Grafiken über die Erzeugung und Bearbeitung dreidimensionaler
Geometrie und deren Rendern bis hin zur Animation der vorliegenden Grafiken.
Damit deckt Java3D alle grundlegenden Bereiche ab, die für eine dreidimensionale Repräsentation nötig sind, zumal es die Möglichkeit gibt, gängige 3D-Formate
wie z.B. VRML einzulesen und darzustellen (vgl. [CS04] S. 4f, [Bou99] S. 1-1ff).
7.1 Der Java3D-Szenengraph
Alle Elemente, die in einer von Java3D dargestellten Welt zusammen kommen,
werden in einer Baumstruktur verwaltet, dem sogenannten Szenengraphen (scene
graph). Elemente, die zur Bildung dieser Struktur eingesetzt werden können, sind:
•
•
•
•
•
•
Geometrie visueller Objekte
Sound
Licht
Position
Orientierung
Aussehen
Auf einige dieser Elemente wird in diesem Kapitel noch näher eingegangen.
Die Ordnung in einer Baumstruktur verlangt, dass jedes Element höchstens
einen Elternknoten besitzt. Diese Einschränkung kann allerdings durch eine Referenzierung zweier Knoten untereinander, die keine Vater-Kind-Beziehung besitzen,
abgeschwächt werden.
Mögliche Elemente des Szenengraphen werden in Abbildung 7.1 dargestellt:
7.1 Der Java3D-Szenengraph
65
Nodes and NodeComponents (object)
Arcs (object relationships)
Virtual Universe
parent-child link
Locale
reference
Group
Leaf
NodeComponent
other objects
Abbildung 7.1. Elemente eines Szenengraphen (Quelle: [Bou99] S. 1-4)
Virtual Universe Die Wurzel des Szenengraphen bildet das VirtualUniverse.
Dieses Element ist vergleichbar mit der World in ODE. Theoretisch ist es möglich mehrere Universen in einer Java3D-Anwendung zu verwenden. Da eine
Kommunikation zwischen diesen Universen von Java3D nicht unterstützt wird,
wird von dieser Möglichkeit abgeraten.
Locale Die eigentliche 3D-Szene geht von dem Locale-Element aus. In der Regel
ist ein Objekt dieses Typs ausreichend, denn durch die Baumstruktur können
von ihm aus alle weiteren benötigten Elemente angehängt werden.
Group Bei dem Element Group handelt es sich um einen Teilbaum, in welchem
die unterschiedlichsten Informationen abgelegt werden können. Ein wichtiger
Vertreter des Group-Elements ist die BranchGroup, die Elemente wie die eigentlichen geometrischen Inhalte oder deren TransformGroups, beinhalten können.
TransformGroups regeln die Positionierung und Orientierung der visuellen Objekte oder der Ansicht des Betrachters auf die vorliegende Szene.
Leaf Am Ende der Hierarchie in einer Baumstruktur stehen die Blattknoten, die
Leaf-Elemente. Vertreter dieses Elementtyps sind die 3D-Objekte, die dargestellt werden sollen oder die Viewplatform, die für die Darstellung der Szene
verantwortlich ist.
NodeComponent Appearance oder Geometry, leiten sich von der Klasse
NodeComponent ab und sind verantwortlich für die Darstellung bzw. die Geometrie der 3D-Objekte. Da die 3D-Objekte schon am Ende der Hierarchie im
Baum stehen, können NodeComponents nur von ihnen referenziert werden.
Ein NodeComponent ist folglich nur eine Erweiterung, eine Komponente eines
Baumknotens.
weitere Objekte Für die eigentliche Darstellung im Rahmen einer grafischen
Oberfläche sind noch weitere Objekte notwendig, die unter diese Rubrik fallen.
7.1 Der Java3D-Szenengraph
66
Die Verwendung dieser Elemente soll durch einen Beispiel-Szenengraphen, wie
er in Abbildung 7.2 zu sehen ist, verdeutlicht werden.
Virtual Universe
Locale
BG
Shape3D node
BG
BranchGroup Nodes
TG
TransformGroup Node
S
View
Appearence
Canvas3D
Screen3D
Geometry
View Platform
Node Components
Physical Body
Physical Environment
Abbildung 7.2. Beispiel-Szenengraph (Quelle:[Bou99] S. 1-5)
Der rechte Teilbaum dieses Beispielgraphen muss nicht explizit vom Entwickler definiert werden. Eine grosse Hilfestellung der Java3D-API ist die Klasse
SimpleUniverse, die diese Arbeit übernimmt. Bei Bedarf können die von SimpleUniverse übernommen Aufgaben, wie das Festlegen der Ansichtsposition, hinterher
noch nach Bedarf angepasst werden.
Ein Szenengraph lässt sich damit in wenigen Schritten erstellen:
1.
2.
3.
4.
5.
Erzeugen eines Canvas 3D-Objekts
Erzeugen eines SimpleUniverse-Objekts, optional dessen Konfiguration
Konstruktion des Inhalts-Teilbaums
Kompilieren des Inhalts-Teilbaums zu einer BranchGroup
Hinzufügen der Inhalts-BranchGroup zu Locale-Objekt
Unter Berücksichtung dieses einfachen Rezepts“ ist die Erstellung von attrak”
tiven Szenen mit Java3D sehr einfach (vgl. [Bou99] S. 1-1ff [CS04] S. 9ff).
Der schwierigste Part stellt die Erzeugung der 3D-Objekte dar. Für dieses Problem stellt Java3D drei Lösungen bereit. Erste einfache Gebilde können durch eine
Kombination der in der Java3D-API angebotenen Formen Kugel, Kegel, Box oder
Zylinder erschaffen werden.
Eine weitere Möglichkeit, die den Benutzer nicht mehr auf diese einfachen Formen einschränkt, ist die Verwendung einer geometrischen Beschreibung der Objekte in Form von Arrays. Diese Beschreibung kann entweder durch Linien oder Punkte oder durch geschlossene Polygonzüge erfolgen. Bei den Polygonen beschränkt
7.2 Interaktion in Java 3D
67
man sich auf Drei- oder Vierecke. Abbildung 7.3 zeigt für jede dieser Möglichkeiten
ein Beispiel.
v0
v1
v2
v4
v3
PointArray
v0
v5
v1
v2
v4
v3
v0
v5
LineArray
v1
v2
v0
v4
v3
v5
TriangleArray
v3
v1
v2
QuadArray
Abbildung 7.3. Geometrien (Quelle:[Bou99] S. 2-26)
Die letzte und einfachste Möglichkeit, statt dem mühsamen eigenständigen
Berechnen der Gitternetzdaten, ist die Verwendung eines 3D-Modellierungs-Programms. Für die Dateiformate vieler gängiger Programme sind sogenannte Loader
für die Java3D-API im Internet zu finden. Diese lesen die in der Modelierungssoftware erstellten Projekte ein und wandeln sie in Java-Objekte um. Die derzeitige
Unterstützung reicht von VRML, dem offiziellen Standard für die Beschreibung
dreidimensionaler Szenen, über Lightwave bis hin zu 3D-Studio Max. Zusätzlich
zu der Festlegung von Körpern bietet Java3D die Möglichkeit, sowohl zwei- als
auch dreidimensionalen Text in die Szenen einzubinden (vgl. [Bou99] S. 2-1ff, 31ff, [CS04] S. 18ff).
Da dreidimensionale Szenen häufig den Anspruch erheben, besonders realistisch
zu wirken, sollte das Aussehen der dreidimensionalen Objekte entsprechend angepasst werden können. Java3D bietet hierzu alle gängigen Methoden. Dabei spielt
der Einsatz von reellen Licht- und Materialeffekten als auch von Texturen eine
wesentliche Rolle. Materialien bestimmen im Wesentlichen, wie sich ein Körper
mit dem vorhandenen Licht in seiner Umgebung verhält: reflektiert er das Licht,
spiegelt sich die Umgebung in ihm? Texturen sind Grafiken, die auf 3D-Objekte
projiziert werden. Dies geschieht je nach Einstellung kachelartig oder die Grafik
wird so verformt“, dass sie das gewählte Objekte komplett einschließt (vgl. [Bou99]
”
S. 6-1ff, 7-1ff, [CS04] S. 62ff).
7.2 Interaktion in Java 3D
In Java 3D wird zwischen Interaktion und Animation unterschieden. Interaktion
beschreibt einen Bildwechsel“ durch eine Aktion des Benutzers. Bei einer Ani”
mation hingegen wird ein solcher Bildwechsel in der Regel durch eine zeitliche
Veränderung ausgelöst.
Beide, sowohl Interaktion als auch Animation, greifen auf das Behavior-Konzept
von Java 3D zurück. Behaviors bieten die Möglichkeit, Eigenschaften des Szenengraphen zu verändern, wobei sie selbst Teil des Graphen sind, denn die Klasse
Behavior ist eine Erweiterung der Klasse Leaf.
Obwohl Java3D nichts mit neuronalen Netzen zu tun hat - hier sei dahingestellt,
ob es sich um natürliche oder künstliche neuronale Netze handelt - bilden die
7.2 Interaktion in Java 3D
68
Behaviors eine Gemeinsamkeit mit ihnen. Ein Behavior lässt sich mit einem Reflex
vergleichen, der bei einem bestimmten Stimulus eine bestimmte Aktion hervorruft.
Mögliche Stimuli von Behaviors sind:
•
•
•
•
Aktionen des Benutzers, z.B. Maus- oder Tastatureingaben
Kollisionen von Objekten
abgelaufene Zeit
Änderung der Ansicht (View Location)
Behaviors verfolgen ein einfaches Konzept, sind dafür aber ein mächtiges Werkzeug, das dem Benutzer bzw. Programmier nahezu alle Möglichkeiten offen lässt.
Sie können verwendet werden, um die Ansicht zu verändern, um z.B. dem Benutzer
immer die beste Sicht zu gewähren oder ihn durch die Szene zu führen oder steuern zu lassen, es können Kollisionsbehandlungen realisiert, Fahrzeuge angesteuert
werden und vieles mehr.
Animationen können in Java3D ebenfalls mit Behaviors realisiert werden. Das
vereinfacht die Arbeit des Java3D-Programmierers ungemein. Er kann damit ein
schon bekanntes Konzept für eine gänzlich andere Aufgabe verwenden. Für Animationen stellt Java3D verschiedene Interpolatoren zur Verfügung, die die Klasse
Behavior bzw. die daraus abgeleitete Klasse Interpolator erweitern. Interpolatoren können dazu verwendet werden, Farbe, Größe, Position oder weitere Eigenschaften von Knoten des Szenengraphen zu verändern. Der hierzu benötigte
Stimulus wird durch die Zeit ausgelöst. Diese zeitlich bedingten Änderungen werden über Alpha-Objekte angesteuert, die die Höhe der Wertänderung und den
dafür vorgesehenen zeitlichen Abstand festlegen. Die Änderung der Werte kann,
wie aus Abbildung 7.4 ersichtlich wird, steigend, fallend oder oszillierend erfolgen.
Abbildung 7.4. Beispiele für steigende, fallende oder unbestimmter Wellenformen
eines Alpha-Objekts (Quelle:[Bou99] S. 5-4)
Eine Änderung der Geometrie, die Morphing genannt wird, ist ebenfalls mit
Java3D möglich. Diese Art der Animation ist sehr beliebt und erlaubt dem Anwender z.B. einen Würfel zu einer Pyramide zu verformen (vgl. [Bou99] S. 5-1ff,
[CS04] S. 54ff).
7.4 Java3D und ODE
69
7.3 Vektormathematik
Ein wichtiger Bestandteil der Java3D-Bibliothek ist das package javax.vecmath.
Hier finden sich viele nützliche Klassen, um Berechnung an und mit Vektoren
durchzuführen, die in der 3D-Programmierung unerlässlich sind.
Die Klassen decken vor allem zwei- und dreidimensionale Vektoren aller primitiver Datentypen (float, double, int) ab und darüber hinaus Vektoren beliebiger
Größe. Auf diesen Vektoren lassen sich Operationen wie Skalierung, Multiplikation,
Normalisierung oder Längenberechnung durchführen.
Neben einfachen Vektoren werden zusätzliche Konstrukte wie Quaternionen,
Achse-Winkel-Darstellung (siehe Unterabschnitt 6.2.2) und Matrizen angeboten,
auf denen die dafür üblichen Operatoren durchgeführt werden können, so z.B.
Matrix-Rotationen, -Transformation, -Negation oder Normalisierung.
Auch odejava, das Bindeglied zwischen der C-Bibliothek ODE und Java, der
Name verrät es bereits, greift auf dieses Paket zurück (vgl. [Bou99] S. 2-15ff, [CS04]
S. 38f).
7.4 Java3D und ODE
Im vorangegangenen Kapitel wurde odejava, die Verbindung zwischen ODE und
Java bereits erwähnt. Dabei handelt es sich um eine Bibliothek, die alle ODEElemente, wie z.B. world oder joint, in entsprechende Java-Klassen packt. Die
Definition einer Simulationsumgebung wird damit äußerst intuitiv und komfortabel. Möglich wird dies durch den Einsatz des Java Native Interfaces (JNI), mit dem
sich native, also plattformspezifische Funktionen aufrufen lassen. Unter Windows
erfolgt dies durch die Einbindung einer DLL (Dynamic Linked Library) und eines
SO (Shared Object) unter Unix/Linux.
Mit diesem Schritt können die physikalische Simulation, deren Berechnungen
und Ergebnisse bereits in Java erfasst werden. Die Darstellung steht demnach
immer noch aus. Da sich dieses Kapitel mit Java3D befasst, liegt es nahe, die Darstellung auch unter Verwendung eben dieser Schnittstelle zu erzeugen. Dies wird
durch zusätzliche Klassen von odejava möglich, die die Objekte der physikalischen
Simulation in den Baum des Szenengraphen einbinden, wobei die geometrische Beschreibung der Körper aus ODE zur Darstellung in Java3D verwendet wird. Diese
geometrischen Beschreibungen werden in TransformGroups aus der Java3D-API
verwaltet und sind damit Teil des Szenengraphen. Das Aussehen dieser Objekte
kann bereits bei ihrer Einbindung festgelegt werden.
Auf diesem Weg sind alle Vorteile der einzelnen Bibliotheken uneingeschränkt
nutzbar. Neben der physikalischen Simulation, die von ODE übernommen wird,
ist es möglich die grafische Darstellung mit Java3D auszuschmücken, um z.B. Hintergrundgrafiken oder Beleuchtung festzulegen.
8
Entwurf
In diesem Kapitel wird der Entwurf des implementierten Systems vorgestellt. Dieser untergliedert sich in die drei Bestandteile: Kreaturen, Simulationsumgebung
und Lernalgorithmen.
8.1 Kreaturen
Die Spezifikation der künstlichen Lebewesen, die im Folgenden als Kreaturen bezeichnet werden, muss folgende Punkte berücksichtigen:
• Es wird eine genetische Beschreibung der Kreaturen benötigt, auf die ein genetischer Algorithmus angewendet werden kann, um sie zu verändern.
• Aus dieser genetischen Beschreibung müssen Java-Objekte generiert werden,
die in die physikalische Simulation eingebunden werden können.
• Die Kreaturen müssen lernfähig sein.
8.1.1 Genetische Beschreibung der Kreaturen
Die genetische Beschreibung der Kreaturen liegt in Form einer Baumstruktur vor.
Die Knoten des Baums stellen die einzelnen Körperteile dar, die Verbindung zwischen ihnen symbolisieren die Gelenke. Einer der Hauptgründe für die Wahl dieser
Repräsentationsform ist die Möglichkeit, eine abgewandelte Form der genetischen
Programmierung zur Evolution der Kreaturen verwenden zu können.
Wichtige Informationen, die die Körperteile betreffen, sind:
• Position,
• Grösse/Ausmaße und
• Drehung.
Position und Grösse werden durch Vektoren beschrieben, die Beschreibung der
Drehung der Körper wird durch Quaternionen realisiert.
Wichtige Informationen für die Definition der Gelenke sind:
• Gelenktyp,
• Lage der Drehachsen,
• Beschränkungen der Achsen und
8.1 Kreaturen
71
• die Positionen, an denen die beiden Körper miteinander verbunden werden.
Als Gelenktypen dienen die verschiedenen joints von ODE, wie Universal- oder
Scharniergelenk oder eine feste Verbindung. Die Lage bzw. die Ausrichtung der
Drehachsen wird durch einen Vektor repräsentiert, die Beschränkungen, also Startund Stoppwerte der Achsen, an denen das Gelenk nicht weiter gedreht werden kann,
sind durch Gleitkommazahlen festgelegt, die von −π bis +π reichen, um die angestrebten Winkel zu beschreiben. Die beiden Verbindungspunkte werden ebenfalls
durch Vektoren definiert. Diese Vektoren beschreiben die relative Ausrichtung eines Ankerpunktes, ausgehend vom Mittelpunkt des Körperteils. Das schränkt den
Wertebereich der Vektorwerte auf [−1, 1] ein, wobei einer der drei Vektorwerte −1
oder 1 sein muss, damit der Ankerpunkt nicht inmitten eines Körperteils liegt.
So beschreibt (−1, 0, 0)T beispielsweise den Ankerpunkt in der Mitte der linken
Seite eines Körperteils oder (0, 1, 1)T die obere, hintere Kante. Diese Art der Beschreibung wird für die beiden zu verbindenden Körperteile verwendet. Damit
die Körperteile nicht ineinander wachsen“, sich also überlappen, wird das in der
”
Baumhierarchie niedrigere Element so gedreht, dass sich die beiden Ankerpunkte
und die daran liegenden Seiten gegenüberstehen.
Als Speicherformat für die genetische Beschreibung wurde XML gewählt. Dies
hat mehrere Gründe. XML-Dateien bilden ebenfalls eine Baumstruktur, die damit äquivalent mit der genetischen Beschreibung der Kreaturen ist. Da XML ein
reines Textformat ist, können Kreaturen relativ einfach manuell erzeugt werden.
Zusätzlich wird XML sehr gut von Java unterstützt und kann schließlich von dem
vorliegenden System einfach eingelesen, manipuliert und gespeichert werden.
Da sich die genetische Beschreibung auf Knoten und Kanten reduziert, genügt es
vollkommen, auch nur diese beiden Elemente in XML abzubilden. Die Knoten werden durch das <segment>-Element, die Kanten durch das <connection>-Element
beschrieben. Die genaue Schema-Definition der XML-Spezifikation findet sich in
Kapitel 9.
Aus dieser XML-Beschreibung lassen sich schließlich Java-Objekte erzeugen.
Wobei für jedes XML-Element eine entsprechende Klasse existiert (Segment bzw.
Connection). Um diese Umwandlung durchzuführen, wäre es theoretisch möglich, ein Data-Binding-Framework einzusetzen (vgl. [McL02] S. 431ff). Auf diesen Schritt wurde in dieser Arbeit allerdings verzichtet. Statt dessen erfolgt die
XML-Erzeugung über eine String-Konvertierung der einzelnen Knoten und ihren
Verbindungen. Hierbei wird, ausgehend vom Wurzelknoten, für jeden Knoten und
jede Verbindung das entsprechende XML-Element erzeugt und abschließend in eine
Datei gespeichert. Anders als bei realen Lebewesen, die über einen größeren Chromosomensatz verfügen, beschränkt sich das Erbgut dieser Kreaturen auf nur ein
einziges Chromosom, in dem alle Informationen enthalten sind, die das Aussehen
einer Kreatur bestimmen. Das Laden eines solchen Chromosoms über eine XMLDatei geschieht über den umgekehrten Weg. Über das Document Object Model
(DOM) wird der XML-Baum eingelesen und aus den einzelnen Elementen werden
die entsprechenden Objekte erzeugt. In Abbildung 8.1 wird die Klassenstruktur
eines Chromosoms deutlich.
8.1 Kreaturen
72
evita.creature
Chromosom
javax.vecmath
Connection
Segment
1
*
-type: int
-highStop1: float
-highStop2: float
-lowStop1: float
-lowStop2: float
axis1
axis2
anchor
Vector3f
+x: float
+y: float
+z: float
position
dimension
anchor
Quat4f
+x: float
+y: float
+z: float
+w: float
rotation
Abbildung 8.1. UML-Beschreibung der Chromosomen
8.1.2 Kreatur-Objekte
Aus den oben beschriebenen Chromosomen können im Folgenden Java-Objekte
der Kreaturen aufgebaut werden. Dies geschieht durch die Klasse Creature, deren
Aufbau stark an die Arbeit mit ODE optimiert ist.
Zur Erzeugung einer Kreatur genügt ein Chromosom, das dem Konstruktor der
Klasse übergeben wird, und ein Name, um die Kreatur von anderen unterscheiden
zu können. Die Kreatur selbst verzichtet auf eine Baumstruktur zur Verwaltung
der Körperteile und Gelenke. Statt dessen werden diese in einfachen Listen organisiert. Der Grund für diesen Schritt liegt in der Arbeitsweise von ODE, das
Körperteile (Body-Objekte) und Gelenke (Joint-Objekte) ebenfalls in Listen verwaltet. Dadurch wird eine spätere Konvertierung vereinfacht.
Die Methode, mit der eine Kreatur denkt“ und handelt, ist nicht im Chromo”
som verankert. Das Chromosom bestimmt lediglich das Aussehen einer Kreatur.
Das Gehirn“, repräsentiert durch die Klasse Brain, wird der Kreatur nach ihrer
”
Erzeugung eingepflanzt“. Das Gehirn lenkt die Kreatur. Es dient damit im Grun”
de als eine Art Steuerung, die die Bewegungen reguliert. Der Unterabschnitt 8.1.4
beschreibt das genaue Vorgehen des Denkens“. Abbildung 8.2 beschreibt den ob”
jektorientierten Entwurf der Kreatur und der damit verbundenen Klassen.
8.1.3 Einbinden in die physikalische Simulation
Die Kreaturen besitzen ausreichende Eigenschaften, um sie physikalisch zu beschreiben. Daher stellt die Einbindung in die physikalische Simulation, die durch
ODE gesteuert wird, kein großes Problem dar. Diese Integration benötigt folgende
Schritte:
8.1 Kreaturen
73
evita.creature
org.odejava
Creature
Body
Joint
*
CreatureJoint
*
Chromosom
Brain
CreatureBody
+think(sensorInput: float[]): float[]
Body1
Body2
-highStop1: float
-highStop2: float
-lowStop1: float
-lowStop2: float
axis1
axis2
anchor
javax.vecmath
Vector3f
+x: float
+y: float
+z: float
position
dimension
Quat4f
+x: float
+y: float
+z: float
+w: float
rotation
Abbildung 8.2. UML-Beschreibung der Kreaturen
1. Jedes Körperteil wird in der Simulation durch ein Body-Objekt repräsentiert.
2. Jedes Gelenk wird durch ein Joint beschrieben.
3. Die Masse m wird rückführend aus Volumen V = l∗b∗h und Dichte % errechnet.
kg
Die Dichte ist konstant 500 m
3 und entspricht somit ungefähr der Dichte von
Holz. Damit berechnet sich die Masse eines Körperteils:
m = % ∗ V = 500 ∗ (l ∗ b ∗ h)
wobei der Masseschwerpunkt der Position des entsprechenden Körperteils entspricht.
Die für die Einbindung einer Kreatur benötigten Klassen sind in Abbildung 8.3
abgebildet. Hervorzuheben sind dabei die Klassen World und Space, in denen die
eigentliche Simulation stattfindet, sowie die Klassen Body und Joint, mit denen die
Kreaturen simuliert werden. Die Klasse OdeBinder erzeugt diese Objekte anhand
der Beschreibung der Kreaturen. Die genaue Vorgehensweise dieser Aufgabe wird
in Abschnitt 9.2 beschrieben.
Abbildung 8.4 stellt den Weg von der XML-Spezifikation der Chromosomen zur
ODE-Repräsentation grafisch dar.
8.1.4 Bewegung und Denken
Die Bewegung der Kreaturen entsteht durch Ausüben einer Kraft auf die einzelnen
Gelenke. Dabei werden, wie im Kapitel 6 beschrieben, keine direkten Krafteinwirkungen, sondern Motoren verwendet. Motoren benötigen zwei Werte, um Bewegung zu erzeugen:
1. eine Geschwindigkeit, mit der der Motor bewegt werden soll und
2. die dazu maximal aufzuwendende Kraft.
8.1 Kreaturen
74
org.odejava
World
Space
Body
evita.ode
Joint
evita.creature
OdeWorld
CreatureBody
+step()
+addCreature(c: Creature)
CreatureJoint
*
*
1
OdeBinder
+bind(w: World, s: Space, c: Creature)
*
Creature
Abbildung 8.3. Klassenübersicht für das ODE-Binding
<segment>
<anchor x="0.0" y="-1.0" z="0.0"/>
<dimension x="1.0" y="1.5" z="0.5"/>
<position x="0.0" y="0.0" z="0.0"/>
<quaternion w="1.0" x="0.0" y="0.0" z="0.0"/>
<connection>...</connection>
</segment>
<connection>
<type>3</type>
<highstop1>1.570796</highstop1>
<highstop2>1.570796</highstop2>
<lowstop1>-1.570796</lowstop1>
<lowstop2>-1.570796</lowstop2>
<axis1 x="1.0" y="0.0" z="0.0"/>
<axis2 x="0.0" y="1.0" z="0.0"/>
<anchor x="1.0" y="0.0" z="0.0"/>
<segment>...</segment>
</connection>
Abbildung 8.4. Von XML nach ODE
Die Richtung der Bewegung wird durch die Geschwindigkeit bestimmt, da sich
diese im positiven als auch im negativen Bereich befinden kann.
Diese beiden Werte werden von sogenannten Effektoren an die physikalische
Simulation weitergegeben. Damit sind Effektoren mit Muskeln natürlicher Lebewesen vergleichbar, die sowohl Kraft als auch Geschwindigkeit festlegen. Für jeden
Freiheitsgrad eines Gelenks ist ein Effektor zuständig.
Im Gegenzug zu den Effektorwerten erhalten die Kreaturen Sensordaten von
der physikalischen Simulation. Diese Sensordaten sind so gesehen die Sinne einer
Kreatur. Sie informieren sie über:
• Winkelstellung und -rate jedes Freiheitsgrades eines Gelenks,
• Bodenkontakt eines Körperteils,
8.2 Die Simulationsumgebung Evita
75
• die Richtung der Kreatur und
• die lineare als auch die Winkelgeschwindigkeit.
Die Sensordaten werden normalisiert, sodass sie im Intervall [−1, 1] liegen. Dies
gilt sowohl für die Winkeldaten als auch für die Richtungs- und Geschwindigkeitsvektoren. Die Kontaktsensoren sind binär, denn ein Körperteil hat Bodenkontakt
oder nicht. Dies wird durch die Werte −1 (kein Bodenkontakt) und 1 beschrieben. Die Einschränkung des Wertebereichs der Sensoren liegt vornehmlich in der
Tatsache, dass zu Beginn dieser Arbeit viele Versuche mit neuronalen Netzen gemacht wurden, die, je nach Aktivierungsfunktion, Werte im Intervall [0, 1] bzw.
[−1, 1] verarbeiten können. Da die Aufgabe eines Netzes bzw. eines Gehirns darin besteht, die Geschwindigkeit eines Gelenkmotors zu bestimmen, und da mit
der Geschwindigkeit auch die Richtung bestimmt wird, werden positive als auch
negative Eingaben benötigt.
Die Sensor- und Effektordaten dienen somit dazu, eine Kommunikation zwischen der Kreatur und ihrer Umgebung zu gewährleisten. Um die eingegebenen
Sensordaten zu verarbeiten und mit entsprechenden Effektordaten darauf zu reagieren, benötigen die Kreaturen ein Gehirn“. Wie ein solches Gehirn arbeitet und
”
lernt, ist zunächst nicht festgelegt, sondern hängt von der Art der Implementierung ab. Hier können Konzepte wie genetische Programmierung, neuronale Netze
oder Fuzzy-Regler eingesetzt werden. Einzige Bedingung ist die Erweiterung der
abstrakten Klasse Brain, bei der die Methode
public abstract double[] think(double[] sensorData);
implementiert werden muss. Als Eingabe erhält diese Methode die von der physikalischen Umgebung abgelesenen Sensordaten. Die Ausgabe wird schließlich über
die Effektoren an die Umgebung wieder zurückgegeben.
8.2 Die Simulationsumgebung Evita
Evita steht für Evolution of intelligent threedimensional animats. Alternativ kann
es auch als E-vita verstanden werden, was einer Verbindung zwischen dem Buchstaben E für Elektronisch und dem lateinischen Wort vita für Leben entspricht.
Evita ist der Name des in dieser Arbeit erstellten Systems zur Simulation der oben
definierten künstlichen Lebewesen.
Damit wäre die erste Aufgabe der Simulationsumgebung bereits im Vorfeld
geklärt. Sie muss in der Lage sein, die Kreaturen einzulesen. Dies kann entweder
durch das Einlesen eines Chromosoms, also der genetischen Beschreibung (siehe
Unterabschnitt 8.1.1) oder durch das Laden einer serialisierten Kreatur erfolgen.
In einem weiteren Schritt werden die physikalische Umgebung erzeugt und deren Eigenschaften definiert. Dabei werden Schwerkraft, Simulationsgeschwindigkeit
und ähnliche Werte eingestellt. Damit der Benutzer diese Einstellungen selbst vor
dem Programmstart festlegen kann, besitzt er die Möglichkeit, diese in einer sogenannten Properties-Datei, die aus Schlüssel-Wert-Paaren aufgebaut ist, festzulegen
und sie dem System zu übergeben.
8.2 Die Simulationsumgebung Evita
76
Nach Erzeugung der physikalischen Umgebung und dem Einlesen oder Erzeugen
der Kreaturen werden diese in die physikalische Welt integriert. Dabei werden zu
allen Körperteilen einer Kreatur ODE-Bodies (siehe Unterabschnitt 6.2.2) und zu
allen Gelenken ODE-joints (siehe Unterabschnitt 6.2.3) erzeugt, auf die die Kreatur
referenziert und die die Kreatur fortan in der physikalischen Umgebung simulieren.
Letzte Aufgabe des Systems ist schließlich die Steuerung der Simulation. Die
Simulation wird schrittweise durchgeführt. Ein solcher Schritt umfasst eine bestimmte Anzahl von Iterationen, die berechnet werden. Wie hoch die Anzahl der
Iterationen pro Simulationsschritt ist, wird im Vorfeld, z.B. über die Properties,
festgelegt. Um sie zu berechnen, bekommt das System eine bestimmte Zeit zur Verfügung, die Schrittweite, die ebenfalls im Vorfeld festgelegt wird. Das System muss
nun diese einzelnen Schritte ansteuern. Hierzu wird ein Controller verwendet, der
dies übernimmt, wobei zwischen einem einfachen und einem 3D-Controller unterschieden wird. Der einfache Controller lässt schlicht nur die physikalische Simulation ablaufen, wo hingegen der 3D-Controller dazu verwendet wird, die Simulation
auch grafisch darzustellen. Neben der Darstellung ist die Geschwindigkeit der grösste Unterschied zwischen beiden Varianten. Die einfache Simulation wird nur durch
die Leistungsfähigkeit des eingesetzten Rechners eingeschränkt. Je schneller dieser
ist, desto schneller wird die Simulation beendet. Der 3D-Controller erlaubt nur 25
Schritte pro Sekunde, was auch der Anzahl Frames in einem Film entspricht, da
das menschliche Auge gar nicht mehr visuelle Veränderungen in dieser Zeit wahrnehmen kann. Welcher der beiden Controller verwendet werden soll, wird beim
Programmstart festgelegt.
Ein Simulationsschritt setzt sich aus folgenden Unterschritten zusammen:
1. Kollisionsabfrage und -behandlung. Hierbei wird geprüft, welche Körper sich
wo berühren und welche Kräfte dabei entstehen. Diese Berührungen werden
gespeichert und können zusätzlich noch einmal explizit abgefragt werden, was
zum Beispiel für die Erzeugung der Sensordaten wichtig ist, um festzustellen,
welche Körperteile Bodenberührung haben.
2. Die physikalischen Berechnungen werden durch die Methode step() oder
stepFast() der Klasse World durchführt. Die zweite Variante arbeitet schneller, ist aber eventuell ungenauer. Die Wahl der step-Methode kann ebenfalls im
Vorfeld festgelegt werden. In diesem Berechnungsschritt wird die vorher definierte Anzahl Iterationen durchgeführt, die die Auswirkungen der Bewegungen
und Kollisionen der Körper bestimmen.
3. Die Effektordaten werden neu berechnet. Hierzu wird die step()-Methode jeder
Kreatur, die sich in der Simulation befindet, aufgerufen. Diese Methode führt
erneut drei Schritte durch:
3.1 Ermitteln der Sensordaten. Dabei werden alle Daten, die eine Kreatur von
dem System erhalten kann, in einem Feld gesammelt. Zu diesen Sensordaten
zählen Richtung, Geschwindigkeiten, Winkelstellungen und -geschwindigkeiten als auch die Information, welche Körperteile den Boden berühren
und welche nicht.
8.3 Der Genetische Algorithmus
77
3.2 Mit der think()-Methode des Gehirns werden die Effektordaten berechnet.
Die Art der Berechnung ist dabei abhängig von der Implementierung der
Brain-Klasse.
3.3 Die Effektordaten werden dem System übermittelt, das daraus die Bewegungen im nächsten Simulationsschritt ermittelt.
4. Abschließend werden die CreatureBody-Objekte der Kreaturen, die die Körperteile beschreiben, mit den Informationen aus der physikalischen Umgebung
synchronisiert. Hierunter fallen Daten wie Position oder Rotation eines Körperteils.
Der 3D-Controller ist mit einem Behavior (siehe Abschnitt 7.2) realisiert worden. Dieser führt in jedem Frame der Szene einen Simulationsschritt durch.
8.3 Der Genetische Algorithmus
Zu Beginn dieser Arbeit sollte der genetische Algorithmus vornehmlich dazu verwendet werden, die Evolution der Morphologie der Kreaturen zu regeln. Doch nach
den ersten Versuchen wurde schnell klar, dass diese Technologie auch für das Erlernen der Bewegungen prädestiniert ist. In der Natur findet sich dieses Prinzip kaum
bis überhaupt nicht. Werden Verhaltensweisen doch eher erlernt anstatt vererbt.
Die Entscheidung, den genetischen Algorithmus auch für das Erlernen der Bewegungen einzusetzen, birgt allerdings nur wenige Schwierigkeiten, da die hierfür
verwendeten Kriterien wie Selektion und Fitnessberechnung in beiden Fällen gleich
behandelt werden können. Zudem kann die für die Bewegung berechnete Fitness
für den genetischen Algorithmus, der die Anatomie bestimmt, verwendet werden.
Einzig die Art der Chromosomenbeschreibung erfolgt auf unterschiedlichen Wegen.
Die Art der Chromosomeninterpretation der Gehirne“ der Kreaturen ist abhän”
gig von ihrer Implementierung und wird in Kapitel 10 näher erläutert. Für die
Veränderung der Anatomie mit Hilfe eines genetischen Algorithmus werden die
Chromosomen der Kreaturen verwendet; da diese in Form einer Baumstruktur
realisiert sind, können sie ohne weiteres mit dem Konzept der genetischen Programmierung (siehe Abschnitt 4.7) entwickelt werden, wodurch sich strukturelle
Änderungen ergeben. Bei der herkömmlichen genetischen Programmierung werden Programmteile oder mathematische Funktionen als Knoten interpretiert. In
diesem Fall stehen die Knoten für Beschreibungen der Anatomie. Der genetische
Austausch über Cross-over oder Mutationen können jedoch auf die gleiche Weise
gestaltet werden (siehe auch Abschnitt 10.3). Einziger Nachteil dieses Vorgehens,
ist eine längere Rechenzeit, die durch die Schachtelung der beiden genetischen
Algorithmen entsteht.
In beiden Fällen durchläuft der genetische Algorithmus eine bestimmte Populationsgrösse über mehrere Generationen hinweg. Die Startpopulation wird in beiden
Fällen zufällig generiert. Auf welche Weise dies geschieht, wird in Kapitel 10 beschrieben. Nach Ablauf einer Generation, in der für jedes Chromosom die Fitness
berechnet wird, die noch verfeinert werden kann (siehe Abschnitt 4.3), wird über
8.3 Der Genetische Algorithmus
78
ein Selektionsverfahren (siehe Abschnitt 4.4) bestimmt, welche Chromosomen zur
Bildung der nächsten Generation verwendet werden. Diese Folgegeneration besteht
dann zum Teil aus Rekombinationen und Mutationen der ausgewählten Individuen.
Um den genetischen Algorithmus durchzuführen, wird ein zusätzlicher Controller benötigt, der die Einstellungen des GAs verwaltet. Hierzu zählen:
•
•
•
•
Art der Selektion
Art der Fitnessberechnung
Anzahl Generationen
Populationsgröße.
In Abbildung 8.5 wird der zeitliche Ablauf eines genetischen Algorithmus beschrieben, mit dem sich ein Bewegungsablauf entwickeln soll. Nach Erzeugung
der initialen Population wird ein neuer Prozess gestartet, der für Simulation und
Evolution einer Generation verantwortlich ist. Dort wird für jedes Individuum eine neue Simulationsumgebung erzeugt; die durch die Selektion generierten und
gespeicherten Chromosomen, die den Gehirnaufbau beschreiben, werden geladen
und bestimmen das Verhalten einer Kreatur, die abschließend bewertet wird. Nach
Ablauf dieses Prozesses wird die Folgegeneration anhand der Bewertung der einzelnen Kreaturen erzeugt, wonach erneut ein Prozess gestartet wird, um diese neue
Generation zu testen und zu bewerten. Dieser Vorgang wird so oft wiederholt, wie
Generationen angesetzt sind.
Der Ablauf des genetischen Algorithmus zur Entwicklung des Körperbaus erfolgt auf die gleiche Weise. Für jedes Chromosom, das die Anatomie einer Kreatur
beschreibt, wird ein genetischer Algorithmus für das verwendete Gehirn gestartet. Die höchste gemessene Fitness dieses Algorithmus wird zur Bewertung des
Chromosoms verwendet.
8.3 Der Genetische Algorithmus
GeneticAlgorithm
79
GeneticAlgorithm
IO
geneticBrainTraining()
initial/next
generation
singleBrainGeneration()
new process
readChromosom()
new(chr)
new()
gensize x
new()
chr : Chromosom
c : Creature
:GAController
addCreature(c)
popsize x
start()
getFitness(c)
saveFitness()
process terminated
Abbildung 8.5. Ablauf eines GA zum Erlernen eines Bewegungsablaufs
9
Implementierung und Test
9.1 XML-Spezifikation
Die Wahl, die Chromosomen der Kreaturen in XML zu verwalten, fiel nicht schwer.
Sie bilden ebenso wie eine XML-Datei eine Baumstruktur. Zugleich ist es relativ
einfach, Chromosomen manuell zu erstellen und auch die Möglichkeiten, XML mit
Java verarbeiten zu können, tragen ihren Teil zu dieser Entscheidung bei.
Wegen des einfachen Aufbaus eines Baumes mit Knoten und Kanten genügt
es auch, nur diese beiden Elemente in XML abzubilden, wobei die wichtigsten
Informationen, um Körper- oder Gelenkeigenschaften zu beschreiben, in die XMLSpezifikation einfließen. Zur Spezifikation des XML-Formats wurde XML-Schema
verwendet, da diese Beschreibung nahezu identisch mit der Klassenbeschreibung
in Java ist. Die Definition der Knoten, die als Segmente bezeichnet werden, ergibt
sich in XML-Schema wie folgt:
< xs : complexType name =" segmentType " >
< xs : sequence >
< xs : element name =" anchor " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" dimension " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" position " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" quaternion " type =" quate rnionTyp e "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" connection " type =" conne ctionTyp e "
minOccurs ="0" maxOccurs =" unbounded "/ >
</ xs : sequence >
</ xs : complexType >
Für die Eigenschaften anchor, dimension und position wird ein vectorType
eingeführt, dessen Spezifikation wie folgt aussieht:
< xs : complexType name =" vectorType " >
< xs : attribute name =" x " type =" xs : float " use =" required "/ >
< xs : attribute name =" y " type =" xs : float " use =" required "/ >
< xs : attribute name =" z " type =" xs : float " use =" required "/ >
</ xs : complexType >
Die Rotation des Körperteils wird durch den Typ quaternionType beschrieben:
< xs : complexType
< xs : attribute
< xs : attribute
< xs : attribute
name =" quaternionTyp e " >
name =" w " type =" xs : float " use =" required "/ >
name =" x " type =" xs : float " use =" required "/ >
name =" y " type =" xs : float " use =" required "/ >
9.2 ODE-Binding
81
< xs : attribute name =" z " type =" xs : float " use =" required "/ >
</ xs : complexType >
Die Verbindungen zu den jeweiligen Kindknoten und die Beschreibung der Gelenke, die diese Verbindungen herstellen, wird durch den connectionType definiert:
< xs : complexType name =" connectionTyp e " >
< xs : sequence >
< xs : element name =" type " type =" xs : int "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" highstop1 " type =" xs : float "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" highstop2 " type =" xs : float "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" lowstop1 " type =" xs : float "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" lowstop2 " type =" xs : float "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" axis1 " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" axis2 " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" anchor " type =" vectorType "
minOccurs ="1" maxOccurs ="1"/ >
< xs : element name =" segment " type =" segmentType "
minOccurs ="1" maxOccurs ="1"/ >
</ xs : sequence >
</ xs : complexType >
Hier fällt auf, dass auch dieses Element Unterelemente des Typs segmentType
beinhalten kann, wodurch die Baumstruktur gewährleistet wird.
Mit Hilfe dieser Spezifikationen kann nun die gesamte Baumstruktur in XML
abgebildet werden. Das Wurzelelement chromosom definiert sich dann so:
< xs : element name =" chromosom " >
< xs : complexType >
< xs : sequence >
< xs : element name =" segment " type =" segmentType "/ >
</ xs : sequence >
</ xs : complexType >
</ xs : element >
9.2 ODE-Binding
Die Visualisierung der physikalischen Simulation in Java3D wird mit Hilfe der
odejava-Bibliothek ermöglicht. Diese wandelt nicht nur alle Konzepte der CBibliothek in Java-Klassen, sondern ermöglicht auch die Einbindung in Java3D.
Wie in Abschnitt 7.4 bereits beschrieben, werden alle geometrischen Objekte
aus ODE in entsprechende Java3D-Objekte gewandelt. Um diese in jedem Simulationsschritt zu synchronisieren, wird ein DisplayBin verwendet. Ein Objekt dieser
Klasse wird zunächst zur Erzeugung eines OdejavaToJava3D-Objekts verwendet:
DisplayBin boundObjects = new DisplayBin ();
OdejavaToJava3D odejavaToJ3D = new O de j av aT o Ja va 3D ( boundObjects );
Dies geschieht noch, bevor die Geometriedaten übertragen werden. Über das
OdejavaToJava3D-Objekt ist es möglich, die Darstellung der Geometrien festzulegen. Hierzu können eigene Appearence-Objekte angelegt werden, die das Aussehen
9.3 Videogenerierung
82
durch Texturen oder Materialien bestimmen. Anschließend wird die Transformgroup mit den Geometriedaten erzeugt:
odejavaToJ3D . c r e a t e T r a n s f o r m G r o u p s ( world . getGeoms ());
Mit dem Aufruf
J a v a 3 DD i s p l a y O b je c t . addToScene ( boundObjects , scene );
werden die Geometriedaten, die aus der ODE-Umgebung ermittelt wurden, in den
Java3d Szenengraphen eingebunden und im weiteren Verlauf synchron gehalten.
Die Synchronisierung geschieht über den Aufruf
boundObjects . updateAll ();
der nach jedem Simulationsschritt aufgerufen werden muss. Da die Steuerung der
3D-Ansicht über ein Behavior realisiert wird (siehe Abschnitt 8.2) und dieses
jeden Simulationsschritt der physikalischen Umgebung ansteuert, wird auch die
Aktualisierung der 3D-Objekte von dieser Klasse übernommen.
9.3 Videogenerierung
Die Aufnahme von Videos ist ein wichtiger Bestandteil dieser Arbeit. So können
Ergebnisse, ohne das komplette System zur Hand zu haben, verteilt und präsentiert werden. Jedoch ist die Erstellung von Videos weder in ODE noch in Java3D
vorgesehen. Besonders erstaunlich ist das Fehlen einer Schnittstelle zwischen Java3D und dem Java Media Framework JMF, die für diese Aufgabe angebracht
wäre.
Dieses Problem wurde letztendlich durch zwei Schritte gelöst:
1. Speichern der Einzelbilder einer 3D-Simulation und
2. Zusammenführen dieser Bilder zu einem kompletten Film.
Der zweite Schritt stellt das geringere Problem dar, da es viele frei verfügbare
Tools, wie z.B. JPEGVideo 1 gibt, die in der Lage sind, aus einer Liste von Bildern
einen Film zu generieren.
Um zunächst einmal die Einzelbilder der Simulation in Dateien zu speichern,
wird auf ein Konzept der Java3D-Bibliothek zurückgegriffen. Hier kommt ein
Behavior zum Einsatz, das in jedem Schritt das aktuelle Bild extrahiert. Ein solches Behavior, das in Abschnitt 7.2 vorgestellt wird, wird schon für die Steuerung
der 3D-Simulation verwendet, indem es in jedem Frame einen Simulationsschritt
anstößt. Das hier entwickelte ScreenshotBehavior reagiert mit der gleichen Taktrate.
Folgender Code führt die Extrahierung der Bildinformationen des Canvas3DObjekts der Simulation durch:
Gr aph icsC ont ext 3D ctx = c3d . g e t G r a p h i c s C o n t e x t 3 D ();
Raster ras = new Raster ( new Point3f ( -1.0 f , -1.0 f , -1.0 f ) ,
Raster . RASTER_COLOR , 0 , 0 , c3d . getWidth () , c3d . getHeight () ,
new ImageComponent2D ( Image Componen t . FORMAT_RGB ,
1
http://www.ndrw.co.uk
9.4 Realisierung des genetischen Algorithmus
83
new BufferedImage ( c3d . getWidth () , c3d . getHeight () ,
BufferedImage . TYPE_INT_RGB )) , null );
ctx . readRaster ( ras );
BufferedImage img = ras . getImage (). getImage ();
Um die Bildinformationen in ein BufferedImage-Objekt zu stecken, wird zunächst der Graphik-Kontext des Canvas3D-Objekts ausgelesen. Das Canvas3DObjekt ist Teil des Szenengraphen (siehe Abschnitt 7.1) und dient zur Darstellung
der Szene in einer grafischen Oberfläche. Diese Informationen werden auf ein Raster übertragen, das schließlich zur Generierung des Bildes verwendet wird. Dieses
Bild lässt sich nun in eine Datei speichern.
Der Name der Bilder, der Pfad, in dem diese gespeichert werden und ob überhaupt Screenshots in dem aktuellen Ablauf erzeugt werden sollen, werden vom
Benutzer in der verwendeten Properties-Datei festgelegt. Einziger Nachteil dieser
Vorgehensweise ist ein riesiger Geschwindigkeitsverlust, denn die Videogenerierung ist aufgrund des erhöhten Rechenaufwands nicht echtzeitfähig. Der Versuch,
Programme zu verwenden, die unmittelbar Videos eines gewählten Fensters aufnehmen, führte sogar zu noch schlechteren Ergebnissen, da hier nur noch ruckelige
Bruchstücke erfasst wurden.
9.4 Realisierung des genetischen Algorithmus
Die Implementierung des genetischen Algorithmus ist eine der grösseren Herausforderungen dieser Arbeit. Dabei ist ein Problem aufgetreten, das bei der normalen
Verwendung von ODE nicht berücksichtigt werden muss. Durch das mehrmalige Starten der ODE-Umgebung im Rahmen des genetischen Algorithmus, nämlich generationsize ∗ popsize-mal, kam es gehäuft zum Überlaufen der Auslagerungsdatei des Betriebssystems, was zum Abbruch des Programms geführt hat.
Trotz der Aufrufe des Garbage-Collectors oder der Methode Ode.dCloseOde(),
die zu einem Räumen des Speichers führen sollten, trat dieses Problem weiterhin
auf, und erst nach Ablauf des laufenden Prozesses wurde dieser Speicher wieder freigegeben. Das Problem wurde gelöst, indem jede Generation eines genetischen Algorithmus in einem neuen Prozess gestartet wurde. Nach Ablauf dieses mit
Runtime.getRuntime().exec() gestarteten Prozesses wurde die Auslagerungsdatei wieder geleert.
Dieser Umstand hat viel zur Art der Implementierung des genetischen Algorithmus beigetragen. Es musste auf einige Konzepte der objektorientierten Programmierung verzichtet werden. Es wurden weniger Klassen und Objekte zur Berechnung der einzelnen Generation und der Fitness verwendet. Viel mehr wurden die
wichtigsten Informationen wie Fitness oder einzelne Individuen in Dateien gespeichert, um sie nach Ablauf eines Prozesses nicht zu verlieren. Die Fitness wird in
zwei Dateien verwaltet. In einer Datei sind die Fitnesswerte aller Individuen gespeichert, in der anderen wird zur besseren Übersicht nur die Durchschnitts- und
Maximalfitness gespeichert. Diese beiden Dateien liegen im CSV-Format (Comma Separated Values) vor, womit sie ohne weiteres in ein Tabellenkalkulationspro-
9.5 Grafische Benutzeroberfläche
84
gramm eingelesen werden können, in welchem relativ einfach Graphen zur besseren
Übersicht hergestellt werden können.
Für jede Generation wird ein Ordner angelegt, in dem die einzelnen Individuen
bzw. deren Gehirne serialisiert werden. Dadurch ist es auch später möglich, ein
bestimmtes Individuum einer Generation zu laden und zu testen. Die Wahl, nur das
Gehirn zu serialisieren und nicht die komplette Kreatur, liegt in der Vorgehensweise
des genetischen Algorithmus zum Erlernen der Bewegungen. Dieser arbeitet auf
Erweiterungen der Klasse GABrain, welche die abstrakten Methoden
public abstract void crossover(GABrain brain);
public abstract void mutate(double mutationRate);
implementieren. Auf diese Weise ist das Gehirn-Objekt sofort zugänglich und, da
nur ein Teil der Kreatur gespeichert wird, spart dieser Vorgang Speicherplatz.
Um nun ein bestimmtes Individuum einer Generation zu testen, um zu sehen,
wie es sich verhält und wie es zu der erreichten Fitness gekommen ist, genügt es,
eine neue Kreatur mit dem verwendeten Chromosom zu erzeugen, und ihr das
gewünschte Gehirn einzupflanzen“, indem es deserialisiert und der Kreatur mit
”
setBrain() übergeben wird.
Die Selektion der Chromosomen bzw. der Kreaturen, die die nächste Generation
bilden, geschieht über die in Abschnitt 4.4 vorgestellten Verfahren. Welches von ihnen verwendet wird, kann beim Start des genetischen Algorithmus gewählt werden.
Die Implementierung der Selektionverfahren wertet die gemessene oder die erweiterte (siehe Abschnitt 4.3) Fitness aus und erzeugt ein Indexfeld der Individuen,
die zur Bildung der Folgegeneration verwendet werden. Je nach Selektionsverfahren kann es nun sein, dass Individuen mehrfach oder auch gar nicht in diesem
Indexfeld erscheinen. Um eine höhere Vermischung der Gene zu erhalten, wird dieses Feld durcheinander gewürfelt. Anschließend werden die genetischen Operatoren
Crossover und Mutation durchgeführt. Das Durcheinanderwürfeln des Indexfeldes
verringert dabei die Wahrscheinlichkeit, dass zwei identische Chromosomen rekombiniert werden, falls diese ursprünglich hintereinander aufgelistet wurden, was z.B.
beim Stochastic Universal Sampling der Fall wäre.
9.5 Grafische Benutzeroberfläche
Das hier entwickelte System beschränkt sich zunächst nur auf Konsolenanwendungen. Um aber das Erlernen von Bewegungen und später die Ansicht der einzelnen
Resultate ein wenig komfortabler zu gestalten, wurden für diese beiden Anwendungen grafische Benutzeroberflächen gestaltet, die das Anstoßen dieser beiden
Aufgaben erleichtern sollen.
9.5.1 Starten eines genetischen Algorithmus
Zum Start eines genetischen Algorithmus, der zum Erlernen der Bewegungen verantwortlich ist, werden folgende Informationen benötigt:
9.5 Grafische Benutzeroberfläche
•
•
•
•
•
•
•
•
•
85
Name der Kreatur
Pfad des zu trainierenden Chromosoms
Pfad zum Speichern der Ergebnisse
Klassenname des zu verwendenden Gehirns
Anzahl der Generationen
Populationsgröße
Selektionsverfahren
Fitnessfunktion
Mutationsrate
Abbildung 9.1 zeigt die für diese Aufgabe erstellte grafische Oberfläche, mit der
all diese Informationen auf einfachem Wege einzutragen sind. Der Speicherpfad
wird automatisch generiert und setzt sich aus Datum und Uhrzeit zusammen. Die
Wahl des Klassennamens, des Selektionsverfahrens und der Fitnessfunktion wird
durch eine Combobox vereinfacht, in denen die möglichen Alternativen aufgeführt
werden. Die Werte, die durch Zahlen repräsentiert werden, wie Generationenanzahl, Populationsgröße oder Mutationsrate, können durch Spinner eingestellt werden.
Abbildung 9.1. GUI zum Starten eines genetischen Algorithmus
9.5.2 Ansicht der Resultate
Nach Ablauf eines genetischen Algorithmus sollen die erzielten Ergebnisse überprüft werden können. Dazu wird das trainierte Chromosom sowie das zu testende
Gehirn benötigt. In Abbildung 9.2 wird die hierfür erzeugte Oberfläche dargestellt,
die für beide Aufgaben, Wahl des Chromosoms und Wahl des Gehirns, FileChooser
zur Verfügung stellt, die zur grafischen Simulation verwendet werden sollen.
9.6 Tests
86
Abbildung 9.2. GUI zum Starten eines Ergebnisses
Welcher Ordner als Ausgangspunkt der FileChooser verwendet werden soll,
kann beim Programmstart vorgegeben werden. Im Beispiel ist dies D:\logging.
9.6 Tests
Das Testen einer Software nimmt einen immer höheren Stellenwert im Verlauf
des Softwareentwicklungsprozesses ein. Es soll die Qualität der erstellten Software
garantieren (vgl. [Got05]).
9.6.1 Statische Analyse
Die statische Analyse umfasst die Untersuchung des Quellcodes nach möglichen
Fehlerquellen. Dieses Vorgehen wurde ausgiebig während und nach der Implementierung der einzelnen Module angewendet.
In der Regel sollen solche Analysen von Personen durchgeführt werden, die
nicht am Entwicklungsprozess beteiligt sind. Im Falle dieser Arbeit, die nur von
einer Person bearbeitet wird, kann dieser Vorschlag natürlich nicht berücksichtigt
werden.
9.6.2 Testen der Softcomputingverfahren
Dieser Arbeit einer grossen Anzahl Tests zu unterziehen, stellt keine leichte Aufgabe dar. Denn Verfahren wie neuronale Netze oder genetische Algorithmen sind nur
schwer durchschaubar. Wie die erzielten Ergebnisse erreicht werden und wie diese
bewertet werden können, ist fast nicht nachvollziehbar. Dieser Punkt ist jedoch
auch ein großer Vorteil der Verfahren, denn ein Anwender sieht, dass es funktioniert, weiß aber in der Regel nicht, warum. Diese Tatsache unterstreicht, dass für
diese Verfahren nur Blackbox-Tests wirklich sinnvoll sind und auch hier angewendet wurden (vgl. [Got05] S. 7).
So wurden genetische Algorithmen als auch die neuronalen Netze mit einfachen
Aufgaben getestet, wie z.B. das XOR-Problem. Teilaufgaben der einzelnen Technologien wurden vor allem durch Testausgaben und Debugging untersucht, um die
Verfahren im laufenden Betrieb testen zu können.
9.6 Tests
87
9.6.3 Systemtest
Neben den Tests der angewendeten Verfahren wurden die einzelnen Technologien
und deren Kombinationen untersucht. Hierunter fallen Versuche mit ODE, odejava
und Java3D. Diese Tests zielen vor allem auf Leistung ab und konnten zur Verbesserung der Laufzeit und des Speicherverhaltens des gesamten Systems beitragen.
10
Ergebnisse
Dieses Kapitel befasst sich tiefergehend mit den eingesetzten Methoden und den
daraus erzielten Ergebnissen.
10.1 Gehirntypen
Im Laufe dieser Arbeit wurden viele verschiedene Ansätze verfolgt, die Motorik der
Kreaturen anzutreiben. Die Steuerung der Bewegung der Kreaturen steht damit
zunächst im Mittelpunkt. Diese ist von der Arbeitsweise des Gehirns der Kreatur
abhängig, das ja die Aufgabe hat, die aufgenommen Sensordaten auszuwerten, um
damit den momentanen Stand der Kreatur zu erfassen und um daraus Effektordaten zu errechnen, die die Kreatur möglichst effektiv vorantreiben lassen.
10.1.1 Gehirn mit neuronalen Netzen
Die Idee künstliche neuronale Netze (siehe Kapitel 5) zur Simulation eines Gehirns
einzusetzen, liegt nicht fern und wird in dieser Arbeit als erstes angegangen. Dabei
liegt es nahe, die Sensordaten als Netzeingabe zu verwenden und die Effektordaten
aus der Netzausgabe zu gewinnen.
Als nächstes stellt sich die Frage nach der Lernmethode. Hier wird zwischen
den drei Arten:
1. überwachtes Lernen,
2. bestärkendes Lernen und
3. unüberwachtes Lernen
unterschieden.
Das überwachte Lernen ist zwar die gängigste Methode, hier aber schwer oder
unmöglich anzuwenden; denn für diese Art des Lernens werden Trainingsdaten
benötigt, was bedeutet, das die Musterlösung bereits bekannt sein muss, was in
diesem Fall aber nicht zutrifft. Die Aufgabe des Gehirns besteht ja gerade darin,
die bestmöglichen Bewegungsabläufe eines bestimmten Körperbaus zu erlernen.
Im allerersten Ansatz wurde die Methode Trial & Error als Lernmethode angedacht. Diese Art des Lernens ist biologisch sehr plausibel und durchaus vergleichbar
10.1 Gehirntypen
89
mit der Methode, mit der z.B. ein menschliches Baby oder Kleinkind an das Problem der Fortbewegung herangeht. Für diesen Ansatz wurde eine Kombination
aus allen drei Lernverfahren getestet. Mit Hilfe des unüberwachten Lernens sollte
die aktuelle Position des Körpers klassifiziert werden, anschließend sollte eine Bewegung durchgeführt werden, die schließlich durch eine Fitnessfunktion bewertet
wird. Die durchgeführte Bewegung könnte dann ebenfalls durch unüberwachtes
Lernen klassifiziert werden. Diese ersten Schritte beschreiben die Trial-Phase, in
der einfach ausprobiert wird, wie am besten auf die aktuelle Situation eingegangen werden kann. Anschließend könnten gut bewertete Aktionen zu bestimmten
Positionen über überwachtes Lernen trainiert werden. Die Beschreibung verrät es
bereits. Diese Art des Lernens hat zwar seinen Wiedererkennungswert in der Natur, ist aber enorm rechenaufwändig, wenn nicht gar unmöglich durchzuführen.
Die Klassifizierung der Zustände einer Kreatur sprengt allein schon den Rahmen
des Möglichen; denn die Anzahl der erwünschten Klassen bzw. Zustände muss im
Vorfeld festgelegt werden, da diese die Topologie des verwendeten Netzes (SOM,
siehe Unterabschnitt 5.6.3) bestimmen. Würde man beispielsweise die Anzahl der
Sensoren so weit einschränken, dass nur die Winkelpositionen jedes Freiheitsgrades
gemessen werden und hier auch nur das Vorzeichen jedes Winkels berücksichtigt
würde, ergäbe das eine abhängig von der Anzahl Freiheitsgrade dof exponentiell
steigende Anzahl Zustände mit 2dof . Zudem wäre damit nur ein Bruchteil der aktuellen Situation beschrieben. In diesem Fall gäbe es auch keine Möglichkeit, den
Zustandsgraphen zu reduzieren, wie es teilweise im Modelchecking gemacht wird.
Da alle Zustände miteinander verbunden sind, bedeutet das, dass jeder Zustand
jedem anderen folgen oder vorangehen kann.
In Anlehnung an die Arbeit von Gene Ruebsamen ([Rue04]) wurde eine Methode
des bestärkenden Lernens verwendet, die sich Neuroevolution (vgl. Abschnitt 5.7)
nennt. Dabei handelt es sich um eine Kombination aus genetischen Algorithmen
und neuronalen Netzen, wobei die Gesamtheit der Gewichte des Netzes als Chromosom fungiert. Die Bestärkung erfolgt durch die Fitnessfunktion des genetischen
Algorithmus. Für diese Art des Lernens wurden mehrere Netzarchitekturen getestet, von denen sich das Elmannetz (siehe Unterabschnitt 5.6.2) als das geeignetste
erwiesen hat. Einfache vorwärtsgerichtete Netze konnten keine vergleichbaren Ergebnisse erziehlen wie die von Elman entwickelten Netze mit Kurzzeitgedächtnis“.
”
Gehirnaufbau
Der Aufbau des Netzes ist abhängig von der Anatomie der von ihm gelenkten Kreatur. Die Netzeingabe ergibt sich aus der Anzahl der Sensoren, die Netzausgabe aus
der Anzahl der Effektoren. Es wird eine verdeckte Neuronenschicht verwendet,
die zwischen 6 und 10 Neuronen liegt. Die Kontextschicht besitzt genauso viele Neuronen, da sie abhängig von der verdeckten Schicht ist. Ruebsamen hat in
seiner Arbeit mehrere Kontextschichten verwendet, aber Versuche mit einer vergleichbaren Architektur haben gezeigt, dass dabei kein Unterschied zu einfachen
Elman-Netzen zu verzeichnen ist.
10.1 Gehirntypen
90
Genetische Operatoren
Jedes Gewicht des Netzes wird als ein Gen interpretiert, sodass die Gesamtheit
der Gewichte das Chromosom beschreibt. Die Gewichte können hintereinander
aufgeführt als einfache Liste reeller Zahlen interpretiert werden. Dies vereinfacht
die Arbeitsweise der genetischen Operatoren.
So kann der Crossover-Operator in üblicher Weise durchgeführt werden. Um
den positional bias gering zu halten, wird ein Shuffle Crossover durchgeführt, bei
dem vor der eigentlichen Rekombination, für die das One-Point-Crossover verwendet wird, die Reihenfolge der Gene zufällig verändert wird. Im Anschluss an den
Genaustausch wird die ursprüngliche Reihenfolge wieder hergestellt.
Im Falle einer Mutation wäre es z.B. möglich, ein Gewicht durch eine neu errechnete Zufallszahl zu ersetzen. Statt dessen werden die Gewichte bei einer Mutation
nur minimal verändert. Die Höhe der Veränderung wird ebenfalls zufällig ermittelt
und liegt zwischen −0.25 und +0.25.
Zufällige Erzeugung von Gehirnen
Die zufällige Generierung eines Gehirns, also eines Elman-Netzes, ist auch kein
Problem, da die Chromosomen einzig durch die Gewichtungen und die Topologie
definiert sind, also auch die Anzahl der Gene im Vorfeld festgelegt wird. Die Gewichte werden zu Beginn zufällig mit einem Wert, der zwischen −0.5 und +0.5
liegt, initialisiert.
10.1.2 Gehirn mit genetischer Programmierung
Da diese Arbeit sehr stark von der Karl Sims inspiriert wurde, lohnt ein Versuch
der Imitation seiner Nervensysteme“. Ganz exakt wird seine Architektur aller”
dings nicht übernommen, dafür aber die wichtigsten Ideen. Der Genotyp von Sims
Kreaturen wurde für Körperbau und Gehirn gleichermaßen in Form eines gerichteten Graphen beschrieben, wobei beide in gewisser Weise von einander abhängig
sind. Der Aufbau des Nervensystems orientiert sich dabei an dem der Anatomie.
In dieser Arbeit wird zwar auch mit gerichteten Graphen gearbeitet, allerdings
werden diese auf einfache Bäume beschränkt. Auf diese Weise kann auch ohne
Reparaturmechanismen, wie sie bei Sims Methode nötig sind, eine genetische Programmierung durchgeführt werden. In Sims Fall kann es beim Crossover-Operator
zwischen zwei Chromosomen, also Graphen, zu ungültigen Graphen kommen, falls
nötige Verbindungen wegfallen. Danach müssen diese Graphen, ähnlich ihrer zufälligen Erschaffung, nach dem Zufallsprinzip erweitert werden, bis sie wieder einsatzbereit sind.
Die Funktionsweise der genetischen Programmierung wird in Abschnitt 4.7 vorgestellt. Hervorzuheben ist hierbei die Verwendung von Bäumen zunächst unbestimmter Tiefe, anstelle Bitstrings fester Länge. Die Länge der Chromosomen ist
variabel, wird aber auf eine bestimmte Tiefe, z.B. 17 beschränkt.
10.1 Gehirntypen
91
Gehirnaufbau
Dieser Ansatz zielt auf die Berechnung einer mathematischen Funktion, deren
Ausgabe als Effektorwert verwendet wird. Die Berechnung wird mit einem Berechnungsbaum durchgeführt, der später einer genetischen Evolution unterliegt.
Der hier eingesetzte Berechnungsbaum besteht aus zwei Arten von Knoten:
• Berechnungsknoten, die einen oder mehrere Eingänge besitzen, an denen die
Kind-Knoten hängen und einen Ausgang, der sie mit ihrem Eltern-Knoten verbindet oder der als Effektor-Wert verwendet wird, und
• Werteknoten, die ebenfalls einen Ausgang besitzen, jedoch keinen Eingabeknoten, was bedeutet, dass diese Knoten als Blätter im Baum dienen.
Die Berechnungsknoten ermitteln einen mathematische Funktionswert anhand
der von ihren Kind-Knoten erzeugten Eingabe. Die folgende Tabelle (siehe Tabelle 10.1) listet alle verwendeten Berechnungs-Knoten auf:
Name Funktion
Eingabe
+
Summenbildung
2-3
*
Produktbildung
2-3
2-3
max Maximum
min Minimum
2-3
Sinus
1
sin
Cosinus
1
cos
tan
Tangens
1
1
atan Arcus Tangens
abs
Betrag
1
mem Speichert Eingabe für nächsten Zeitschritt 1
Tabelle 10.1. Übersicht der Berechnungsknoten
Als Werteknoten dienen zum einen die Sensordaten, wobei ein Knoten den Wert
eines bestimmten Sensors enthält. Desweiteren werden sogenannte oszillierende
Funktionen verwendet, deren Ausgabe zeitabhängig ist. Tabelle 10.2 zeigt eine
Liste der verwendeten Werteknoten:
Name Funktion
xi
i-ter Sensorwert
coswave coswave(t) = cos(−π + (2 ∗ π)/f req ∗ t)
sinwave sinwave(t) = sin(−π + (2 ∗ π)/f req ∗ t)
saw
saw(t) = −(2/f req) ∗ t + 1
Tabelle 10.2. Übersicht der Werteknoten
Cosinus und Sinus sind Funktionen, die sich in einem Bereich von 2π wiederholen. Hier ist also schon eine Art Oszillation vorhanden. saw ist eine Funktion, die
10.1 Gehirntypen
92
eine abfallende Gerade in einem bestimmten Wertebereich beschreibt. Der Wert
f req legt die Frequenz fest, in der die Funktion oszilliert. t bezeichnet den aktuellen Zeitpunkt, der im Intervall [0, f req] liegt. Ist die Grenze f req erreicht, wird t
wieder auf 0 gesetzt, wodurch die Oszillation zu Stande kommt.
Die Idee für den Einsatz der oszillierenden Funktionen stammt aus der Arbeit
Sims’. Sie dienen als Taktgeber für viele Bewegungen und führen in der Regel zu einem besseren Bewegungsablauf. Erste Versuche ohne solche Funktionen sind nicht
besonders erfolgreich ausgefallen, während mit dem Einsatz dieser Funktionen eine
deutliche Verbesserung der Bewegungsabläufe ersichtlich geworden ist.
Ein Beispiel eines solchen Berechnungsbaums wird in Abbildung 10.1 gezeigt.
Die dort berechnete Funktion lautet:
f (x1 , ..., xn , t) = max(sin(x5 ) + x1 , sin(saw(t)), mem(abs(x3 )))
sin
x5
+
x1
Effektor
max
sin
mem
saw
abs
x3
Abbildung 10.1. Beispiel eines Berechnungsbaums
Das Gehirn einer Kreatur benötigt folglich für jeden Effektor einen solchen
Berechnungsbaum.
Genetische Operatoren
Der Crossover-Operator wird hier für jeden Baum einzelnen angewandt. Das heißt,
zwei Individuen tauschen ihr Erbgut für jeden Effektor separat aus. Der Vorgang
entspricht exakt der in Abschnitt 4.7 eingeführten Art und Weise. Es werden je
zwei Knoten der jeweiligen Bäume ausgewählt und miteinander vertauscht. Da ein
Baum durch diese Methode sehr groß geraten kann, wird eine Höchsttiefe eingeführt, die von dem umgestalteten Baum nicht überschritten werden darf. Deshalb
wird bei der Auswahl der zu tauschenden Knoten darauf geachtet, dass die Bäume
diese Tiefe nicht überschreiten.
10.2 Erlernen eines Bewegungsablaufs
93
Eigentlich wird die Mutation in der genetischen Programmierung nicht eingesetzt. Damit aber auch andere Effektoren einen Nutzen aus guten Berechnungsbäumen ziehen können, können die Bäume eines Gehirns untereinander vertauscht
werden. Die daraus entstehende Reihenfolge wird dem Zufall überlassen. Auch wird
dieser Vorgang nicht in jedem Fall durchgeführt, sondern nur zu einer bestimmten
Wahrscheinlichkeit, die von der Mutationsrate abhängig ist.
Zufällige Erzeugung von Gehirnen
Die Initialpopulation wird durch eine zufällig erzeugte Anzahl Gehirne gebildet.
Das bedeutet, dass jedes Gehirn pro Effektor einen zufälligen Berechnungsbaum
erzeugen muss. Auch hierbei wird eine Höchsttiefe bestimmt, die der zufällig erzeugte Baum nicht überschreiten darf. Dieser Wert liegt in der Regel unter dem
Wert der Höchsttiefe, die beim Crossover-Operator eingehalten werden muss. So
wurde in dieser Arbeit beispielsweise eine initiale Höchsttiefe von 6 und eine Gesamthöchsttiefe von 17 gewählt.
Die Wahl der Knoten wird ebenfalls dem Zufall überlassen. Je tiefer der Baum
wird, desto höher ist die Wahrscheinlichkeit, dass ein Werteknoten gewählt wird.
Wird mit Auswahl des nächsten Knotens eines Teilbaums die initiale Höchsttiefe erreicht, so wird in jedem Fall ein Werteknoten bestimmt, der ein Blatt des
Baumes bildet. Ansonsten wird zunächst entschieden, ob ein Berechnungs- oder
ein Werteknoten gewählt wird, um anschließend den genauen Funktionswert des
Knoten zu bestimmen.
Eine Besonderheit dieser Art der Funktionsgenerierung ist, dass nicht alle, sondern in der Regel sogar nur wenige Eingabewerte die Ausgabe bestimmen. Das
heißt, dass nur wenige Sensordaten zur Errechnung der Effektordaten herangezogen werden. Wie schon erwähnt sorgen meistens die oszillierenden Funktionen für
gute Ergebnisse.
10.2 Erlernen eines Bewegungsablaufs
Nach den Beschreibungen der hier verwendeten Gehirne“ wird schnell deutlich,
”
dass auch für das Erlernen der Bewegungen ein genetischer Algorithmus eingesetzt
werden sollte. Das wichtigste Element des genetischen Algorithmus zur Evolution des Bewegungsablaufs einer Kreatur ist die Fitnessfunktion. Sie beurteilt die
Leistungs- und Überlebenswahrscheinlichkeit eines Individuums.
Da es sich bei der zu messenden Fitness um Bewegungen handelt, liegt es nahe,
die Entfernung, die Geschwindigkeit oder auch die Richtung einer Kreatur in diese
Bewertung einfließen zu lassen. Im Laufe der Zeit wurden mehrere Fitnessfunktionen getestet.
Lineare Entfernung berechnet die zurückgelegte Strecke
xz − xs f it(c) = yz − ys 10.3 Körperevolution
94
xs
xz
wobei
die Startposition und
die Zielposition beschreibt.
ys
yz
Gesamtentfernung summiert die zurückgelegte Entfernung schrittweise. Bei S
Schritten:
S−1 X
xi+1 − xi f it(c) =
yi+1 − yi i=0
Bei dieser Art der Fitnessberechnung werden auch Individuen gut bewertet,
die nicht zielgerichtet in eine bestimmte Richtung wandern, sondern die sich
durchweg viel bewegen.
Gerichtete Fitness ist abhängig von der eingeschlagenen Richtung der Kreatur.
Es sind Bewertungen entlang der X- oder der Y-Achse möglich:
f itx (c) = |xz − xs |
f ity (c) = |yz − ys |
Ruebsamen Fitness Gene Ruebsamen hat dieses Verfahren noch ein wenig verfeinert und eine Bestrafung bei Abweichungen eingeführt:
f itx (c) = 9 ∗ |xz − xs | − |yz − ys |4
f ity (c) = 9 ∗ |yz − ys | − |xz − xs |4
Der Wert 9 wird hierbei als Belohnung, der Wert 4 als Bestrafung verwendet.
Falls der Fitnesswert einen negativen Wert erreicht, wird er auf 0 gesetzt.
Durchschnittliche Entfernung ist eine Erweiterung der Gesamtentfernung. Hier
wird die Gesamtentfernung durch die Anzahl der gemessenen Schritte S berechnet:
S−1
P xi+1 − xi yi+1 − yi f it(c) = i=0
S
10.3 Körperevolution
Die Evolution der Anatomie der Kreaturen wird über Genetische Programmierung
realisiert, wobei die Chromosomen der Kreaturen verwendet werden.
10.3.1 Aufbau der Chromosomen
Der Aufbau der Chromosomen der Kreaturen wird in Unterabschnitt 8.1.1 beschrieben.
10.3 Körperevolution
95
10.3.2 Genetische Operatoren
Der genetische Operator Crossover wird wie in Abschnitt 4.7 beschrieben durchgeführt. Dabei werden zwei zufällige Knoten zweier Chromosomen getauscht, wodurch eine komplett neue Struktur entsteht. Dabei muss der Algorithmus darauf
achten, dass die vorher festgelegte maximale Baumtiefe nicht überschritten wird.
Dies wird durch die Veränderung der Auswahlwahrscheinlichkeit der Knoten in
Abhängigkeit ihrer Tiefe gewährleistet. Dadurch können Knoten, deren Austausch
zu einer zu großen Baumtiefe führt, nicht ausgewählt werden.
Im Falle einer Mutation werden die einzelnen Eigenschaften der Körperteile
bzw. der Gelenke verändert:
•
•
•
•
•
Dimension eines Körperteils
Ankerposition der Nachfolgeknoten
Ankerposition zum Vorgänger- /Elternknoten
Drehachsen
Begrenzungen der Achsen.
Diese Veränderungen sind aber jeweils nur minimal, da die genetische Programmierung allein schon zu einem großen Genpool führt.
10.3.3 Zufällige Erzeugung von Chromosomen
Bei der zufälligen Generierung von Chromosomen sind einige Faktoren zu beachten.
Zunächst ist die Baumtiefe auf den Wert 3 eingeschränkt. Diese Tiefe erhöht sich
in der Regel im Laufe des genetischen Algorithmus. Dann werden die Ausmaße
der Körperteile beschränkt. Die Länge einer Seite liegt im Intervall [0.1, 2.0]. Und
die Begrenzung der Gelenkachsen ist ohnehin auf das Intervall [−π, π] beschränkt,
wodurch die zufällige Generierung dieser Werte ebenfalls dieses Intervall umfasst.
Zuletzt werden die Gelenkachsen zufällig erzeugt. Diese werden durch einen Vektor
gebildet, dessen Werte zwischen −1 und 1 liegen, und der schließlich normalisiert
wird.
10.3.4 Bewertung der Chromosomen
Die Bewertung der Chromosomen, die die Anatomie einer Kreatur beschreiben, ist
relativ umständlich zu ermitteln; zumindest nicht ohne einen erhöhten Rechenaufwand. Um die Fitness eines Chromosoms zu berechnen, muss zunächst ein genetischer Algorithmus durchgeführt werden, der Bewegungen mit dem entsprechenden
Körperbau trainiert. Das bedeutet, dass das Gehirn einer Kreatur, das aus diesem Chromosom entsteht, durch einen genetischen Algorithmus entwickelt wird.
Die dabei maximal erzielte Fitness entspricht der Fitness des Chromosoms. Dieser Umstand führt dazu, dass Chromosomen, mit denen eine gute Fortbewegung
erzielt wird, höhere Chancen haben, in die nächsten Generationen einzufließen.
Desweiteren fällt auf, dass die Fitness eines Chromosoms auch von den berechneten Fitnesswerten des genetischen Algorithmus für die Bewegungserlernung
abhängig ist. Aus diesem Grund ist die Evolution des Körperbaus auch eine sehr
10.4 Bewegen vordefinierter Körper
96
zeitaufwändige Sache. Benötigt der Durchlauf des Gehirntrainings beispielsweise
über 50 Generationen mit einer Populationsgröße von 130 Individuen etwa 20 Minuten, so berechnet sich die Zeit, die der genetische Algorithmus zur Evolution der
Morphologie benötigt:
t = gensize ∗ popsize ∗ 20
Ein Versuch mit 15 Generationen und einer Populationsgröße von 20 würde demnach mehr als vier Tage dauern. Diesem Umstand ist es auch zu verdanken, dass in
dem Bereich der Körperevolution weniger Versuche gemacht wurden und verstärkt
an der Evolution vordefinierter Körper gearbeitet wurde.
10.3.5 Ergebnisse
Versuche, den Körperbau der Kreaturen entwickeln zu lassen, wurden nur wenige
durchgeführt. Die Gründe hierfür sind oben bereits angesprochen worden. Der
Zeitaufwand wurde, vor allem gegen Ende der Arbeit, einfach zu gross.
Wie aus Abbildung 10.2 ersichtlich wird, waren diese wenigen Versuche auch
nicht sehr erfolgreich. Die hierbei entstandenen Kreaturen konnten keine innovativen Bewegungen entwickeln, da ihr Körperbau zu unförmig ausgefallen ist.
Abbildung 10.2. Generierter Körperbau
Um für diese Aufgabe bessere Ergebnisse zu erzielen, wäre eine neue Strategie
von Nöten, mit der die Chromosomen sich erfolgreicher entwickeln könnten. Ein
Ansatz wäre hier z.B., kleine Änderungen an vordefinierten Anatomien vorzunehmen, um diese durch kleine Mutationen zu verbessern. Eine weitere Alternative
könnte eine Menge vordefinierter Körperteile (Beine, Arme, usw.) verwenden, wobei aus diesen, nach dem Baukastenprinzip, neue Kreaturen erstellt und nur komplette Extremitäten durch Crossover ausgetauscht und durch minimale Mutationen
angepasst werden.
10.4 Bewegen vordefinierter Körper
Die meisten Versuche wurden mit vordefinierten Körpern gemacht, die zum Teil
in Anlehnung an Kreaturen anderer Arbeiten erzeugt wurden oder dem Vorbild
verschiedener Tiere nachempfunden sind.
10.4 Bewegen vordefinierter Körper
97
Die in diesem Abschnitt vorgestellten Körperteile sind mit den unterschiedlichsten Gehirnen und Fitnessfunktionen getestet worden. Zur Verbesserung der
Bewegungen wurde an den Stellschrauben des GA-Systems gedreht. So wurden unterschiedliche Selektionsverfahren eingesetzt, die Mutationsrate, Populationsgröße
oder die Anzahl der Generationen verändert.
Im Laufe der Zeit hat sich das Stochastic Universal Sampling (siehe Unterabschnitt 4.4.3) als das zuverlässigste Selektionsverfahren herauskristallisiert. Diese
Methode, ein Eliteauswahlverfahren, spiegelt sich auch in den einzelnen Fitnessverläufen wieder. Es wird deutlich, dass die durchschnittliche Fitness während eines
genetischen Algorithmus zunehmend ansteigt und sich dem Maximum angleicht.
Auch für die Populationsgröße konnte ein Erfahrungswert festgesetzt werden.
Lieferte ein Versuch mit neuronalen Netzen mit noch relativ geringer Populationsgröße, zwischen 70 - 90 Individuen, gute Ergebnisse, benötigte ein Versuch mit
genetischen Algorithmen eine Größe von über 120 Individuen, um vergleichbare
oder bessere Lösungen zu erreichen.
10.4.1 TwoArm
Körperbau
Eine ähnliche Anatomie wie diese findet sich sowohl bei Sims ([Sim94b]) als auch
bei Ruebsamen ([Rue04]). Abbildung 10.3 zeigt den Aufbau der Kreatur, der sich
auf einen Torso und zwei längere Glieder beschränkt.
Abbildung 10.3. TwoArm
Da die beiden Arme jeweils mit einem Universalgelenk an den Torso gegliedert
sind, besitzt die Kreatur vier Effektoren und 16 Sensoren zur Koordination der
Bewegungen.
Verwendete Gehirne
Die besten Ergebnisse mit diesem Körperbau sind mit einem Gehirn nach Unterabschnitt 10.1.2 erzielt worden, das nach der Methode der genetischen Programmierung agiert. Aufgrund der Anzahl der Effektoren werden vier Berechnungsbäume
verwendet.
Auf eine Beschreibung der entwickelten Berechnungsbäume wird hier allerdings
verzichtet. Diese sind in der Regel sehr umfangreich und daher nicht mehr so
10.4 Bewegen vordefinierter Körper
98
einfach nachvollziehbar. Im Grunde liegt - wie bei neuronalen Netzen - eine BlackBox vor. Die Daten lassen sich zwar mathematisch nachrechnen, doch der Grund
für die erzeugte Struktur bleibt dem Benutzer verborgen.
Ergebnisse
Trotz seines einfachen Aufbaus konnte dieser Körperbau, wie kein anderer, nahezu
alle durch die unterschiedlichen Fitnessfunktionen definierten Aufgaben zufriedenstellend bewältigen.
Fitness
Gerichtete Fitness in X-Richtung Eine Bewegung entlang der X-Achse wurde
durch das Anheben eines Arms und dem gleichzeitigen Schlagen des anderen
Arms erreicht, wodurch sich die Kreatur in die Richtung des ausgestreckten
Arms bewegt. Diese Strategie wurde sogar für beide Richtungen, links oder
rechts, angewendet. Abbildung 10.4 zeigt den Fitnessverlauf eines genetischen
Algorithmus mit diesem Ergebnis. Hier sind sowohl rechts- als auch linksgerichtete Bewegungen enthalten.
avg
max
1
11
21
31
41
51
61
71
81
91 101 111 121 131 141 151 161 171 181 191 201
Ge ne ration
Abbildung 10.4. Fitnessverlauf gerichtete Fitness in X-Richtung
Gerichtete Fitness in Y-Richtung Die Bewegung entlang der Y-Achse wurde
durch ein Rudern mit beiden Armen erreicht. Hierbei kam es zwar zeitweise
zu geringen Abweichungen in X-Richtung, die aber wieder ausgeglichen werden
konnten. Der Fitnessverlauf dieses Versuchs ist in Abbildung 10.5 abgebildet.
Ruebsamen Fitness in Y-Richtung Eine interessante Lösung konnte die Kreatur für die Ruebsamen Fitness in Y-Richtung liefern. Bei dieser Art der Fitnessberechnung wird die Abweichung bestraft. Für diese Aufgabe hat die Kreatur die Arme an den Körper angezogen, um gleichmäßig mit ihnen auf den Boden zu schlagen. Durch dieses Verhalten bewegt sich die Kreatur zwar langsam,
99
Fitness
10.4 Bewegen vordefinierter Körper
avg
max
1
12
23
34
45
56
67
78
89 100 111 122 133
Generation
Abbildung 10.5. Fitnessverlauf gerichtete Fitness in Y-Richtung
aber mit nur einer minimalen Abweichung entlang der Y-Achse. Der Fitnessverlauf wird in Abbildung 10.6 dargestellt. In diesem Fall ist die schwankende
Maximalfitness auffallend, die die Probleme unterstreicht, die ein genetischer
Algorithmus mit dieser Art Aufgabenstellung hat.
Fitness
avg
max
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79
Generation
Abbildung 10.6. Fitnessverlauf Ruebsamen, Y-Richtung
10.4 Bewegen vordefinierter Körper
100
10.4.2 Spinnentiere
Dieser Körperbau ist dem von Spinnen oder Krebsen aus dem Tierreich nachempfunden worden.
Körperbau
In Abbildung 10.7 sind zwei verschiedene Ansätze von Spinnentieren abgebildet.
Bei der zweiten Variante wurde einfach auf die Beine auf einer Seite des Körpers
verzichtet. Um möglichst effektive Ergebnisse einzufahren, sind die Gelenke nur
um eine Achse drehfähig, eingeschränkt durch ein einfaches Scharniergelenk. Auch
die Bewegungsfreiheit wurde im Laufe der Versuche immer weiter eingeschränkt,
um möglichst authentische Bewegungen zu erhalten.
Abbildung 10.7. Spinnentiere
Verwendete Gehirne
Wie mit allen anderen Kreaturen auch wurden für diese Anatomie ebenfalls die
unterschiedlichen Gehirntypen (siehe Abschnitt 10.1) getestet. Erstaunlicherweise scheinen Gehirne, die auf neuronalen Netzen basieren, mit diesem Körperbau
wesentlich besser klar zu kommen, als Gehirne, die das Konzept der genetischen
Programmierung auf Berechnungsbäumen verwenden; die besten Ergebnisse konnten durch Neuroevolution erzielt werden.
Ergebnisse
Aufgrund der anatomischen Einschränkung durch einfache Scharniergelenke konnten auch die Versuche auf Bewegungen in X-Richtung eingeschränkt werden. Hierbei wurde entweder die einfache Entfernung in X-Richtung oder die RuebsamenFitness verwendet. Auch hier finden sich erneut viele interessante Lösungen, die in
der Regel nicht mit den erwarteten Bewegungen vergleichbar sind.
Bei den ersten Versuchen wurde die Bewegungsfreiheit der Gelenke noch nicht
so stark eingeschränkt, was den Kreaturen Raum für individuelle und vielseitig
gestaltbare Bewegungsabläufe ließ. Leider landeten viele dieser Kreaturen auf dem
Rücken oder auf der Seite und haben sich damit selbst bewegungsunfähig gemacht.
Abbildung 10.8 zeigt den Fitnessverlauf eines Versuchs einer Kreatur mit nur
zwei Armen. Statt sich durch Drücken oder Ziehen fortzubewegen, setzt diese Kreatur auf Trippelschritte. Sie streckt die Arme aus und erreicht eine Fortbewegung
10.4 Bewegen vordefinierter Körper
101
Fitness
durch ständiges Hochheben des Torso. Dabei unternimmt sie leichte Ziehbewegungen, denn die Kreatur kriecht in Richtung der Arme.
avg
max
1
4
7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79
Ge ne ration
Abbildung 10.8. Fitnessverlauf Trippelschritte
Fitness
Der in Abbildung 10.9 dargestellte Fitnessverlauf gehört zu einem Versuch mit
einer vierbeinigen Spinne. Diese verhält sich mit den vorderen Beinen ähnlich der
vorher beschriebenen Kreatur, hilft sich aber zusätzlich durch Drückbewegungen
der gegenüberliegenden Beine.
avg
max
1 4
7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79
Ge ne ration
Abbildung 10.9. Fitnessverlauf Trippelschritte und Drückbewegungen
Ein weiterer Versuch mit vier Beinen führte zu einem etwas zufriedenstellenderen Ergebnis. Der Fitnessverlauf dieses Versuchs ist in Abbildung 10.10 dargestellt.
102
Fitness
10.4 Bewegen vordefinierter Körper
avg
max
1
4
7
10 13
16
19 22
25
28
31 34
37
40 43
46
49 52
55
58 61
Ge ne r ation
Abbildung 10.10. Fitnessverlauf krebsgleich
Eine hierbei entwickelte Kreatur arbeitet mit vier angewinkelten Beinen und
bewegt sich durchaus krebsgleich. Allerdings hindert sie sich auch häufig selbst
mit ihren eigenen Bewegungen, so dass diese nicht schneller erfolgt als bei den
anderen. Auffällig an diesem Versuch ist die hohe Maximalfitness in der letzten
Generation. Wäre der Versuch nicht auf 60 Generationen beschränkt gewesen,
hätte hier vielleicht noch eine weitere Verbesserung erfolgen können.
10.4.3 Vierbeiner
Der hier vorgestellte Körperbau lehnt sich an unterschiedliche vierbeinige Tiere
aus der Natur an. Eine solche Versuchsreihe lohnt sich besonders, da viele Vergleichsmöglichkeiten durch Haustiere wie Hunde, Katzen oder Frösche gegeben
sind.
Körperbau
Abbildung 10.11 zeigt unterschiedliche Anatomien, mit denen Versuche gemacht
wurden. Auch hier wurden immer mehr Einschränkungen bezüglich des Bewegungsapparats vorgenommen, um ein immer besseres Ergebnis zu erzwingen; daher
wurden in der Regel nur Scharniergelenke zur Verbindung der Glieder verwendet.
Abbildung 10.11. Vierbeiner
10.4 Bewegen vordefinierter Körper
103
Verwendete Gehirne
Auch diese Art der Anatomie konnte in der Regel bessere Ergebnisse mit Neuroevolution hervorbringen. Es gab zwar auch positive Erscheinungen, die ihre Bewegungen auf die durch genetische Programmierung entwickelten Berechnungsbäume
stützen, aber die besten und effektivsten Fortbewegungsstrategien verwenden neuronale Netze.
Ergebnisse
Fitness
Ähnlich wie bei den Spinnentieren wurden für die Vierbeiner ausschließlich Fitnessberechnungen in X-Richtung vorgenommen. Neben vielen guten Ergebnissen
sind auch diese Kreaturen häufig auf der Seite gelandet, bevor sie es verstanden,
sich sicher vorwärts zu bewegen.
Eine besonders interessante Lösung eines Vierbeiners ist eine rückwärtige Bewegung, deren Fitnessverlauf in Abbildung 10.12 dargestellt ist. Hier konnte die
Kreatur die seitlich liegenden Beine nur nach hinten drehen. Durch anschließendes
Anziehen des Torso kommt die rückwärtige Bewegung zu Stande.
avg
max
1
4
7
10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70
Ge ne r ation
Abbildung 10.12. Fitnessverlauf rückwärtige Bewegung
Aufgrund dieser Erkenntnisse wurde die Bewegungseinschränkung der Beine
nach vorne verlegt, so dass sich die Kreatur auch in die richtige“ Richtung schieben
”
kann. Abbildung 10.13 zeigt den Fitnessverlauf dieses Versuchs.
10.4.4 Sonstige
Im Laufe der Arbeit wurden noch viele weitere Versuche mit allerlei Anatomien
durchgeführt, die scheinbar zu wenig eingeschränkt wurden, zu kompliziert waren
104
Fitness
10.4 Bewegen vordefinierter Körper
avg
max
1
4
7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79
Ge ne ration
Abbildung 10.13. Fitnessverlauf vorwärtsgerichtete Bewegung
oder für die hier eingesetzten Methoden nicht trainierbar sind. Es wurden Versuche mit stark segmentierten Kreaturen gemacht, die an Insekten erinnern oder
Würmern und Schlangen nachempfunden sind. Hierbei sind zwar Bewegungen entstanden, allerdings konnten selbst die besten Individuen dieser Versuche, die ihnen
gestellten Aufgaben nicht zufriedenstellend erfüllen.
11
Zusammenfassung und Ausblick
In dieser Arbeit gab es viele Höhen und Tiefen. Viele Rückschläge, aber auch viele
Fortschritte. Es hat sich gezeigt, dass die Methoden des Softcomputing ihre Grenzen haben, und dass die Simulation von Leben keine einfache Aufgabe darstellt.
Dabei lagen die Ziele dieser Arbeit, vornehmlich gute Bewegungsmechanismen entwickeln zu lassen, noch relativ niedrig. Aber allein die Schwierigkeiten, die sich aus
dieser noch eher harmlosen Aufgabenstellung ergeben haben, zeigen, dass sich auf
diesem Gebiet noch viel tun muss. Es zeigt, dass wir noch weit entfernt von der
Erschaffung künstlichen Lebens sind, wie es sich die anfangs erwähnten Sagen oder
Utopien vorstellen.
Ein kleiner Schritt für eine Kreatur, ein grosser Schritt in Richtung künstliches Leben. Diesen Satz würde ich nur zu gerne unterstreichen, aber es zeigen sich
doch noch erhebliche Schwierigkeiten, die es zu lösen gilt. Komplexe Aufgaben
scheinen für die hier erdachte Art der künstlichen Lebewesen noch nicht möglich
zu sein. Andere Projekte, die die Bewegung ihrer Lebewesen bereits voraussetzen,
konnten schon erste Erfahrungen mit Gruppendynamik, Parasitismus und anderen
Phänomenen, die uns die Natur lehrt, sammeln. Die Welt der dreidimensionalen
künstlichen Lebewesen ist von diesem Schritt wohl noch weit entfernt. Diese Feststellung soll aber nicht entmutigen, den Weg, den Karl Sims begonnen hat, zu
Ende zu gehen. Es zeigt viel mehr, dass hier ein Feld vorhanden ist, das noch nach
vielen Lösungen und Möglichkeiten verlangt.
Ein weiterer Gemeinplatz, der zu dieser Arbeit passt, lautet: Der Weg ist das
Ziel. Denn nie zuvor konnte ich Einblicke in so viele Bereiche der Informatik und
auch außerhalb der Informatik gewinnen. Das Thema künstliches Leben ist breiter gefächert als alle anderen mir bekannten Bereiche der Informatik. Hier hat
mich der Weg von der jüdischen Geschichte über Klassiker der Literatur bis hin zu
modernsten Hollywoodproduktionen geführt. Die Biologie war ein ständiger Begleiter bei der Analyse der genetischen Algorithmen oder neuronalen Netze. Diese
Arbeit hat mir erste Einblicke in die 3D-Programmierung erlaubt, die in meinem
bisherigen Studium nur durch einige Randbemerkungen in der Vektorrechnung
aufgetaucht ist und der ich bisher immer ein wenig skeptisch begegnet bin. Meine
Skepsis behalte ich weiterhin, sehe aber viele Möglichkeiten dieser Technologie, die
zur Zeit vielleicht noch ungenutzt sind. Allein die Lektüre des Buches von Mainzer
([Mai03]) war die Wahl zu dieser Arbeit wert. So diskutiert dieses Buch nicht nur
11 Zusammenfassung und Ausblick
106
Sinn und Unsinn künstlicher Lebewesen oder künstlicher Intelligenz, es fasst auch
das gesamte Studium, das ich an der Fachhochschule genießen durfte, unter dem
Aspekt des künstlichen Lebens zusammen. Dies beweist erneut die hohe Vielfalt
des gewählten Themas, vor allem bezüglich der Informatik. Grundlegende Konzepte, wie die binäre Kodierung und alles, was mit ihr einhergeht, Bäume, Listen
und viele weitere, konnten wiederholt werden. Die Komplexitätstheorie hat mich
ebenfalls ständig verfolgt, bin ich doch über NP-vollständige Probleme wie das
TSP gestolpert und wurde von Zustandsexplosionen überrumpelt. Alles in allem
lässt sich deshalb sagen, dass sich diese Arbeit gelohnt hat. Viel Neues, aber auch
sehr viel Bekanntes ist mir begegnet, was nebenbei zu interessanten und manchmal
auch erheiternden Ergebnissen geführt hat.
Ausblickend lässt sich einiges zu dieser Arbeit sagen, da sich nur die wenigsten
der anfänglich erdachten Ideen umsetzen ließen. Die anfänglichen Schwierigkeiten,
erste brauchbare Ergebnisse zu verzeichnen, und die dadurch fehlende Zeit, haben
mir hier ein Schnippchen geschlagen.
Was ich nur zu gerne gemacht hätte, denn ich bin ein großer Fußballfan, wäre, einen kleinen Bezug zur bevorstehenden Fußballweltmeisterschaft herzustellen.
Im einfachsten Fall könnte ich mir hier eine Art Torwand- oder Elfmeterschießen
vorstellen, bei dem eine Kreatur ein Tor oder ein definiertes Ziel mit einem Ball
treffen muss. Ein Spiel Kreatur gegen Kreatur oder gar ein Mannschaftsspiel zu
simulieren, liegt, nach meinen jetzigen Erfahrungen, wohl noch in weiter Ferne.
Aber zum Glück können sich die Robotiker ja auf diesem Gebiet austoben.
Die Kinderuni wird ein immer beliebterer Termin im Kalender der Fachhochschule. Hier können Schüler aber auch ihre Eltern oder Lehrer Einblicke in die
Arbeit der Studenten in den unterschiedlichsten Fachbereichen sammeln, wodurch
sich die Fachhochschule auch nach außen sehr gut präsentieren kann. Für solche
Termine wäre ein grafischer Editor interessant, mit denen die Schüler ihre eigenen
Kreaturen zusammen bauen könnten und später sehen, wie sich ihre Kreatur im
Vergleich zu denen ihrer Mitschüler entwickelt. Eine ähnliche Idee verfolgt ja bereits der virtuelle Fishtank von Nearlife, der sich im Museum of Science in Boston
befindet.
Eng damit verbunden ist die geometrische Beschreibung der Kreaturen, die
sich bisher nur auf Quader reduziert. Es besteht hier durchaus die Möglichkeit,
beliebig geformte Körper zu entwerfen und sie in der hier erstellten physikalischen
Umgebung zu simulieren. Auch dies wäre mit einem speziellen grafischen Editor
möglich. Diese Arbeit hatte aber das vorrangige Ziel, auch den Körperbau der
Kreaturen der Evolution zu unterwerfen. Wäre die Erzeugung von Bewegungen
oder das Erfüllen einer bestimmten Aufgabe für vorgegebene Körper Ziel dieser
Arbeit gewesen, hätte die Entwicklung eines solchen Editors mit Sicherheit früher
Anklang gefunden.
Aber erst wenn das Erlernen der Bewegungsabläufe kein Problem mehr darstellt, lassen sich andere Aufgaben angehen. Ich denke da weiterhin an Dinge wie
Energiehaushalt, Nahrungsaufnahme, Jagen oder Flüchten, Gruppendynamik und
alles, was damit einhergeht. Ein Schritt in Richtung offene Evolution, die auch in
dieser Arbeit berücksicht werden sollte, aber immer noch in weiter Ferne liegt, wä-
11 Zusammenfassung und Ausblick
107
re vielleicht die Einführung von Trieben, die die Kreaturen zum Handeln bewegen
und die die hier noch verwendete Fitnessfunktion ersetzen würden.
Nicht völlig ohne Ironie und einem Augenzwinkern möchte ich daher diese Arbeit mit den Worten von Ian Malcom aus dem Film Jurassic Park, verkörpert von
Jeff Goldblum, beenden:
Das Leben findet einen Weg.“
”
Literatur
Ada98. Adami, Christoph: Introduction to Artificial Life. Springer/Telos,
1998.
Bou99. Bouvier, Dennis J: Getting Started with the Java 3D API, 1999.
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch0.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch1.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch2.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch3.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch4.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch5.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch6.pdf
http://java.sun.com/products/java-media/3D/collateral/j3d_
tutorial_ch7.pdf.
Caw03. Cawsey, Alison: Künstliche Intelligenz - im Klartext. Prentice Hall,
2003.
CS04.
Christopher Schnell, Sascha Strasser: Java 3D - Ein Überblick
der API, 2004.
http://java3d.j3d.org/downloads/Java3D_schnell_tutorial.pdf.
DN94. Detlef Nauck, Frank Klawonn, Rudolf Kruse: Neuronale Netze
und Fuzzy-Systeme. Vieweg, 1994.
DS04. David Schneider, Markus Kettern: Physiksimulation, 2004.
http://www.schneiderlein.com/robotik/Physiksimulation.pdf.
Ebe04a. Ebert, Jens: Quaternionen-Mathematik, 2004.
http://www.games-net.de/resource.php?action=download&id=526.
Ebe04b. Ebert, Jens: Rotationen, 2004.
http://www.games-net.de/resource.php?action=download&id=525.
Literatur
Eid05.
GC02.
Got05.
HB89.
IG04.
JS91.
Kin96.
Mai03.
Mar05.
McL02.
MCV01.
Roj91.
Rue04.
Sim94a.
Sim94b.
Smi04.
Thr94.
Wol02.
Zel94.
109
Eiding, Joachim: Künstliche Intelligenz - Kleinstroboter können sich
nach Vorbild der DNA replizieren, 2005.
http://www.heise.de/tp/r4/artikel/21/21076/1.html.
George Coulouris, Jean Dollimore, Tim Kindberg: Verteilte
Systeme - Konzepte und Design. Addison-Wesley, 2002.
Gottwald, Tim: Dynamisches Testen, Januar 2005. Seminararbeit
Softwarequalitätsmanagement, Fachhochschule Trier.
Horst Bayrhuber, Ulrich Kull, Ulrich Bäßler Albert Danzer: Lindner Biologie. Schroedel, 1989.
Ingrid Gerdes, Frank Klawonn, Rudolf Kruse: Evolutionäre Algorithmen. Vieweg, 2004.
Jeanette Stanley, Evan Bak: Neuronale Netze - Computersimulation biologischer Intelligenz. Systhema, 1991.
Kinnbrock, Werner: Künstliches Leben - Anspruch und Wirklichkeit.
Oldenbourg, 1996.
Mainzer, Klaus: Computerphilosophie. Junius, 2003.
Marbach, Daniel: Evolution and Online Optimization of Central
Pattern Generators for Modular Robot Locomotion, 2005.
http://birg.epfl.ch/webdav/site/birg/users/136698/public/
Master/Master%20Thesis%20Marbach.pdf.
McLaughlin, Brett: Java & XML. O’Reilly, 2002.
Mihai-Christian Varcol, Holger Türk, Volker Strunk Daniel Sawitzki André Roß Michael Gregorius Abdeladim Benkacem Christian Aue Salah Raiyan Abdallah: Simulator für GPevolvierte Laufrobotersteuerungsprogramme, 2001.
http://sigel.sourceforge.net.
Rojas, Raùl: Theorie der neuronalen Netze - Eine systematische Einführung. Springer, 1991.
Ruebsamen, Gene: Evolving Efficient Locomotive Strategies in Embodied Agents, 2004.
http://www.erachampion.com/ai/src/embodied_agents.pdf.
Sims, Karl: Evolving 3D Morphology and Behavior by Competition. Seiten 28–39. Artificial Life IV Proceedings, 1994.
Sims, Karl: Evolving Virtual Creatures. Seiten 15–22. Computer Graphics (Siggraph ’94 Proceedings), 1994.
Smith, Russel: Open Dynamics Engine v0.5 User Guide, 2004.
http://ode.org/ode-latest-userguide.pdf.
Thro, Ellen: Künstliches Leben - Eine spielerische Entdeckungsreise.
Addison Wesley, 1994.
Wolfram, Stephen: A new kind of science. Wolfram Media, 2002.
Zell, Andreas: Simulation Neuronaler Netze. Addison-Wesley, 1994.
Herunterladen