Dieses Dokument beschreibt das Modell der „Petrischale" erschöpfend: jeden Faktor, jede Funktion, jeden Parameter und jede Verrechnung. Es ist als Nachschlagewerk gedacht — von der Grundidee bis zur letzten Konstante. Die Simulation läuft vollständig clientseitig (WebGL2-Rendering, CPU-Simulation), eine einzige HTML-Datei, ohne Server und ohne Internet.
In einer kreisrunden Schale leben punktförmige Wesen. Jedes besitzt einen Gen-Code (Genom), der seine Eigenschaften festlegt. Wesen haben Bedürfnisse (Hunger, Durst, Müdigkeit), suchen dafür Ressourcen auf, weichen Gefahren aus oder jagen selbst, und pflanzen sich fort, sobald sie genug Energie haben. Bei der Fortpflanzung wird das Genom des Nachwuchses mutiert.
Es gibt keine eingebaute Fitnessfunktion. Niemand bewertet die Wesen. Wer stirbt, ist weg; wer sich fortpflanzt, gibt seine Gene weiter. Aus Variation (Mutation), Vererbung (Kopie) und Selektion (Tod & Fortpflanzungserfolg) entsteht echte Evolution. Die Ranglisten und Diagramme sind reine Beobachtungsfenster, kein Steuerungsmechanismus.
Der Mensch steuert nur die Umwelt: Stärke des Eindämmungsfelds, Menge und Nachwachsrate der Ressourcen, Größe der Zonen, Abstandsverhalten, Weltgeschwindigkeit, Mutationsstärke. Daraus ergibt sich der Selektionsdruck.
Die Schale ist eine Kreisscheibe mit Mittelpunkt c und Radius
R (= 47 % der kürzeren Fensterkante). Ein radiales Kraftfeld zieht jeden
Körper zur Mitte — die „magnetische Eindämmung". Im Inneren ist es nahezu kräftefrei, zum
Rand hin steigt es steil an.
Der Faktor 140 bringt das Feld in dieselbe Größenordnung wie die anderen
Kräfte (Abstoßung, Räuber-Beute-Feld), sonst wäre es wirkungslos.
Integration pro Tick (fester Zeitschritt dt = 1/60):
Das Gleichgewicht (wo ein Wesen zur Ruhe kommt) liegt dort, wo die Feldkraft nach innen die nach außen gerichteten Kräfte (z. B. Gedränge) aufhebt. Stärkeres A oder kleineres N schiebt dieses Gleichgewicht weiter nach innen.
Jedes Wesen speichert 21 vererbbare Fließkommawerte: 10 Eigenschafts-Gene
(je 0…1), 10 zugehörige Pro-Gen-Mutationsraten σᵢ und 1 übergeordnete
Meta-Mutationsrate τ.
| # | Gen | Klasse | Wirkung (Wert 0 … 1) |
|---|---|---|---|
| 0 | kampf | Leistung | aktive Angriffsstärke im Kampf |
| 1 | panzerung | Leistung | passive Widerstandskraft; senkt erlittenen Schaden; senkt zugleich das effektive Tempo (Gewicht) |
| 2 | tempo | Leistung | Laufgeschwindigkeit |
| 3 | wachsamkeit | Leistung | Wahrnehmungsradius (Beute/Gefahr früh erkennen) |
| 4 | lebensspanne | Leistung | maximales Alter |
| 5 | sparsamkeit | Leistung | Stoffwechsel-Effizienz; senkt den Verbrauch aller drei Triebe |
| 6 | aggression | Strategie | Grundtemperament; wird durch Hunger moduliert |
| 7 | ernaehrungstyp | Strategie | Kontinuierlicher Wert 0…1. Unterhalb der Pflanzenfresser-Grenze (herbGrenze, Vorgabe 0,25) verhält sich das Wesen als reiner Pflanzenfresser und jagt nie. Oberhalb der Fleischfresser-Grenze (carnGrenze, Vorgabe 0,75) grast es nie und jagt immer. Dazwischen: Allesfresser — wählt nach einem Hysteresemechanismus. Beide Grenzen sind per Regler einstellbar (→ §20). |
| 8 | teilungsschwelle | Strategie | Energieniveau, ab dem Fortpflanzung möglich ist |
| 9 | brutinvestition | Strategie | Energieanteil, den das Original dem Nachwuchs mitgibt |
Die 6 Leistungs-Gene (0–5) sind reine Vorteile (höher = besser) und stehen unter dem Erhaltungssatz (§4). Die 4 Strategie-Gene (6–9) sind keine „Macht", sondern Entscheidungen über die Lebensweise — sie zählen nicht ins Budget.
tempo_eff = tempo · (1 − panzerung · 0.4) — ein
schwer gepanzertes Wesen ist langsamer. Maximalgeschwindigkeit:
30 + tempo_eff · 120 px/s.„Es gibt keinen kostenlosen Vorteil." Die sechs Leistungs-Gene teilen sich ein festes Punktekonto:
Wer in einer Eigenschaft stärker wird, muss anderswo schwächer werden. Nach jeder Mutation
(und beim Erzeugen im Designer) wird das Konto durch Budget-Projektion wieder auf
B₀ ± ε zurückgeführt: Die Abweichung wird anteilig auf alle sechs Gene verteilt
und alles in [0,1] geklemmt (zweistufig, damit die Summe stimmt).
energie −= |ΔΣ| · 0.0003 pro Tick, ab |ΔΣ| > 2ε) — eine sanfte Rückstellkraft
statt eines harten Verbots.Beispiel: drei „gleich teure" Genome (Σ = 3,0), aber völlig verschiedene Strategien:
| Typ | kampf | panzer | tempo | wachs | leben | sparsam |
|---|---|---|---|---|---|---|
| Glaskanone | 0,9 | 0,1 | 0,8 | 0,6 | 0,3 | 0,3 |
| Tank-Grazer | 0,2 | 0,9 | 0,2 | 0,4 | 0,8 | 0,5 |
| Asket/Ausdauer | 0,3 | 0,3 | 0,5 | 0,5 | 0,5 | 0,9 |
Das Mutationsmodell entspricht der selbstadaptiven Evolutionsstrategie nach
Rechenberg/Schwefel: Jedes Gen trägt seine eigene Mutations-Schrittweite σᵢ,
und diese Schrittweiten mutieren selbst, gesteuert von einer übergeordneten Rate
τ, die ebenfalls mutiert. Bewusst auf zwei Meta-Ebenen begrenzt.
Bei jeder Teilung — das Original bleibt unverändert, nur das Kind mutiert:
N(0,1) ist eine standardnormalverteilte Zufallszahl (Box-Muller).
Startwerte: σ_init = 0.05, τ_init = 0.1. Ein globaler
Mutations-Multiplikator (Regler) skaliert τ zusätzlich.
σᵢ → ein Faktor wird über Generationen
konserviert (z. B. Panzerung beim Tank).σᵢ → ein Faktor wird aktiv durchprobiert.τ = konservativer Stamm, hohes
τ = volatiler Stamm.τ pendelt sich von selbst ein.Neben dem Genom hat jedes Wesen veränderliche Zustände:
| Wert | Bedeutung | steigt/sinkt | kritisch |
|---|---|---|---|
| hunger | 0 = satt … 1 = verhungert | steigt durch Stoffwechsel; sinkt durch Fressen | >0,75: Energie sinkt langsam; >0,9: schnell |
| durst | 0 = satt … 1 = verdurstet | steigt mit der Zeit; sinkt durch Trinken | = 1: Tod |
| muede (Müdigkeit) | 0 = wach … 1 = erschöpft | steigt durch Aktivität; sinkt durch Ruhen | >0,7: halbe Wahrnehmung; >0,8: erzwungenes Ruhen |
| energie | Lebenskraft | Fressen ↑, Hunger ↓ | ≤ 0: Tod (verhungert) |
| alter | Lebenszeit (Sekunden) | steigt stetig | > max. Lebensspanne: Tod |
Die drei Triebe (Hunger, Durst, Müdigkeit) sind der Bewegungsmotor: jeder treibt zu einem anderen Ort (Gras/Beute, Wasser, Schutz). Weil diese Orte getrennt liegen, muss ein Wesen ständig Prioritäten setzen und sich dabei in Gefahr begeben.
Maximale Lebensspanne in Sekunden: lebensspanne · 600 + 120 (also 120 s
bis 720 s genetischer Spielraum).
Die drei Triebe steigen pro Tick mit einer Grundrate, geteilt durch die sparsamkeit und multipliziert mit der Aktivität:
Ein sparsames Wesen (hohe sparsamkeit) verbraucht langsamer, muss also seltener
zu den gefährlichen Ressourcen pendeln — ein echter Überlebensvorteil, der über das
Leistungs-Budget bezahlt wird.
Über diesen Radius „sieht" ein Wesen Nachbarn — für Bedrohungserkennung, Beutewahl und die Nahbereich-Abstoßung. Müdigkeit und Schlaf senken die Wachsamkeit (Risiko im Schlaf).
Jedes Wesen ist in genau einem von acht Zuständen. Pro Tick wird der Zustand neu bestimmt, nach folgender Dringlichkeit (von oben nach unten):
muede > 0.8 sofort zur Schutzstelle.energie ≥ teilungsschwelle und Mindestalter.| Zustand | Ziel-Lenkung | Aktion |
|---|---|---|
| WANDERN | zufällig | — |
| GRASEN | nächster Grasfleck, Stärke 130+hunger·180 | frisst bei Kontakt |
| TRINKEN | nächste Wasserstelle, 130+durst·180 | trinkt bei Kontakt |
| RUHEN | nächster Schutzpunkt, 100+muede·120 | regeneriert Müdigkeit (nur wenn geschützt) |
| JAGEN | Beute, Stärke 260 | Kampf bei Kontakt |
| FLIEHEN | vom Jäger weg, Kraft 250 | bis außer Sichtweite |
| LAUERN | nächster Schutzpunkt, 90 | schlägt zu, wenn Beute eintrifft |
| TEILEN | — | Zellteilung, dann Wandern |
herbGrenze
(Vorgabe 0,25) und carnGrenze (Vorgabe 0,75) — teilen den ernaehrungstyp-Raum in drei
harte Zonen:
Die zwei Ernährungsgrenzen erzeugen ein Dreiklassen-System, in dem echte Spezialisten gegenüber Allesfressern einen messbaren Fitness-Vorteil haben:
| Typ | Vorteil | Schwäche |
|---|---|---|
| Pflanzenfresser | höhere Grasverwertungs-Effizienz, meidet tödliche Konfrontation vollständig | verletzlich gegenüber Fleischfressern; kein Ausweichen auf Jagd bei Grasmangel |
| Allesfresser | flexibel — kann Engpässe überbrücken | kein Spezialist in beiden Nischen; bei ausreichender Spezialistenkonkurrenz unterlegen |
| Fleischfresser | keine Abhängigkeit von Pflanzenressourcen; höhere Kampfkraft gegen Beute | kein Grassfresser-Ausweg bei Beutemangel; populationsabhängig (verhungert ohne Beute) |
Die Dynamik ist frequenzabhängig: Je seltener Pflanzenfresser werden, desto weniger
Beute steht Fleischfressern zur Verfügung — deren Population bricht ein, Pflanzenfresser
erholen sich. Umgekehrt explodiert bei wenigen Fleischfressern die Pflanzenfresser-Population
so stark, dass Grasmangel entsteht — was Allesfressern, die auch jagen können, vorübergehend
nützt. Das System tendiert zu einem dynamischen Gleichgewicht aller drei Typen, dessen Lage von
den Grenzen herbGrenze und carnGrenze sowie den Ressourcemengen
abhängt.
herbGrenze und carnGrenze) steuert diesen Kompromiss direkt.
Um den Mutationsdrift in die Mitte aktiv zu bekämpfen, steht das BALANCIERUNG-Panel zur Verfügung (→ §9b).Das Ernährungstyp-Gen (Gen 7) mutiert wie alle Gene mit clamp(g + σ·randn(), 0, 1).
Es gibt keine natürliche Kraft, die ein Gen an einem Extrem hält — bei et=0,85 streuen Nachkommen
normalverteilt um 0,85, und einige landen unterhalb von carnGrenze. Diese werden
Allesfresser und überleben flexibler. Ohne Gegendruck dominieren Allesfresser langfristig,
weil sie in jeder Situation fressen können, während Spezialisten bei Ressourcenmangel
ihrer Nische aussterben.
Das BALANCIERUNG-System berechnet für jedes Wesen drei kontinuierliche Scores aus seinem
ernaehrungstyp-Gen (et) — je extremer die Spezialisierung, desto stärker der Effekt:
Beispielwerte bei herbGrenze=0,30 / carnGrenze=0,70:
| et | herbScore | carnScore | omniScore |
|---|---|---|---|
| 0,00 | 1,00 | 0 | 0 |
| 0,15 | 0,50 | 0 | 0 |
| 0,30 | 0,00 | 0 | 0 |
| 0,50 | 0 | 0 | 1,00 |
| 0,70 | 0 | 0,00 | 0 |
| 0,85 | 0 | 0,50 | 0 |
| 1,00 | 0 | 1,00 | 0 |
| Regler | Effekt | Eingehängt in | Formel |
|---|---|---|---|
| 🌿 Herdenschutz (0–1) | Pflanzenfresser erhalten zusätzliche Panzerung — frequenzabhängig: je mehr Pflanzenfresser in der Population, desto stärker der Effekt | defensePower(j) | + herbScore × slider × popHerbFrac × 0,4 |
| 🔴 Jäger-Bonus (0–1) | Fleischfresser erhalten additiven Angriffsbonus unabhängig von ihrer Populationsgröße | attackPower(i) | + carnScore × slider × 0,3 |
| 🟡 Omni-Tempo − (0–1) | Allesfresser werden langsamer, je näher ihr et-Gen an der Mitte der Omnivoren-Zone liegt | effectiveTempo(idx) | × (1 − omniScore × slider) |
| 🟡 Omni-Aggr. − (0–1) | Allesfresser kämpfen weniger oft — geringere Kampflust | kampfeslust(idx) | × (1 − omniScore × slider) |
Der Gradient schafft gerichteten Selektionsdruck: ein Wesen mit et=0,01 ist immer fitter als eines mit et=0,29 (als Pflanzenfresser), weil der Bonus monoton mit dem Abstand vom Extrem wächst. Das kämpft direkt gegen den Mutationsdrift — Mutation, die et von 0,01 auf 0,05 hebt, kostet Fitness. Mit reinen Schwellwerten (hard cutoff) wäre et=0,01 gleich fit wie et=0,29, und es gäbe keinen Druck tiefer zu bleiben.
Der Herdenschutz ist zudem frequenzabhängig: wenn Pflanzenfresser selten sind, hilft der
Herden-Effekt kaum (popHerbFrac → 0). Das verhindert, dass eine winzige Restpopulation
durch übermäßige Panzerung unsterblich wird — der Effekt wächst erst wieder, wenn sich die
Herde erholt.
Ein fünfter BALANCIERUNG-Regler (0–3, default 1,0) adressiert ein anderes Problem: genetische Drift. Wenn eine Spezialistenpopulation dominiert und sich alle überlebenden Wesen stark ähneln, verliert die Evolution ihren Rohstoff — Variation. Die Simulation kann in einem lokalen Optimum steckenbleiben.
Alle 60 Sim-Ticks wird die Standardabweichung σ des Ernährungstyp-Gens über alle lebenden Wesen berechnet:
Der Multiplikator wirkt direkt auf die globale Mutationsrate in mutateChild():
Beispielwerte bei Slider=1,0:
| σ(et) | Bedeutung | Mut.× |
|---|---|---|
| 0,00 | alle Wesen genetisch identisch | 2,0 |
| 0,075 | mäßig homogen | 1,5 |
| 0,15 | normal divers — kein Boost | 1,0 |
| > 0,15 | diverse Population | 1,0 |
Live-Anzeige unter dem Slider: σ(et) (aktuelle Genpool-Breite) und Mut.× (grün wenn aktiv). Der Slider-Wert bestimmt den maximalen Boost — bei Slider=3 verdreifacht sich die Mutationsrate im schlimmsten Fall (σ=0).
Aggression ist kein starrer Wert, sondern wird durch den Hunger moduliert — der satte Jäger lässt Beute laufen, der hungrige geht aufs Ganze:
kampfeslust steigt mit dem Hunger und treibt sowohl Jagdentscheidung als auch Angriffsstärke. frische beschreibt die allgemeine Verfassung (Energie & Wachheit).
Eine einheitliche, fair austarierte Funktion entscheidet jeden Kampf. Wichtig: Sie ist so geeicht, dass spezialisierte Jäger gegen weiche Beute gewinnen, gegen Tanks aber verlieren.
Es gibt keinen frische-Faktor im Angriff — sonst wäre der hungrige Jäger
genau dann schwach, wenn er jagen muss (Todesspirale). Der kleine Bonus +0.15
sorgt dafür, dass sich Jagen lohnt.
| Begegnung (Jäger hungrig) | Siegchance |
|---|---|
| Spezial-Jäger (kampf 0,8) vs. weiche Beute (panz 0,1) | ≈ 86 % |
| Durchschnitt vs. Durchschnitt | ≈ 47 % |
| Durchschnitt vs. Tank (panz 0,9) | ≈ 29 % |
| schwacher Jäger vs. weiche Beute | ≈ 59 % |
Bei einem Sieg: energie += 0.35 + Beute.energie · 0.4, hunger −= 0.6,
Kill-Zähler +1, Beute stirbt. Bei einer Niederlage flieht die Beute.
Über einen großen Bereich der Schale wirkt ein Kraftfeld: Beute flieht schon aus der Ferne vor Jägern, und Jäger werden zur Beute hingezogen — so durchwandern sie die Schale gezielt.
Ein satter Jäger (kampfeslust ≈ 0) strahlt fast nichts aus — passend zu den
Räuber-Beute-Wellen. Pflanzenfresser sind „leckerer und ängstlicher" (hoher
edible-Wert); in der Schutzzone sind sie für das Feld fast unsichtbar (×0,12).
Der Wirkradius FEAR_R begrenzt die Suche auf den SpatialHash — statt O(n²) aller Paare
wird nur ein Nachbarschaftsausschnitt abgefragt (→ §22).
Wesen können sich nicht überlagern wie Photonen — sie wollen Abstand. Eine
Nahbereich-Abstoßung wirkt zwischen allen. Der Regler ABSTAND
(spacingMul) skaliert Stärke und Reichweite gemeinsam:
Höherer Abstand verteilt die Wesen großräumiger — gegen das „Tümmeln" an knappen Stellen und
gegen kannibalische Allesfresser-Haufen. Bei spacingMul = 0 gibt es keinen
Abstandswunsch (Stapeln erlaubt). Die Bedrohung durch Jäger erledigt das separate Feld aus §13 —
dieser Term ist die neutrale Abstandshaltung aller untereinander.
Drei kreisförmige Zonen sind 120° um die Schale verteilt (auf 55 % Radius):
Gras, Wasser, Schutz. Jede Zone hat einen einstellbaren Durchmesser (10…95 % des
Schalenradius): Zonenradius = R · Prozent / 200.
In der Gras- bzw. Wasserzone liegen einzelne Flecken (Anzahl einstellbar), jeder mit einem Vorrat (0…1), der abgegrast/leergetrunken wird und nachwächst:
Leergegraste Flecken (Vorrat < 0,06) verschwinden optisch (kahler Boden) und tauchen beim Nachwachsen wieder auf. So sieht man Übernutzung und Erholung direkt.
Die Schutzzone besteht aus diskreten Schutzpunkten (violett). Anders als Gras/Wasser haben sie keinen Vorrat, sondern eine Kapazität: Pro Punkt sind nur die nächstgelegenen N Wesen geschützt (Wirkradius 26 px) — der Rest steht im Freien, auch wenn er nah ist. Schutz ist damit eine knappe, umkämpfte Ressource. Die Helligkeit eines Punktes zeigt seine Belegung.
Innerhalb des Schutzes verschiebt sich die Wichtung gegen Jäger, ohne die Kampfwerte zu verändern:
| Aspekt | außerhalb | im Schutz |
|---|---|---|
| Sichtbarkeit im Räuber-Beute-Feld | voll | ×0,12 (fast unsichtbar) |
| Erfassbarkeit von außen | ja | nein (nur Lauerjäger im Inneren sieht sie) |
| Jagdtempo des Jägers | Sprint ×1,25 | ×0,65 (lahm) |
| Fluchttempo der Beute | normal | ×1,15 (entwischt besser) |
| Verschwinde-/Entwischrate vor dem Kampf | 0 % | 60 % |
| Kampf (kampf/panzerung) | normal | unverändert |
Zweischneidige Falle: Ein wachsamer Jäger (wachsamkeit > 0,6) kann sich selbst in einen Schutzpunkt legen und lauern — dann ist die getarnte Beute für ihn erfassbar. Die Schutzzone schützt also vor Jägern von außen, nicht vor einem Lauerer im Inneren.
Was danach geschieht, ergibt sich von selbst aus dem Restkonto: genug Energie → sofort
wieder teilen; etwas → fressen/trinken gehen; zu wenig → stirbt bald. Aus den getrennt
mutierenden Genen teilungsschwelle und brutinvestition entsteht das
klassische r/K-Spektrum:
Welche Strategie gewinnt, entscheidet die Umwelt. Zu wenig Investition → Kind verhungert vor der ersten Mahlzeit; zu viel → Elternteil stirbt. Der Sweet-Spot evolviert von selbst.
energie ≤ 0.durst ≥ 1.alter > lebensspanne·600+120 s.Auch erfolglose, nie gejagte Wesen sterben zwangsläufig an Alter, Hunger oder Durst — kein ewiges Vegetieren. Jeder Tod erscheint mit Ursache im Ereignis-Register.
Der Gen-Code ist „auf einen Blick" ablesbar:
| Optik | kodiert | Formel |
|---|---|---|
| Farbton → | ernaehrungstyp | Hue = (1 − ernaehrungstyp) · 0,33 (grün→rot) |
| Sättigung | aggression | Sat = aggression |
| Helligkeit | Kampf × Energie | Val = (0,5 + kampf·0,4) · energie |
| Größe | Körpermasse | 3 + ((lebensspanne + energie + Reifegrad)/3) · 7 px |
| Außenring | panzerung | dicker/dunkler Rand |
| Stacheln | kampf | Zackenzahl/-länge |
Reifegrad = alter / max.Lebensspanne (0 = Jungtier, 1 = ausgewachsen). Ein
hungerndes Wesen verblasst und magert ab; ein junges ist klein und wächst heran.
Alle Regler liegen in der linken Spalte (Steuerpult), gruppiert. Bedienelemente haben feste Positionen (variable Listen scrollen intern), damit nichts „wandert".
| Regler / Knopf | Wirkung |
|---|---|
| ▶ START / ⏸ PAUSE | Simulation starten/anhalten |
| ↺ RESET | Welt neu aufsetzen (mit STARTPOP) |
| Tempo (1–20) | Weltgeschwindigkeit = Simulationsschritte pro Bild (Zeitraffer; ändert NICHT die Wesen-Geschwindigkeit) |
| N (Wand) (2–40) | Exponent des Eindämmungsfelds; klein = weiter reichend/weicher |
| A (Kraft) (1–40) | Randbeschleunigung des Felds |
| ☑ Auto-Stopp | pausiert bei Konvergenz (eine Linie, >1 Generation) — und immer bei Aussterben (Pop = 0, unabhängig vom Häkchen) — siehe §21 |
| Regler | Wirkung |
|---|---|
| Menge (Gras 5–60, Wasser 3–60) | Anzahl der Gras- bzw. Wasserflecken |
| Nachwachs/Nachfüll ↻ (0–100) | Regenerationsrate (0 = nie) |
| Durchm. ⌀ (10–200 %) | Durchmesser der Zone als Prozent des Schalenradius; der Mittelpunkt verschiebt sich automatisch so, dass die Zone niemals den Schalenrand schneidet |
| Gras-Reichweite (px) | Radius, innerhalb dessen ein Wesen einen Grasfleck abgrasen kann; größerer Wert = üppigere Weide |
| Wasser-Reichweite (px) | Entsprechend für Wasserstellen |
| Schutz: Punkte N (1–20) | Anzahl der Schutzpunkte |
| Schutz: Kapazität (1–30) | wie viele Wesen ein Schutzpunkt gleichzeitig schützt |
| Schutz: Wirkradius (px) | räumliche Reichweite des Schutzeffekts je Punkt; innerhalb dieses Radius sinkt die Sichtbarkeit im Räuber-Beute-Feld auf ×0,12 |
| Regler | Wirkung |
|---|---|
| 🌿 Herdenschutz (0–1) | Gradient-Bonus auf Panzerung für Pflanzenfresser, skaliert mit Pflanzenfresser-Anteil in der Population (→ §9b) |
| 🔴 Jäger-Bonus (0–1) | Gradient-Bonus auf Angriffskraft für Fleischfresser (→ §9b) |
| 🟡 Omni-Tempo − (0–1) | Geschwindigkeitsmalus für Allesfresser, maximal in der Mitte der Omnivoren-Zone (→ §9b) |
| 🟡 Omni-Aggr. − (0–1) | Aggressionsmalus für Allesfresser, maximal in der Mitte der Omnivoren-Zone (→ §9b) |
| 🧬 Diversitäts-Mut. (0–3) | Erhöht die Mutationsrate automatisch wenn der Genpool homogen wird (σ(ernaehrungstyp) < 0,15) — Inzucht-Prävention (→ §9b) |
| Regler | Wirkung |
|---|---|
| Abstand (0–1000 %) | reine Privatsphäre-Zone; hoch = löst Haufen auf. Stört Jagd/Flucht nicht (aktives Paar ausgenommen) |
| Mutation × (0,1–5) | globaler Multiplikator auf die Mutationsrate τ |
| Startpop (50–600) | Startpopulation (greift bei RESET) |
| Verbrauch × (0,5–10) | Multiplikator auf Hunger- und Durst-Drain-Rate; höhere Werte machen Ressourcen knappeр und erhöhen den Selektionsdruck auf sparsamkeit und Ernährungsstrategie |
| Pflanzenfresser-Grenze (0,05–0,49) | ernaehrungstyp-Schwellwert, unterhalb dessen ein Wesen niemals jagt. Kleiner Wert = nur sehr ausgeprägte Pflanzenfresser sind reine Grazer; großer Wert = breitere Pflanzenfresser-Zone (→ §9 / §9a) |
| Fleischfresser-Grenze (0,51–0,95) | ernaehrungstyp-Schwellwert, ab dem ein Wesen niemals grast. Großer Wert = nur sehr ausgeprägte Fleischfresser jagen ausschließlich; kleiner Wert = breitere Fleischfresser-Zone. Der Bereich zwischen beiden Grenzen ist die Allesfresser-Zone. |
Die linke Spalte ist die Einstell-Seite (alle Regler + Genom-Designer), die rechte Spalte die reine Beobachtungs-Seite (Ranglisten, Live-Werte, Genpool, Linien, Ereignisse).
| Element | Wirkung |
|---|---|
| ⬡ IN SCHALE SETZEN | ein Wesen mit dem Designer-Genom per Klick platzieren — es wird danach automatisch als „angeklicktes Wesen" (rechts) live verfolgt (nur das zuletzt gesetzte) |
| ➕ MIGRANTEN + Anzahl | einen Schwung zufälliger, budget-konformer Wesen einwandern lassen |
| Klick auf Wesen | zeigt dessen Werte (Triebe, Energie, alle Gene, Mutabilität) |
| ❓ ANLEITUNG (Kopf) | öffnet die Schnellanleitung als Overlay |
| 📊 BERICHT (Kopf) | erzeugt eine Auswertung des laufenden Spans (lädt sie als HTML herunter und öffnet sie im Tab) — siehe §21 |
Die momentan erfolgreichsten Einzelwesen, sortiert nach Erfolgsmaß:
Zeigt alle Werte eines Wesens: Vitalwerte (Hunger, Durst, Müdigkeit, Energie, Alter), alle 10 Gene und τ/Kills/Nachkommen. Quelle ist entweder das angeklickte Wesen oder automatisch das zuletzt „in die Schale gesetzte" (Designer-)Wesen — so lässt sich ein neu eingesetztes Individuum live verfolgen.
Für jede der drei Gruppen (Pflanzen-, Alles-, Fleischfresser) wird das aktuell erfolgreichste lebende Wesen (gleiches Erfolgsmaß wie Top 10) mit allen Werten angezeigt — so sieht man ständig die jeweils führenden Vertreter jedes Ernährungstyps, nicht nur selbst gebaute.
Chronologisch Geburten ✦ und Tode ✕ mit Typ, Generation und Todesursache.
Ab jedem Start/Reset zeichnet die Seite alle 60 Ticks eine Stichprobe auf (Population,
Typanteile, Durchschnittsgene, Geburten, Tode). Der Knopf 📊 BERICHT erzeugt daraus eine
eigenständige HTML-Datei — sie wird heruntergeladen (Dateiname
petrischale-bericht-<Zeit>.html) und zusätzlich im Tab geöffnet (dort per
Strg+S/Strg+P speicher- und druckbar). Empfohlener Ablauf: laufen lassen → ⏸ PAUSE → 📊 BERICHT.
Der Bericht enthält: Kernzahlen (Start-/End-/Spitzenpopulation, höchste Generation, Geburten, Tode, End-Typen), ein SVG-Diagramm Population & Typen über die Zeit, ein Diagramm alle 10 Durchschnittsgene über die Zeit, ein Eingriffe-Protokoll mit gelben Markierungen in den Diagrammen, den Stammbaum der Linien (siehe unten), eine Tabelle Genom Start → Ende mit Δ je Gen, die Todesursachen, die Top 10 zum Schluss samt Ahnenkette sowie die Umweltparameter des Laufs. Die Parametertabelle umfasst: Basis-Regler (Tempo, Mutation, Wand, Kraft, Abstand, Startpop, Gras/Wasser/Schutz), Weltverbrauch ×, AUTO-STRESS-Status, Pflanzenfresser-/Fleischfresser-Grenze, Reichweiten (Essen/Trinken/Schutz in px) sowie alle fünf BALANCIERUNG-Regler (Herdenschutz, Jäger-Bonus, Omni-Tempo/Aggr., Diversitäts-Mut.). So lassen sich ganze Evolutionsläufe dokumentieren und vergleichen.
Jedes Start-Wesen, jeder Migrant und jede Einzel-Einsetzung begründet eine Linie mit eigener Farbe; alle Nachkommen erben die Linie ihres Elternteils. Damit lässt sich verfolgen, welche Abstammung sich durchsetzt.
Die Genealogie speichert Eltern-Verknüpfungen über stabile IDs; sehr alte Ahnen werden bei Bedarf beschnitten (Speichergrenze), weshalb sehr lange Ketten mit „…" enden können.
Per Checkbox AUTO-STOPP (Steuerleiste) aktivierbar (Standard: aus). Ist sie gesetzt,
pausiert die Simulation, sobald nur noch eine Linie lebt und davon mehr als eine
Generation gleichzeitig am Leben ist (d. h. mindestens zwei Generationen derselben Linie
koexistieren — maxGen − minGen ≥ 1 unter den Lebenden). Damit ist die Evolution auf
eine einzige, sich fortpflanzende Dynastie konvergiert. Ein Hinweis (Toast) erscheint, der Eingriff
wird ins Protokoll geschrieben. Mit ▶ WEITER lässt sich der Lauf fortsetzen; der Stopp greift erst
wieder, wenn zwischenzeitlich mehrere Linien existierten. Ein letztes Einzelwesen oder gleichaltrige
Geschwister (nur eine Generation) lösen den Stopp nicht aus.
drawArraysInstanced); Form/Farbe entstehen im Fragment-Shader.schalenR × 0,6 —
O(Jäger × Nachbarn) statt O(n²); bei 1 200 Wesen ~3× weniger Paarchecks (→ §13).dt = 1/60); TEMPO führt mehr Schritte pro Bild aus.| Konstante | Wert | Bedeutung |
|---|---|---|
| B₀ / ε | 3.0 / 0.15 | Leistungs-Budget & Toleranz |
| σ_init / τ_init | 0.05 / 0.10 | Anfangs-Mutationsraten |
| σ Grenzen / τ Grenzen | 0.001–0.5 / 0.005–0.5 | Klemmbereiche |
| CAP / MAX | 1200 / 1500 | Populationsgrenze / Slot-Reserve |
| dt | 1/60 | Simulations-Zeitschritt |
| Dämpfung | 0.92 | Geschwindigkeits-Reibung |
| Mindestalter Teilung | 60 Ticks (1 s) | vor erster Fortpflanzung |
| Teilungs-Overhead | 0.03 | Energieverlust bei Teilung |
| Drain Hunger/Durst/Müde (Basis) | 0.00015 / 0.00012 / 0.00022 | Grundverbrauch pro Tick; Hunger+Durst × drainMult |
| FOOD_ENERGY / WATER_FILL | 0.40 / 0.50 | Aufnahme-Basiswerte |
| Tötungsreichweite | 16 px | Kampf-Kontaktabstand |
| FEAR_K / HUNT_K / R0 | 3000 / 3000 / 30 | Räuber-Beute-Feld |
| Schutzpunkt-Radius (Vorgabe) | 43 px | Wirkbereich eines Schutzpunkts; per Regler einstellbar (Mittelwert 2,5K/4K) |
| Gras-Reichweite (Vorgabe) | 100 px | Fress-Distanz; per Regler einstellbar (Mittelwert 2,5K/4K) |
| Wasser-Reichweite (Vorgabe) | 90 px | Trink-Distanz; per Regler einstellbar (Mittelwert 2,5K/4K) |
| Lebensspanne | gen·600 + 120 s | max. Alter |
Die Defaults sind auf eine langlebige, evolutionär gestresste Population ausgelegt: genug Ressourcen, dass die Population nicht ausstirbt, aber knapp genug, dass Selektion wirkt. Die drei Zonen (Gras 80 %, Wasser 70 %, Schutz 60 %) überlappen sich nicht — Wesen müssen aktiv zwischen den Bereichen pendeln, was Tempo und Wachsamkeit evolutionär wertvoll macht.
| Parameter | Default | Bereich | Begründung |
|---|---|---|---|
| TEMPO | 5 | 1–20 | Mehr Generationen pro Realzeit-Minute |
| N (Wand) / A (Kraft) | 4 / 2 | 4–40 / 2–40 | Minimale Eindämmung; Feld wirkt nur nahe am Rand, Innenraum bleibt frei |
| ☑ Auto-Stopp | AN | an/aus | Pausiert bei Konvergenz (1 Linie, >1 Generation) und bei Aussterben (Pop = 0) |
| ☑ AUTO-STRESS | AN | an/aus | Reguliert Verbrauch automatisch nach Populationsgröße (→ §22) |
| 🌿 Herdenschutz | 1,0 | 0–1 | Voller Gradient-Bonus; kämpft gegen Mutationsdrift zur Mitte (→ §9b) |
| 🔴 Jäger-Bonus | 1,0 | 0–1 | Voller Gradient-Bonus für Fleischfresser (→ §9b) |
| 🟡 Omni-Tempo − | 1,0 | 0–1 | Voller Malus; Allesfresser deutlich langsamer als Spezialisten (→ §9b) |
| 🟡 Omni-Aggr. − | 1,0 | 0–1 | Voller Malus; kombiniert mit Omni-Tempo maximaler Spezialistendruck (→ §9b) |
| 🧬 Diversitäts-Mut. | 1,0 | 0–3 | Bei σ(et)=0: Mutationsrate ×2; bei σ ≥ 0,15: kein Effekt (→ §9b) |
| Verbrauch × (drainMult) | 2,0 | 0,1–10 | Hunger-Trigger nach ~12 s; genug Druck ohne Massensterblichkeit auf dem Weg zur Nahrung |
| 🌿 Pflanzenfresser-Grenze | 0,30 | 0,05–carnGrenze | Breitere reine Pflanzenfresser-Zone |
| 🔴 Fleischfresser-Grenze | 0,70 | herbGrenze–0,95 | Breitere reine Fleischfresser-Zone; symmetrisch zur Pflanzenfresser-Grenze |
| Abstand | 100 % | 0–1000 % | Verhindert Anhäufungen an Ressourcen ohne Jagddynamik zu stören |
| Mutation × | 1,5 | 0,1–5 | Schnellere Adaptation → sichtbare Genpool-Verschiebungen |
| STARTPOP | 250 | 50–600 | Genug Puffer für den initialen Crash; überlebt ihn mit stabiler Restpopulation |
| Gras Menge | 25 | 1–60 | 25 Patches über fast die gesamte Schale verteilt → Futter immer in der Nähe |
| Gras Nachwachs ↻ | 20 | 1–100 | Patch erholt sich in ~75 Ticks; Nachwuchs 1 bräuchte 3000 Ticks (zu langsam) |
| Gras ⌀ | 95 % | 1–200 % | Bewusst groß: Futter muss von überall erreichbar sein. Wesen, die weit entfernt vom Grasgebiet starten, verhungern sonst auf dem Weg dorthin — der häufigste Aussterbegrund |
| Gras-Reichweite | 10 px | 1–200 px | Bewusst klein — Wesen müssen wirklich im Patch stehen; bei großen Bildschirmen erhöhen (→ §23a) |
| Wasser Menge | 12 | 1–60 | Leicht knapper als Gras und räumlich getrennt → Durstdruck als Selektionskraft auf Wachsamkeit/Tempo |
| Wasser Nachfüll ↻ | 25 | 1–100 | Schnelle Erholung; kein Aussterben durch Durst, aber spürbarer Weg zur Wasserstelle |
| Wasser ⌀ | 70 % | 1–200 % | Klar getrennter Wasserbereich (kein Überlapp mit Gras); Wesen müssen dorthin reisen |
| Wasser-Reichweite | 10 px | 1–200 px | Gleich wie Gras; bei großen Bildschirmen erhöhen (→ §23a) |
| Schutz ⌀ | 55 % | 1–200 % | Kompakter Zufluchtsort klar vom Wasserbereich getrennt; Räuber lauern direkt davor |
| Schutz Punkte N | 6 | 1–20 | 6 Punkte × 6 Kapazität = 36 Schutzplätze ≈ 14 % der Population; genug Schutz ohne Fleischfresser auszuhungern |
| Schutz Kapazität | 6 | 1–30 | Auch wenn Lauerer Plätze belegen, bleiben genug für echte Schläfer |
| Schutz-Wirkradius | 10 px | 1–100 px | Bewusst klein; bei großen Bildschirmen erhöhen (→ §23a) |
| Migranten | 20 | 1–100 | Einmalige Einwanderungswelle bei Bedarf |
Die Petrischale berechnet ihren Radius dynamisch aus der Fenstergröße:
schalenR = Math.min(canvas.width, canvas.height) × 0,47
Bei einem 4K-Monitor im Vollbild ist schalenR ≈ 1015 px —
bei FullHD nur ≈ 508 px, also knapp halb so groß.
Die Reichweiten-Regler (Gras-Reichweite, Wasser-Reichweite, Schutz-Wirkradius) arbeiten
dagegen in absoluten Canvas-Pixeln und skalieren nicht automatisch mit.
Der Default-Wert von 10 px ist bewusst klein — Wesen müssen wirklich in einem Ressourcen-Patch stehen um zu fressen/trinken. Das erzeugt Selektionsdruck auf Orientierung und Tempo. Bei großen Bildschirmen (4K) wirken 10 px noch strenger, weil die Schale viel größer ist. Wer eine entspanntere Welt möchte, erhöht die Reichweiten manuell (Faustformel: schalenR / 50).
| Parameter | Typ | Hinweis |
|---|---|---|
| Gras-Reichweite | Slider (px) | Fressdistanz; muss mit schalenR skalieren |
| Wasser-Reichweite | Slider (px) | Trinkdistanz; muss mit schalenR skalieren |
| Schutz-Wirkradius | Slider (px) | Tarnung im Räuberfeld; muss mit schalenR skalieren |
CFG.KILL_RANGE | Code-Konstante (16 px) | Angriffsdistanz; fest im Code, kein Regler |
| Wanddruck-Reichweite | berechnet aus spacingMul | 35 × (0,6 + 1,4 × spacingMul); skaliert indirekt |
Berechnung: Empfehlung = Default × (schalenR / 846) — gerundet auf 5 px.
| Auflösung | Vollbild-schalenR | Gras-Reichweite | Wasser-Reichweite | Schutz-Wirkradius |
|---|---|---|---|---|
| Default (alle Auflösungen) | — | 10 px | 10 px | 10 px |
| FullHD (1920 × 1080) | ≈ 508 px | ~15 px | ~15 px | ~10 px |
| 1440p (2560 × 1440) | ≈ 677 px | ~20 px | ~20 px | ~13 px |
| 4K (3840 × 2160) | ≈ 1015 px | ~30 px | ~30 px | ~20 px |
Hinweis zu KILL_RANGE: Die 16 px Angriffsdistanz sind bei 4K sehr klein relativ zur Schale — Jagd wird schwieriger. Falls Fleischfresser dauerhaft aussterben, ist das ein Auflösungsartefakt; in zukünftigen Versionen könnte KILL_RANGE dynamisch mit schalenR skaliert werden.
Den aktuellen schalenR kann man mit der Browser-Entwicklerkonsole auslesen:
window.schalenR (falls als globale Variable zugänglich) oder aus
canvas.width/height ableiten. Als schnelle Näherung genügt:
schalenR ≈ min(Fensterbreite, Fensterhöhe) × 0,47
Skalierungsfaktor = schalenR / 846, alle drei Reichweiten damit multiplizieren.
| Tick | ein Simulationsschritt (dt = 1/60 s) |
| Genom | der vollständige Gen-Code eines Wesens (10 Gene + 10 σᵢ + τ) |
| σᵢ (Sigma) | Mutations-Schrittweite eines einzelnen Gens |
| τ (Tau) | übergeordnete Rate, die die σᵢ mutiert |
| Leistungs-Budget | feste Summe der 6 Vorteils-Gene (B₀ = 3,0) |
| kampfeslust | hungerabhängige, momentane Angriffsneigung |
| frische | allgemeine Verfassung aus Energie und Wachheit |
| r/K-Strategie | viele billige vs. wenige teure Nachkommen |
| Lotka-Volterra | oszillierende Räuber-Beute-Dynamik |
| FSM | endlicher Zustandsautomat (das Verhalten eines Wesens) |
| herbGrenze | obere ernaehrungstyp-Schranke für reine Pflanzenfresser; unterhalb = nie jagen |
| carnGrenze | untere ernaehrungstyp-Schranke für reine Fleischfresser; oberhalb = nie grasen |
| drainMult | Multiplikator auf Hunger- und Durstverbrauch; steuert Ressourcenknappheit |
| frequenzabhängige Selektion | Fitness eines Typs hängt davon ab, wie häufig er selbst und seine Konkurrenten sind |
| herbScore / carnScore / omniScore | kontinuierliche Gradient-Scores (0–1) aus dem ernaehrungstyp-Gen; steuern die Stärke der BALANCIERUNG-Boni (→ §9b) |
| popHerbFrac | aktueller Pflanzenfresser-Anteil an der Gesamtpopulation; bestimmt die Stärke des Herdenschutzes |
| Mutationsdrift | natürliche Tendenz von Extremgenen zur Mitte; Gegenkraft ist der Gradient-Selektionsdruck aus §9b |