Haie und kleine Fische ======================== Nach einem Artikel von A. K. Dewdney in Spektrum der Wissenschaft Feb. 85. Allgemeines """"""""""" Das Programm HUKF simuliert ein isoliertes R„uber - Beute - System. Der Bildschirm stellt einen ganz von Wasser bedeckten Planeten dar, auf dem Haie und kleine Fische leben. Die kleinen Fische haben immer genug Plankton zu fressen. Sie schwimmen herum und vermehren sich. Die Haie ern„hren sich von kleinen Fischen. Auch sie schwimmen herum und vermehren sich. Dabei werden sie hungrig und gehen ein, wenn sie nicht rechtzeitig einen kleinen Fisch finden. Der Programmbenutzer kann am Bildschirm verfolgen, wie sich das Leben auf dem Planeten entwickelt. Dafr werden drei Darstellungsarten geboten: Die Realdarstellung (Ozean), welche die Tiere in Aktion zeigt. Eine Darstellung als Funktion, bei der die Anzahl der Tiere in Abh„ngigkeit von der Zeit aufgetragen ist. Ein Phasendiagramm, welches den Zusammenhang zwischen Haianzahl und Fischanzahl veranschaulicht. Der Simulationsablauf wird durch vorgegebene Parameter gesteuert, die beim Programmstart belegt werden, aber auch w„hrend der Simulation jederzeit zu „ndern sind. Parameter: Die Anfangszahlen von Haien und kleinen Fischen. Die Zeit, welche vergehen muž, bis sich ein Hai bzw k.F. zum ersten Mal vermehrt (auch einzelne Tiere vermehren sich!). Die Zeit zwischen zwei Vermehrungen bei Haien bzw. kleinen Fischen. Wielange ein Hai satt ist, nachdem er einen k.F. gefressen hat. Wielange ein Hai hungern kann, nachdem die satt - Phase zu Ende ist. Als Ergebnis vieler Simulationsl„ufe kann man feststellen, daž eine ann„hernd konstante Population nur bei sehr sorgf„ltiger Wahl der Parameter zu erreichen ist. Im Normalfall schwanken die Bev”lkerungszahlen stark und unregelm„žig, wobei - je nach Festlegung der Parameter - die Gefahr einer Katastrophe besteht. Dies entspricht auch dem in der Natur beobachtbaren Ablauf. In gnstigen F„llen zeigt die Funktionsdarstellung zwei um eine Viertelschwingung gegeneinander verschobene sinus„hnliche Kurven, welche grože Žhnlichkeit mit den L”sungen der Volterraschen Differentialgleichungen besitzen. Bedienungsanleitung """"""""""""""""""" Programm starten. Warten, bis die Werbung vorbei ist. Parameter nach Geschmack eingeben oder mit Return die vorgegebenen bernehmen. Simulation beginnt mit Darstellung des Ozeans. Zuschauen. Taste Help drcken. Aha, alles klar. Sicherheitshalber noch Anmerkungen zu T und Z: T h„lt das Programm an. Jetzt mit Leertaste oder Return einzelne Ticks ablaufen lassen. Dabei wird in zuf„lliger Reihenfolge jedes Tier einmal aktiviert. Nochmal T drcken und alles l„uft wieder normal. Z h„lt das Programm an. Das Tier, welches als n„chstes aktiviert werden soll, wird invers dargestellt. Leertaste oder Return drcken und die Bearbeitung wird durchgefhrt. N„chstes Tier wird invers dargestellt. Und so weiter. Nochmal Z drcken und alles l„uft wieder normal. Zu den Einzelheiten """"""""""""""""""" Der Planet besitzt die Form eines Torus (Autoreifen). Dieser wurde aufgeschnitten und auf den Bildschirm abgewickelt. Bei einer Torusoberfl„che ist das mit etwas Zerren und Dehnen m”glich. Die Oberfl„che einer Kugel kann man dagegen nicht in eine Ebene abwickeln! Der Bildschirm ist eingeteilt in 4000 Pl„tze von jeweils 8*8 Bildpunkten. Ein Platz ist entweder leer oder er ist von einem kleinen Fisch oder von einem Hai besetzt. Fisch bzw. Hai werden in der Betriebsart 'Ozean darstellen' auf den Bildschirm gezeichnet. Jeder Platz besitzt vier Nachbarn, links, rechts, oben und unten. Auch ein Platz am linken Bildrand hat einen linken Nachbarn. Er befindet sich in der gleichen Bildzeile ganz rechts. Analog verh„lt es sich bei den anderen Randzellen. Dies entspricht genau der Topologie eines Torus! Bei Beginn der Simulation belegt das Programm zuf„llig ausgew„hlte Pl„tze mit der verlangten Zahl von Haien (HAIE) und kleinen Fischen (KF). Bei jedem kleinen Fisch wird eine Zahl VERMEHRUNG notiert, welche einen Zufallswert zwischen 1 und der eingegebenen Wartezeit bis zur ersten Vermehrung bekommt. Bei jedem Hai wird eine Zahl NAHRUNG notiert, welche einen Zufallswert zwischen 1 und der Summe aus der eingegebenen Sattzeit und Hungerzeit bekommt. Zus„tzlich steht bei jedem Hai noch eine Zahl VERMEHRUNG, welche einen Zufallswert zwischen 1 und der eingegebenen Wartezeit bis zur ersten Vermehrung bekommt. Dann werden alle 4000 Pl„tze in einer pseudozuf„lligen Reihenfolge bearbeitet. Dabei kommt jedes Tier genau einmal dran, aber der Eindruck eines systematischen - etwa zeilenweisen - Vorgehens wird vermieden. Auf dem Bildschirm entsteht so ein regelloses Gewimmel. Ein solcher Durchlauf stellt einen Zeitschritt, Tick genannt, dar. Danach wird die Tastatur abgefragt, um Eingriffe etc. zu erm”glichen, die Anzahl der Ticks wird um eins erh”ht und der n„chste Durchlauf beginnt. Es folgt die Bearbeitungsvorschrift fr einen Platz """"""""""""""""""""""""""""""""""""""""""""""""""" Betrachte den Platz. Falls der Platz leer ist: Es gibt nichts zu tun. N„chster Platz. Falls das Tier auf dem Platz erst w„hrend des laufenden Ticks hierher gelangt ist, wurde es ja schon bearbeitet, also: Es gibt nichts zu tun. N„chster Platz. Falls sich ein kleiner Fisch auf dem Platz befindet: Suche einen freien Platz in der Umgebung. Falls keiner gefunden: Zeichne kleinen Fisch mit zuf„lliger Orientierung auf alten Platz. Verringere VERMEHRUNG um 1. Falls VERMEHRUNG dadurch 0 wird, h„tte er sich vermehren k”nnen: Setze VERMEHRUNG wieder auf 1. (kein Platz zum Vermehren!) Schreibe VERMEHRUNG zurck auf den Platz. N„chster Platz. Andernfalls wurde ein freier Platz gefunden: Zeichne kleinen Fisch mit zuf„lliger Orientierung auf neuem Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. Verringere VERMEHRUNG um 1. Falls VERMEHRUNG dadurch 0 wird, kann er sich vermehren: Erh”he KF um 1. Setze seine VERMEHRUNG auf den Wiederholungswert. Schreibe sie auf den neuen Platz. Schreibe auf den alten Platz den Anfangswert fr VERMEHRUNG. Zeichne kleinen Fisch mit zuf„lliger Orientierung auf altem Platz. N„chster Platz. Andernfalls kann er sich nicht vermehren: Schreibe VERMEHRUNG auf neuen Platz. L”sche alten Platz. N„chster Platz. Falls sich ein Hai auf dem Platz befindet: Verringere NAHRUNG um 1. Falls NAHRUNG dabei 0 wird, ist der Hai fast verhungert. Dann: Suche kleinen Fisch in der Umgebung. Falls einer gefunden: Verringere KF. Setze NAHRUNG auf HUNGER. Schwimme auf den Platz des kleinen Fisches. Notiere bei ihm, daž er bereits bearbeitet wurde. Nimm NAHRUNG und den alten Wert fr VERMEHRUNG mit. L”sche alten Platz. N„chster Platz. Andernfalls ist es aus mit dem Hai: Verringere HAIE. L”sche alten Platz. N„chster Platz. Andernfalls ist der Hai nicht fast verhungert, aber hungrig (NAHRUNG <= HUNGER). Dann: Suche einen kleinen Fisch in der Umgebung. Falls keinen gefunden: Suche freien Platz in der Umgebung. Falls keinen gefunden: Zeichne Hai auf alten Platz. VERMEHRUNG um eins verringern. Falls VERMEHRUNG = 0: Setze VERMEHRUNG auf 1. Schreibe NAHRUNG und VERMEHRUNG auf alten PLatz. N„chster Platz. Andernfalls findet der hungrige Hai wenigstens einen freien Platz: VERMEHRUNG um eins verringern. Falls VERMEHRUNG=0: Setze VERMEHRUNG auf 1. Zeichne Hai auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. Schreibe NAHRUNG und VERMEHRUNG auf neuen Platz. L”sche alten Platz. N„chster Platz. Andernfalls hat der hungrige Hai einen kleinen Fisch gefunden: Verringere KF. VERMEHRUNG um eins verringern. Falls VERMEHRUNG=0: Setze VERMEHRUNG auf 1. Zeichne Hai auf neuen Platz. Setze NAHRUNG auf 'satt'. Schreibe NAHRUNG und VERMEHRUNG auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. L”sche alten Platz. N„chster Platz. Andernfalls ist der Hai satt (NAHRUNG>HUNGER): Suche einen haifreien Platz in der Umgebung. Falls keinen gefunden: Hai auf altem Platz mit zuf„lliger Orientierung neu zeichnen. VERMEHRUNG um eins verringern. Falls VERMEHRUNG=0: Setze VERMEHRUNG auf 1. NAHRUNG und VERMEHRUNG auf Platz schreiben. N„chster Platz. Andernfalls haifreien Platz gefunden: Verringere VERMEHRUNG um eins. Falls VERMEHRUNG=0 (Hai vermehrt sich): Erh”he HAIE. Suche einen kleinen Fisch in der Umgebung. Falls keiner gefunden: W„hle freien Platz. Setze NAHRUNG auf HUNGER. Setze VERMEHRUNG auf Wiederholungswert. Zeichne Hai auf neuen Platz. Schreibe NAHRUNG und VERMEHRUNG auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. Zeichne Hai auf alten Platz. Schreibe NAHRUNG (=HUNGER) und den Anfangswert fr VERMEHRUNG darauf. N„chster Platz. Andernfalls kleiner Fisch gefunden: Setze NAHRUNG auf Anfangswert. Setze VERMEHRUNG auf Wiederholungswert. Zeichne Hai auf neuen Platz. Schreibe NAHRUNG und VERMEHRUNG auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. Zeichne Hai auf alten Platz. Schreibe NAHRUNG (=HUNGER) und Anfangswert VERMEHRUNG darauf. N„chster Platz. Andernfalls vermehrt der satte Hai sich nicht: W„hle haifreien Platz. Falls der Platz leer ist: L”sche alten Platz. Schreibe NAHRUNG und VERMEHRUNG auf neuen Platz. Zeichne Hai auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. N„chster Platz. Andernfalls ist dort ein kleiner Fisch: Zeichne kleinen Fisch auf alten Platz. Transportiere VERMEHRUNG des kleinen Fisches auf alten Platz. Schreibe NAHRUNG und VERMEHRUNG des Haies auf neuen Platz. Zeichne Hai auf neuen Platz. Notiere bei ihm, daž er bereits bearbeitet wurde. N„chster Platz. Notizen zur Implementierung von HUKF """""""""""""""""""""""""""""""""""" Zu jedem Platz geh”rt im Speicher ein Langwort (32 Bit), in dem die Art der Besetzung und weitere Informationen verzeichnet sind: Bei einem freien Platz ist das ganze Langwort Null. Bei einem kleinen Fisch enth„lt die linke H„lfte des Langwortes eine negative Zahl, deren Betrag angibt, wieviele Ticks noch vergehen mssen, bis der kleine Fisch sich vermehren kann. Bei der Geburt eines kleinen Fisches wird diese Gr”že VERMEHRUNG auf einen Anfangswert gesetzt, nach jeder Vermehrung wird sie auf den Wiederholungswert gesetzt. Bei einem Hai enth„lt die linke H„lfte des Langwortes die positive Zahl NAHRUNG, welche bei jedem Tick um eins verringert wird. Solange sie gr”žer als ein vorgegebener Wert HUNGER ist, frižt er keinen kleinen Fisch, es sei denn, der Hai vermehrt sich. Ist NAHRUNG kleiner als HUNGER, so frižt der Hai einen kleinen Fisch, falls einer auf einem benachbarten Platz zu finden ist. Danach wird NAHRUNG auf einen vorgebbaren Anfangswert ( >= HUNGER ) gesetzt. Falls NAHRUNG Null wird und der Hai nicht sofort einen kleinen Fisch findet, so verhungert er und wird gel”scht. Wenn er gerade nochmal Glck gehabt hat, wird NAHRUNG nur auf HUNGER gesetzt, d.h. er hat sofort wieder Hunger. Die rechte H„lfte des Langwortes enth„lt bei einem Hai die positive Variable VERMEHRUNG, mit der genau wie bei einem kleinen Fisch verfahren wird. Im Programm werden alle 4000 Pl„tze in einer pseudozuf„lligen Reihenfolge bearbeitet, d.h. jeder kommt genau einmal dran, auf dem Bildschirm entsteht aber ein regelloses Gewimmel. Ein solcher Durchlauf stellt einen Zeitschritt, Tick genannt, dar. Danach wird die Tastatur abgefragt, um Eingriffe etc. zu erm”glichen. Erg„nzung: Wenn ein Tier sich auf einen Nachbarplatz begibt, der w„hrend des laufenden Ticks noch nicht bearbeitet wurde, dann wird es sp„ter nochmal behandelt, wenn dieser Platz dran ist. Wir wollen aber, daž pro Tick jedes Tier genau einmal betrachtet wird. Um das zu erreichen, wird bei jedem Tier, das seinen Platz verlassen hat, das zweite Byte von rechts in dem zugeh”rigen Langwort invertiert. Solche Pl„tze werden dann nicht mehr bearbeitet. Vor jedem Tick werden diese Bytes wieder gel”scht.