feat(physarum): add slime mold network demo
Add a Physarum route with a GPU trail map and a CPU fallback. Tick the Physarum item in ROADMAP.md.
This commit is contained in:
1 parent
108cea0491
commit
24e7b42896
20 files changed
+1396
-2
No files matched your search
+45
-1
@@ -749,6 +749,45 @@
|
||||
"ITEM_5": "Ohne WebGPU läuft dieselbe Mathematik auf der CPU in JavaScript, begrenzt auf 1200 Agenten. Der GPU-Pfad erlaubt bis zu 8192."
|
||||
}
|
||||
},
|
||||
"PHYSARUM": {
|
||||
"TITLE": "Physarum (Schleimpilz)",
|
||||
"RESET": "Zurücksetzen",
|
||||
"PRESET": "Voreinstellung",
|
||||
"PRESET_NETWORKS": "Netzwerke",
|
||||
"PRESET_CELLS": "Zellen",
|
||||
"PRESET_LOOPS": "Schleifen",
|
||||
"PRESET_FIBERS": "Fasern",
|
||||
"AGENTS": "Agenten",
|
||||
"SENSOR_ANGLE": "Sensorwinkel (°)",
|
||||
"SENSOR_DISTANCE": "Sensorabstand",
|
||||
"TURN_ANGLE": "Drehwinkel (°)",
|
||||
"STEP_SIZE": "Schrittweite",
|
||||
"DEPOSIT": "Ablage",
|
||||
"DECAY": "Zerfall",
|
||||
"DIFFUSE": "Diffusion",
|
||||
"FOOD_HINT": "Halte die Maus oder einen Finger auf der Zeichenfläche gedrückt, um Futter zu malen. Die Agenten folgen ihm.",
|
||||
"EXPLANATION": {
|
||||
"TITLE": "Transportnetze ohne Plan",
|
||||
"PHYSARUM_TITLE": "Physarum polycephalum",
|
||||
"PHYSARUM": "Der Schleimpilz Physarum polycephalum hat kein Gehirn, verbindet aber Futterquellen mit effizienten Netzen. Das Modell von Jones (2010) bildet das mit einfachen Agenten nach. Jeder Agent liest die Spurkarte an drei Punkten (links, vorne, rechts), dreht sich zur stärksten Stelle, macht einen Schritt und hinterlässt eine Spur. Die Spur breitet sich aus und verblasst. Aus dieser Schleife entstehen Netze.",
|
||||
"MODEL_TITLE": "Spurkarte",
|
||||
"MODEL": "Die Spurkarte ist ein Raster aus Zellen mit Werten von 0 bis 1. In jedem Schritt wird sie mit dem 3×3-Mittelwert der Nachbarn weichgezeichnet (Diffusion) und mit einem Zerfallsfaktor multipliziert. Starke Spuren ziehen mehr Agenten an und werden dadurch stärker. Schwache Spuren verschwinden. Die Karte läuft an den Rändern um.",
|
||||
"GPU_TITLE": "GPU-Parallelisierung",
|
||||
"GPU": "Jedes Bild hat drei Compute-Durchläufe: die Agenten (ein Thread pro Agent), die Diffusion der Karte (ein Thread pro Zelle) und eine Kopie der neuen Karte. Viele Agenten legen gleichzeitig in dieselbe Zelle ab, darum ist die Ablage eine atomare Addition.",
|
||||
"DISCLAIMER": "Vereinfachungen in dieser Demo:",
|
||||
"DISCLAIMER_1": "Ein Simulationsschritt pro Bild: Die Geschwindigkeit hängt von der Bildrate deines Bildschirms ab.",
|
||||
"DISCLAIMER_2": "Es gibt keinen Belegungstest: Ein Agent kann auf eine Zelle ziehen, die schon ein anderer Agent nutzt. Das Modell von Jones hat diesen Test.",
|
||||
"DISCLAIMER_3": "Die Spur ist auf 1 begrenzt, darum ist der Regler für die Ablage eine relative Stärke und keine absolute Menge."
|
||||
},
|
||||
"HOW_IT_WORKS": {
|
||||
"INTRO": "Pro Bild gibt es drei Durchläufe, auf GPU und CPU in gleicher Reihenfolge: Agenten, Diffusion, Kopie. Standard sind 65.536 Agenten auf einer 512 × 512 Karte mit WebGPU und 10.240 Agenten auf einer 256 × 256 Karte ohne WebGPU.",
|
||||
"ITEM_1": "Agenten: Jeder Agent ist ein vec4 [x, y, Richtung, 0] in Kartenzellen. Er liest die Spur am linken (Richtung + Sensorwinkel), vorderen und rechten (Richtung − Sensorwinkel) Sensor, die einen Sensorabstand entfernt liegen. Er dreht sich um den Drehwinkel zur stärkeren Seite. Sind beide Seiten stärker als vorne, dreht er sich zufällig.",
|
||||
"ITEM_2": "Ablage: Nach dem Schritt addiert der Agent den Ablagewert in seine Zelle. Auf der GPU ist die Spur ein Festkomma-Ganzzahlpuffer (1,0 = 4096) und die Ablage ist ein atomicAdd, damit keine Ablage verloren geht, wenn Threads in einer Zelle zusammentreffen.",
|
||||
"ITEM_3": "Diffusion: Jede Zelle wird zu mix(Zelle, Mittelwert 3×3, Diffusion) × Zerfall und auf 0..1 begrenzt. Solange du auf die Zeichenfläche drückst, bekommen Zellen nahe dem Zeiger zusätzlich +0,5 pro Bild (Futter).",
|
||||
"ITEM_4": "Kopie: Die neue Karte wird in einen zweiten Puffer geschrieben und zurückkopiert, damit keine Zelle einen Wert liest, der im selben Durchlauf schon aktualisiert wurde.",
|
||||
"ITEM_5": "Ohne WebGPU laufen dieselben drei Schritte in TypeScript auf Float32Arrays. Die Karte wird jedes Bild als 8-Bit-Textur hochgeladen und von einem WebGL-Shader angezeigt."
|
||||
}
|
||||
},
|
||||
"GPU": {
|
||||
"WEBGL_FALLBACK": "WebGPU ist nicht verfügbar. WebGL wird als Fallback verwendet. Die Leistung kann eingeschränkt sein.",
|
||||
"NOT_SUPPORTED": "Weder WebGPU noch WebGL konnten initialisiert werden. GPU-Visualisierungen sind nicht verfügbar."
|
||||
@@ -799,6 +838,10 @@
|
||||
"TITLE": "Boids & Particle Life",
|
||||
"DESCRIPTION": "Schwarmverhalten und emergentes Verhalten aus lokalen Regeln, berechnet auf der GPU (WebGPU, Fallback WebGL + CPU)."
|
||||
},
|
||||
"PHYSARUM": {
|
||||
"TITLE": "Physarum (Schleimpilz)",
|
||||
"DESCRIPTION": "Transportnetze eines Schleimpilzes aus einfachen Agenten und einer Spurkarte, berechnet auf der GPU (WebGPU, Fallback WebGL + CPU)."
|
||||
},
|
||||
"NOTE": "HINWEIS",
|
||||
"GRID_HEIGHT": "Höhe",
|
||||
"GRID_WIDTH": "Breite",
|
||||
@@ -951,6 +994,7 @@
|
||||
"PHASES": "Phasen",
|
||||
"SUBSTEPS": "Substeps pro Frame",
|
||||
"AGENTS": "Agenten",
|
||||
"PAIR_CHECKS": "Paarprüfungen pro Bild"
|
||||
"PAIR_CHECKS": "Paarprüfungen pro Bild",
|
||||
"TRAIL_MAP": "Spurkarte"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user