Biologische Grundlagen

1 Biologische Grundlagen

Aufbau und Funktionsweise der DNA

DNS/DNA(Desoxyribonukleinsäure/-Acid[engl. Acid: Säure]) codiert Aminosäuren, die Bestandteile des Lebens. DNA besteht hauptsächlich aus vier Grundmolekülen, den Basen: Adenin, Guanin, Thymin und Cytosin(A,T,G,C) Jeweils zwei von ihnen können miteinander eine Verbindung eingehen: A und T, C und G. Wie wir hoffentlich alle noch aus dem Biologieunterricht wissen, (ansonsten:[Wiki1]-Kapitel 7), besteht DNA aus vielen dieser Brückenbausteine(Basenpaare), der Reihe nach angeordnet.
… ATC GGA ATC CCT …
… | | | | | | | | | | | | …
… TAG CCT TAG GGA …

Drei dieser „Stufen„ bilden ein sog. Codon, also die kleinste Informationseinheit im Gencode. Eine Mutation eines Codons wird Allel genannt. Da man jede Stufe in jeder Richtung in den Genstrang einfügen kann(A-T,T-A;C-G,G-C), ergeben sich 4^3 = 64 mögliche Kombinationen, um eine Informationseinheit zu codieren. Da es aber nur 20 Aminosäuren gibt, müssen einige von ihnen mehrfach codiert sein! Biologen haben herausgefunden, welche Kombination welche Aminosäure codiert. Das Ergebnis: Einige sind einfach codiert, einige mehrfach, bis zu sechs mal, um genau zu sein. In der Informatik nennt man dies Form der Kodierung gemeinhin „Redundanz„ und wird benutzt, um zum Beispiel häufige Tippfehler zu korrigieren, indem man verschiedene Schreibweisen eines Wortes eindeutig einer richtigen Schreibweise zuordnet. Sicherlich wird die Natur auch hier korrigieren „wollen„ und häufig benutzte Aminosäuren bevorzugt auswählen bzw. häufig auftretende Fehler vermeiden.

Natürliche Kodierung der Erbinformationen

Die Informationen über Aminosäuren werden in unseren Genen auf recht einfache Art und Weise kodiert. Jedes Basen-Triplett(drei eufeinanderfolgende Basenpaare) codiert eine Aminosäure:
… ATC GGA ATC CCT …
… | | | | | | | | | | | | …
… TAG CCT TAG GGA …
… Ile Gly Ile Pro …

(Ile: Isoleucin,Gly: Glycosin, Pro: Prolin)

Aminosäuren sind komplexe Kohlenstoffverbindungen, die, tausendfach zusammengesetzt, einzelne Zellen oder Flüssigkeiten bilden. Die Struktur eines Lebewesens ist sehr komplex, wobei sich der Grad der Komplexität zwischen Tieren/Menschen und Pflanzen um einige Potenzen unterscheidet. Nach genaueren Untersuchungen der Genome verschiedenster Spezies ist man zum vorläufigen Schluss gekommen, dass sich der Aufbau und das Zusammenspiel der Zellen und Organe von Pflanzen sowie Tieren allein aus der Reihenfolge der Basen-Tripletts ergeben. Spricht man über Bakterien und einige Pflanzen, so mag das stimmen. Wendet man sich aber tierischen Genomen zu, so wird man sich schnell klar werden, dass die alleinige Anordnung der Gene, was gleichbedeutend wäre mit dem einfachen sequentiellen Ausführen einiger „Bauvorschriften„, bei weitem nicht fähig ist, derartig komplexe Strukturen, wie z.B. die eines Gehirns hervorzubringen. Das belegt auch die Tatsache, dass die Reispflanze über weitaus mehr Gene verfügt, als der Mensch. und wenn wir sie uns genauer ansehen, werden wir feststellen, dass sie keine derartige Komplexität erreicht hat, wie der Mensch.

Forscher haben bei ihren Untersuchungen sog. „Müll/Junk-DNS„ gefunden, die in allen tierischen Genomen vorkommt. Diese Form der DNS tritt im Wechsel mit gewöhnlicher, proteinkodierender DNS auf und wird Intron genannt, abgeleitet von der Tatsache, dass sie zwischen die kodierenden Teile, die Exons eingeschoben sind. Dieser angebliche Müll füllt 99% unseres Genoms aus. Hier wird deutlich, dass die Forschung bisher in die falsche Richtung verlief. Warum sollte die Natur so viel unnütze Erbinformationen mit sich herumtragen? Neueste Theorien deuten darauf hin, dass diese Informationen keineswegs unnütz sind, sondern eine entscheidende Rolle bei der Herausbildung unterschiedlicher Zellen spielt. Um den Gegenstand der Diskussion zu verdeutlichen folgt nun der schematische Aufbau unserer DNS:

Intron|Exon|Intron|Exon|Intron|Exon|Intron|Exon|Intron|Exon|…

Intronsequenzen werden vor der Herstellung eines Proteins ausgelesen und dafür genutzt, festzulegen, an welcher Stelle das Protein abgelegt werden soll. Man kann diesen Vorgang damit vergleichen, ein Haus zu bauen. Dafür braucht man zwei Dinge: eine Materialliste und einen Bauplan. Würde man diese Liste nach Art der Genomcodierung aufschreiben würde das wohl ungefähr so aussehen:

Material|Ort|Material|Ort|Material|Ort|…
Zement|Boden unter erste und zweite Ziegelposition|Stein|unterste Reihe, erste Position|Stein|unterste Reihe, zweite Position|Zement|unterste Reihe, zwischen erste und zweite Position|…

nach diesem Schema wird ersichtlich, dass viel weniger Information dafür gebraucht wird, welches Material genommen werden muss, als dafür, wohin das Material zu legen ist. Daraus lässt sich schnell erklären, warum der Anteil der Introns in unseren Genen so enorm ist. Wollen wir das Thema hier beenden und die weitere Forschung den Genetikern überlassen.

Begriffe

Man unterscheidet in der Genetik zwischen Genotyp und Phänotyp eines Individuums.

* Genotyp bezeichnet nichts anderes, als die Darstellung des Lebewesens in verschlüsselter Form, also den Genstrang, der in einer jeden Zelle enthalten ist.
* Phänotyp wird die äußere Form genannt, die entsteht, wenn man Moleküle, wie sie im Genstrang beschrieben sind, anordnet. Damit wird also das fertige „Produkt„ Lebewesen bezeichnet.

In der Natur wird diese Übersetzung innerhalb der Zelle vorgenommen und in lange Molekülketten umgesetzt. Die Zelle kann also als molekularer Computer angesehen werden, dessen Eingabedaten die Gene sind und der als Output Proteine produziert. Wir wollen hier ncht klären, woher diese Mechanismen kommen und wozu sie der Natur nutzen sollen, sondern überlassen das lieber der Biologie und Philosophie.

Man kann dieses Modell in zweierlei Richtungen für eigene, informatische, Zwecke gebrauchen. Erstens ließen sich damit „Computer im Reagenzglas„ ([StoStu]-Kapitel 7) bauen, die ihrerseits auch mit Molekülen als Input und Output arbeiten. Da wir jedoch nur beschränkt über die Chemie herrschen können, sollte für unser Ziel ein anderer Weg favorisiert werden: Man ahmt den Evolutionsprozess auf heutigen digitalen Computern nach und versucht damit komplexe Problem zu lösen.

Abstraktion eines Algorithmus

Um die Mechanismen der Evolution nutzen zu können, bedarf es natürlich eines Algorithmus. Da wir diesen ja frei abstrahieren können, werden wir ihn so einfach wie möglich gestalten.

1. erstelle einige zufällige Genketten
2. bestimme den Phänotyp der Genketten
3. ermittle, wie gut die Phänotypen ihre Aufgabe erfüllen
4. wähle die besten Individuen aus
5. Kreuze die Gene dieser Individuen und erstelle daraus Kindgene. Mutiere gegebenenfalls
6. Ersetze die schlechtesten Individuen durch die neuen Kindindividuen.
7. Falls Abbruchbedingung nicht erfüllt, Weiter bei Schritt 2, sonst Ende.

Im siebten Schritt muss eine Abbruchbedingung vorliegen. Die Natur hat soetwas natürlich nicht, aber sie ist ja auch kein Programm, das gewisse Probleme lösen und am Ende stehenbleiben soll. Im nachfolgenden Beispiel wird der Algorithmus besser veranschaulicht.

Einführungsbeispiel Rucksackproblem

Sie werden folgendes sicherlich kennen: der Urlaub steht bevor. Neben Kühlschrank, Fernseher, Hifi-Anlage und dem gesamten Kleiderschrank wollen sie auch noch einige Nahrungsmittel, Verbandszeug, Zeitungen, Seife, Töpfe, Waschmittel, Ersatzschuhe etc. in ihrem Rucksack mitnehmen? Das wird problematisch, da Sie als normaler Mensch selten mehr als 20 kg auf dem Rücken tragen wollen. Nun könnten sie den Kühlschrank zu Hause lassen und dafür den Verbandskoffer mitnehmen oder auch den Fernseher stehen lassen und dafür ein gutes Buch mitnehmen. Welche Kombination nun aber die gescheiteste ist, können sie aufgrund der vielen Gegenstände nicht sofort einschätzen.

Der sicherste Weg, die ideale Kombination herauszufinden ist, jedem Gegenstand einen persönlichen Wert zu geben, z.B. einen Wert zwischen 0 und 10 oder zwischen 0 und 100, wie sie wollen. Danach legen sie jedes Stück auf eine Waage und schreiben das Ganze in einer Tabelle auf. Die Letzte Spalte der Tabelle sagt uns, ob wir den Gegenstand mitnehmen(1), oder nicht(0). Unser Ziel ist es nun, die Kombination herauszufinden, die mit 20kg Gesamtmasse den höchsten Wert erreicht. Um eindeutig die beste Kombination an Gegenständen zu ermitteln, müsste man von allen möglichen Bepackungen diejenige finden, die am wertvollsten ist(Summe aller Wertigkeiten der mitzunehmenden Gegenstände), aber nur 20kg wiegt. Das macht bei nur 30 Gegenständen genau $ 2^30$ verschiedene Kombinationen. Ein moderner Computer vermag evtl. $ 2^9$ Rechenoperationen pro Sekunde auszuführen. Das macht bei $ 2^30$ Rechenoperationen $ 2^22$ Sekunden, was wiederum rund 48 Tagen entspricht. Schon bei 50 Gegenständen wächst die Rechenzeit auf gewaltige Siebzigtausend Jahre! Wir wollen hier einen wesentlich schnelleren Weg beschreiben. Tabelle zum Beispiel:
Gegenstand Persönlicher Wert Gewicht Mitnehmen?
Taschenmesser 8 0,2 kg Ja(1)
Kühlschrank 2 40kg Nein(0)
Verbandskasten 10 0,6 1
… … … …

Man kann diese Tabelle auch als Kette von Nullen und Einsen darstellen:
Gegenstand 1 2 3 4 …
Mitnehmen? 1 0 1 1 …

Sehen wir uns nur die unterste Zeile an, so könnte man diese als Gencode eines Binär-Lebewesens interpretieren, welches eine gepackten Rucksack beschreibt.

Genotyp: 1011101010001101110001100100
Phänotyp(Rucksack):
1. Taschenmesser: mitnehmen
2. Kühlschrank: nicht mitnehmen
3. Verbandskasten: mitnehmen
4. … :mitnehmen

Im ersten Schritt bedeutet das für unser Beispiel: wir erstellen einige zufällige Bitketten, z.B. acht Ketten der Länge 30, wenn 30 Gegenstände zur Auswahl stehen.
Diese werden im zweiten Schritt übersetzt, d.h. Die Bitkette wird Bit für Bit geprüft und im dritten Schritt wird die Wertigkeit und das Gewicht jedes Individuums(Rucksacks) ermittelt.. Findet das Programm an der aktuellen Position Pos eine 1, dann bedeutet das, der Gegenstand an Pos soll mitgenommen werden. Nun sucht man sich in der Tabelle an der angegebenen Stelle Gewicht und Wertigkeit des Gegenstandes heraus und speichert beide Werte. An Pos+1 wird sich evtl. wieder eine Eins finden, also muss auch dieser Gegenstand mitgenommen werden. Sein Gewicht wird auf das bisherige Rucksackgewicht aufaddiert, seine Wertigkeit auf den bisher erreichten Wert. Wenn die Bitkette vollständig geprüft wurde, wird zur nächsten übergegangen und der Vorgang wiederholt. Am Ende haben alle Rucksäcke ein spezifisches Gewicht und einen Wert.
Im dritten Schritt wird für jedes Individuum ein Fitness-Wert errechnet. Dieser gibt an, wie gut, oder fit ein Individuum ist. In unserem Fall entspricht die Fitness eines Rucksacks genau seinem Wert, d.h. je höher der Wert eines Rucksacks ist, desto fitter ist er.
Viertens werden alle Individuen nach ihrer Fitness geordnet und die N besten für die Fortpflanzung ausgewählt. Uns genügen erst einmal 4 Individuen.
Im fünften Schritt wird die Kreuzung vollzogen. Einfaches Bsp:

Kette 1: 0101011110011001010100001100
Kette 2: 0111010110100011101011001001

Es wird zufällig ein Schnittpunkt ausgesucht.(z.b. die Mitte), dann wird der erste Teil der ersten Bitkette und der zweite Teil der zweiten zu Kind Nr. 1 zusammengebaut. Aus den anderen Hälften wird ein zweites Kind erstellt:

Kette 1: 010101111001100|101010000110011
Kette 2: 011101011010001|110101100100101
Kind 1: 010101111001100|110101100100101
Kind 2: 011101011010001|101010000110011

Mutation wird realisiert, indem man für jede Stelle im Gencode zufällig eine Zahl A zwischen 0 und 1 bestimmt. Sollte $ A \\\\leq 0,5$ sein(was bei gleichverteilten Zufallszahlen in 50% der Versuche der Fall sein sollte), wird an der aktuellen Position ein Bitflip durchgeführt, d.h. Aus einer Eins wird eine Null und umgekehrt. Mit A kann man die Anzahl der Mutationen in einem Gen steuern. Wenn A klein ist( 0,03) dann wird selten mutiert, ist es groß, dann häufiger. Mutationen dienen dazu, neue Informationen in das Gen zu bringen.
Im sechsten Schritt werden die schlechtesten Individuen aus der Population entfernt und die Kindgene hinzugefügt. Normalerweise sollte die Zahl der aus der Population entfernten Individuen der Anzahl der Kind-Individuen entsprechen, um einen konstanten Fortlauf der Evolution zu gewährleisten.
Im siebten Schritt wird eine Abbruchbedingung abgefragt. In unserem Beispiel soll nach 500 Generationen Schluss sein und das bis dahin beste gefundene Individuum als Ergebnis präsentiert werden. Natürlich könnte man auch kompliziertere Abbruchbedingungen festlegen, wie z.B. dass erst aufgehört werden soll, wenn der beste Fitnesswert in der Population nach einer gewissen Zahl von Durchläufen keine oder nur geringe Änderungen erfährt.

Ein Beispieldokument, mit Openoffice-Calc und der integrierten Makro-Programmiersprache erstellt, liegt dem Aiccbot-Paket bei[OOoMak]7. Das Dokument bietet die Möglichkeit, Gegenstände und deren zugehörige Wertigkeit und Gewicht einzutragen. Ein GA wird nun damit beauftragt, geeignete Kombinationen zu finden. Dabei kann man mit der Anzahl der Durchläufe experimentieren. Ein Diagramm stellt die teilweise starken Fitnesssprünge dar und verdeutlicht so die relative Zufälligkeit aber auch die stetige Verbesserung der Ergebnisse.

Schreibe einen Kommentar