Zelluläre Automaten - Bakterien

Ablagerungen und Anlagerungen

Ab-, bzw. Anlagerung ist die einfachste denkbare Wachstumsform. Biologische, chemische sowie rein physikalische Prozesse können als Ablagerungswachstum bezeichnet werden. Ein Objekt wächst dabei nicht unbedingt aus "eigener" Kraft, sondern übernimmt die Elemente, aus denen es besteht, direkt aus seiner Umgebung ohne sie gezielt zu verändern.
Einmal bestehende Elemente eines Objekts bleiben wie und wo sie sind. Damit ist das Hauptprinzip des Wachstums durch An- und Ablagerung charakterisiert.
Betrachten wir ein Glas Wasser, in das wir einen Löffel Sand und Erde gegeben haben. Jedes Sedimentkörnchen, das auf dem Grund des Gefäßes angekommen ist, bleibt unweigerlich dort. Auf dem Boden wächst langsam eine lockere Schicht Schlamm, die oberen Lagen stützen sich auf den unteren ab.
Den gleichen Effekt können wir bei Korallenriffen beobachten: Auf dem Meeresgrund wächst eine Schicht Korallen heran. Bald wachsen andere Korallen darüber und die unteren Lagen sterben ab. Aber das Kalkgerüst bleibt als Basis für die oberen Schichten bestehen.
Die Kristallisation folgt denselben Regeln: Freie Moleküle in einer Lösung (z.B. Salz in Wasser) fügen sich an einem Punkt des bestehenden Kristalls an und bieten damit Fläche für neue freie Moleküle.
Wie aber können drei Wachstumsvorgänge mit ein und dem selben Konstruktionsprinzip drei derart verschiedene Endformen hervorbringen? Diese Frage werden wir beantworten.

Kehren wir noch einmal zum Wasserglas zurück: Welche Komponenten treten in diesem Gedankenexperiment auf?

Mit diesen Fakten können wir bereits ein erstes, einfaches Computerprogramm schreiben, das die Zufallsanlagerung an einen Punkt simuliert. Zuerst definieren wir ein Spielfeld in Form einer Matrix mit festen Grenzen (z.B. 400 * 400 Punkte), und einen maximalen Radius Max_Radius, den die Figur erreichen soll (mit Vorteil den halben Matrixdurchmesser, also 200).
Auf jedem Punkt dieser Matrix kann eine Ganzzahl von 0 bis 255 stehen. Es gelten folgende Definitionen:

-  0 Leer
-  1 Ein besetzter Nachbar
-  2 Zwei besetzte Nachbarn
-  ... ...
-  8 Acht besetzte Nachbarn
- 10 Besetzt
- 99 Außerhalb

Außerdem definieren wir einen Parameter Radius, der die aktuelle Größe der Figur angibt.

Dann nehmen wir einen Startpunkt in der Mitte auf unserem Spielfeld an, d.h. wir weisen ihm den Wert 10 für "Besetzt" und den anliegenden Punkten den Wert 1 für "Ein besetzter Nachbar" zu. Es könnten auch mehrere Startpunkte angenommen werden. Allen Punkten, die mehr als Radius + 10 Einheiten vom Startpunkt entfernt sind, weisen wir den Wert 99 für "Außerhalb" zu.

Matrix

Bild N° 1: Matrix

Sobald die Matrix derart präpariert ist,  lassen wir einen Punkt einen zufälligen Weg von der Grenze zwischen Leer und Außerhalb (Kreis(M, Radius)) aus über den Bildschirm "wandern", in dem wir ein Koordinatenpaar (xWander, yWander) zufällig manipulieren. Trifft der wandernde Punkt an einen besetzten Punkt, so wird er an der Seite, an der er den Punkt getroffen hat, mit einer gewissen Wahrscheinlichkeit angelagert, d.h. ebenfalls zu einem besetzten Punkt. Ist das geschehen, so nehmen wir einen neuen Wanderpunkt an und so weiter... (Bild  N° 2). Dabei ist nicht zu vergessen, den Parameter Radius laufend der Größe der Figur anzupassen und dementsprechend die Grenze Außerhalb / Leer weiter zu ziehen.
Den ganzen Vorgang wiederholen wir solange, bis der Radius der Figur unseren Wünschen, d.h. dem Wert Max_Radius entspricht.

Wanderpunkt

Bild N° 2

Bevor wir zu den Ergebnissen kommen, geben wir hier das Programm wieder. Zuerst in einem Algorithmenschema (Flussdiagramm), dann im Volltext. Um das Programm zu testen, sind zwei Grafikelemente notwendig: Einen Command-Button mit dem Namen “CoStart“ und ein Bildfeld mit dem Namen “Picture1“, das mindestens 200 * 200 Bildpunkte groß ist.

[Programm überspringen]

Flussdiagramm

'Allgemeine Definitionen
Const pi = 3.1415965357
Dim x As Integer, y As Integer 'Koordinaten

'Matrixdefinitionen
Const xMax = 200, yMax = 200 'Randbegrenzung
Const Max_Radius = 100 'Maximaler Radius
Dim Punkt(-5 To xMax + 5, -5 To yMax + 5) As Byte 'Matrix mit"Reserverand"

'Graphik
Const Wahrscheinlichkeit = 1
'Wahrscheinlichkeit, mit der ein Punkt angelagert wird.
Const Leer = 0 'Feldzustände

'Zustände 1 bis 8 für Anz. schwarze Nachbarn
Const Schwarz = 10, Aussen = 99

Dim Radius As Integer 'Aktueller Radius
Dim xWander As Integer , yWander As Integer 'Wander- Punkt Koordinaten

'Wege
Dim Wx(0 To 7) As Integer 'Möglichkeiten der x-Verschiebung
Dim Wy(0 To 7) As Integer 'Möglichkeiten der y-Verschiebung
Dim n As Byte 'Zähler für Verschiebungen

Sub Graphik()

'Matrix präparieren
Punkt(Max_Radius, Max_Radius)= Schwarz 'Fixpunkt setzen
For n = 0 To 7
  Punkt(Max_Radius + Wx(n), Max_Radius + Wy(n)) = 1 '...Nachbar
Next n

Picture1.PSet(Max_Radius, Max_Radius), RGB(0, 0, 0)

For x = -5 To xMax + 5 'Randbegrenzungen und Nachbarn
For y = -5 To yMax + 5
 If Sqr((x - Max_Radius) ^ 2 + (y - Max_Radius) ^ 2) > Radius + 10 Then Punkt(x, y) = Aussen
Next y
Next x

'Hauptschleife
Do While Radius + 10 <= Max_Radius 'Wiederhole bis Max_Radius

 'Wander-Punkt zufällig auf dem Kreis mit r = Radius Wählen
  xWander = Cos(Rnd(1) * 2 * pi) * (Radius + 10) + Max_Radius
  yWander = Sin(Rnd(0) * 2 * pi) * (Radius + 10) + Max_Radius

100 'Aktuelle Position zufällig in eine von 8 Richtungen verschieben
 xWander = xWander + Wx(Int(Rnd(1) * 8))
 yWander = yWander + Wy(Int(Rnd(0) * 8))

 'Kontrollieren der Randbegrenzungen
 If Punkt(xWander, yWander) = Aussen Or Punkt(xWander,yWander) = Schwarz Then
  xWander = xWander - Wx(Int(Rnd(0) * 8))
  yWander = yWander - Wy(Int(Rnd(0) * 8))
 End If

 'Versuchen neuen Punkt anzulagern falls schwarzer Nachbar
If Not Punkt(xWander, yWander) = Leer And Punkt(xWander, yWander) < Schwarz And Rnd(1) > (1 - Wahrscheinlichkeit) ^ Punkt(xWander, yWander) Then Punkt(xWander, yWander) = Schwarz
  Picture1.PSet(xWander, yWander), RGB(0, 0,0)
 For n = 0 To 7

If Not Punkt(xWander + Wx(n), yWander + Wy(n)) = Schwarz Then Punkt(xWander + Wx(n), yWander + Wy(n)) = Punkt(xWander + Wx(n), yWander + Wy(n)) + 1
 Next n
 GoTo 200 'Neuer Punkt
 Else
 GoTo 100 'Kein neuer Punkt
End If

200 'Randbegrenzungen erweitern falls nötig
 If Sqr ((xWander - Max_Radius) ^ 2 + (yWander - Max_Radius) ^ 2) > Radius + 5 Then
  Radius = Sqr((xWander - Max_Radius) ^ 2 + (yWander - Max_Radius) ^ 2)
 For x = Max_Radius - Radius - 10 To Max_Radius + Radius + 10
 For y = Max_Radius - Radius - 10 To Max_Radius + Radius + 10
   If Sqr((x - Max_Radius) ^ 2 + (y - Max_Radius) ^ 2) < Radius + 10 And Punkt(x, y) = Aussen Then Punkt(x, y) = Leer
 Next y
 Next x
 End If
 Loop

 End Sub

Private Sub CoStart_Click()

Wx(0) = 1:  Wy(0) = 1 'Wege definieren
Wx(1) = 0:  Wy(1) = 1
Wx(2) = -1: Wy(2) = 1
Wx(3) = 1:  Wy(3) = 0
Wx(4) = -1: Wy(4) = 0
Wx(5) = 1:  Wy(5) = -1
Wx(6) = 0:  Wy(6) = -1
Wx(7) = -1: Wy(7) = -1

Zufall
Graphik
End Sub

Folgende Ausgaben (Bild N° 3a, 3b, 3c) erhalten wir mit genau den vorgeschlagenen Parametern. Die Punkte sind nach dem Zeitpunkt ihrer Anlagerung eingefärbt. Man kann sehr gut eine Verzweigungsstruktur erkennen, die wir nun etwas genauer untersuchen wollen.

Anlagerung a Anlagerung b Anlagerung c

Bild N° 3 a) - c) Anlagerung mit den Parametern w=1, w=0,1 bzw. w=0,01

Wie kommt eine solche Struktur überhaupt zustande? Warum haben wir nicht einfach einen formlosen Klumpen sondern sehr organisch wirkende Muster auf unserem Bildschirm?
Eine einfache Überlegung lüftet das Geheimnis: Die Spitzen wachsen schneller als der Rest, weil die Wahrscheinlichkeit weit größer ist, dass ein Punkt sich zuäußerst anlagert als dass er sich bis nach ganz innen durchmanövriert.

Wir können die Wahrscheinlichkeit, mit der ein neuer Punkt an einem bestimmten Ort angelagert wird, experimentell ermitteln: Zuerst halten wir das Wachstum der Figur an, indem wir die Zeile

Punkt(xAlt, yAlt)= Besetzt
'Punkt in der Matrix auf Besetzt setzen

löschen. Dann zählen wir mit einer zusätzlichen Variable, wie oft der Wander-Punkt an diesem Ort ankommt. Je öfter er das tut, desto größer ist die Wahrscheinlichkeit, dass sich an dieser Stelle ein Punkt anlagert.
Wir haben für das folgende Bild (N° 4 a) sämtliche Punkte - mit einer beträchtlichen Menge an Rechenaufwand - analysiert. Punkte mit der gleichen Wahrscheinlichkeit wurden mit derselben Farbe gekennzeichnet.

Potentiallinien a Potentiallinien b

Bild N° 4a) Experimentelle Ermittlung,            Bild N° 4b) Rechnerische Ermittlung

Mit diesem experimentellen Verfahren kann ein zwar richtiges, aber nur sehr schlecht erkennbares Resultat erreicht werden. Wir haben ein weiteres, rein rechnerisches Verfahren angewandt, das ein weitaus zufriedenstellenderes Ergebnis liefert: Bild N° 4 b). Die Grenzen zwischen den Streifen sind die Äquipotentiallinien der Figur. Auf einer Äquipotentiallinie ist die Wahrscheinlichkeit, dass sich ein Punkt anlagert, überall gleich groß. Jeden Streifen nach innen sinkt die Wahrscheinlichkeit um 90%, also sehr schnell.
Eine weitere Analyse, die wir am selben Bild durchführen wollen, ist die sogenannte Horton-Analyse. Wir klassifizieren die Äste in Hauptäste (Ordnung 1), Nebenäste (Ordnung 2), Nebennebenäste (Ordnung 3), etc. Dann vergleichen wir die Anzahl und die Größe der Äste der verschiedenen Ordnungen.

Horton a Horton b

Bild N° 5a) und 5b) Horton-Analyse

Für die Horton-Analyse eignen sich nur Bilder mit w ≈ 1, da bei den anderen keine klaren Verzweigungen zu erkennen sind. Die Anzahl der Äste wächst mit jeder Unterordnung etwa um den Faktor 5. Ihre durchschnittliche Länge nimmt dabei um ca. 10/27 ab. Damit steigt die Gesamtmasse jeder Ordnung um 185 %.

Als letzte Analyse wollen wir die fraktale Dimension des Gebildes ermitteln und diese in Relation mit dem Parameter w stellen. Den Begriff der fraktalen Dimension erklären wir im nachfolgenden Exkurs.

Exkurs N° 6: Fraktale Dimension

Für unsere Figur hieße das nun, dass ihre fraktale Dimension für den Parameter w = 1 berechnet wird zu log 5/log 2.7

Mit einer anderen Methode1 haben wir auch die fraktale Dimension für andere w untersucht. Dabei zeigt sich folgende Abhängigkeit:

Fraktale Dimension

Eine Reihe von Naturvorgängen zeigen das gleiche Wachstumsprinzip.
Wir können den natülichen Formen mit denselben Mitteln eine fraktale Dimension und mit Hilfe der obigen Funktion einen Parameter w zuordnen. Dies könnte z.B. als Klassifikationshilfe dienen oder als Hinweis auf physikalische Eigenschaften.
Die im Exkurs vorgestellten Zinksulfaltblättchen weisen eine fraktale Dimension von 1.87 auf. Wir folgern daraus, dass sich ein freies Zinkatom mit der Wahrscheinlichkeit w = 1·10-13  an die bestehende Figur anlagert.

1Es handelt sich dabei um die sogenannte Box-Count-Methode. Siehe Michael F. Barnsley: "Fractals Everywhere", S.197. [zurück]

Exkurs N° 7: Zinksulfat Experiment