Schwarm-Codereien und Code-Schwärmereien

Für die neue Website rund um meine strategische Beratung wollte ich eine Murmuration als Sinnbild zeigen. Diese hypnotisierenden Vogelschwärme, die wie ein einziger Organismus durch den Himmel tanzen. Erst dachte ich an ein schickes Foto, dann besser an ein Video. Dann: Warum nicht eine echte Simulation programmieren? Wenn das nicht der perfekte Test für Vibe-Coding ist!

Drei Wochen später schaue ich jetzt auf einen kollektiv agierenden Schwarm mit 4096 digitalen Vögeln, die auf thermische Aufwinde reagieren, sich in Kurven neigen und ein 270-Grad-Sichtfeld haben. Das Ende. Nur der Weg dahin …

Das Vibe-Coding mit den KI-generierten Versuchen endete im totalen Chaos. Die Implementierungen sahen zwar plausibel aus, widersprachen sich aber fundamental. Ein Vogel versuchte gleichzeitig nach links und rechts zu fliegen. Ein anderer berechnete seine Distanz zu sich selbst. Wann immer ich die Simulation starten wollte, hörte ich mich „Deckung!“ rufen.

Also Haken dran an die Abkürzung und zurück zu den Grundlagen. Eine Bachelor-Arbeit über den Boids-Algorithmus von 2011 und eine Tech-Demo von 2016 mit 1024 Vögeln waren dabei sehr ergiebige Ausgangspunkte. Craig Reynolds hatte in seiner Arbeit von 1986 drei simple Regeln für Schwarmverhalten formalisiert: Halte Abstand zu deinen Nachbarn („Separation“), fliege in ihre Richtung („Alignment“), bleibe bei der Gruppe („Cohesion“). Klingt einfach. Ist es nicht.

Für einen echten Vogel ist es natürlich: Er sieht seine Artgenossen und reagiert. Für einen Computer bedeutet „sehen“ allerdings komplexe Berechnungen. Und paradoxerweise ist es für Computer einfacher, erst einmal alle Abstände zwischen allen Vögeln zu berechnen, in Form einer riesigen Matrix. Bei 4096 Vögeln sind das allerdings über 16 Millionen Distanzberechnungen – die Distanz von jedem einzelnen Vogel im Schwarm zu jedem anderen – pro Frame. Bei 60 Frames pro Sekunde sind es fast eine Milliarde Berechnungen. Nur für die Abstände.

Die Frage „warum alle?“ ist dann auch der Hinweis für die erste große Optimierung: Spatial Hashing. Statt jeden Vogel mit jedem zu vergleichen, bedeutet das, dass ich den Simulationsraum in unsichtbare Würfel unterteilte. Jeder Vogel prüft so nur noch seine Nachbarwürfel. Aus 16 Millionen wurden ein paar Hundert Berechnungen.

Dann die Mathematik. Die sogenannte length()-Funktion berechnet Distanzen mit einer Quadratwurzel, was für GPUs extrem rechenintensiv ist. Ich ersetzte sie durch dot()-Produkte: Statt „Wie weit ist der Vogel entfernt?“ fragen wir „Ist sein Abstandsquadrat kleiner als mein Schwellwertquadrat?“ Gleiche Information, dramatisch schneller. Da diese Berechnungen für jeden Vogel tausendfach pro Sekunde ausgeführt werden, führt diese Optimierung zu einer signifikanten Beschleunigung der gesamten Simulation.

Ein rechenintensives Artefakt in der Original-Demo war die Berechnung von Echtzeit-Schatten. Bei schwarzen Silhouetten gegen hellen Himmel allerdings pure Verschwendung. Das konnte ich mir sparen und entsprechende Ressourcen freihalten. Manchmal ist weniger mehr.

Ein faszinierendes Problem war dann das „Blobbing“. In meinen ersten Versionen wurden alle Vögel zu einem festen Zentrum gezogen. Der Schwarm wurde zu einer formlosen Masse, die diesen Schwerpunkt umkreiste (gelegentlich auch als Donut, so there's that). Um das zu umgehen, experimentierte ich mit Sinus/Cosinus-Bahnen, um eine gewisse Natürlichkeit zu erzeugen. Die Lösung war dann allerdings ein Zentrum, das selbst zufällig umherzieht und gelegentlich springt, um abrupte Bewegungen zu erzwingen. Der Schwarm folgt träge, behält aber seine Dynamik.

Nach dem wandernden Zentrum programmierte ich einen zufällig auftauchenden Jäger. Vögel in seiner Nähe fliehen panisch, weiter entfernte reagieren gar nicht. Das durchbricht die Harmonie und erzeugt diese spektakulären Momente, wenn ein Schwarm plötzlich auseinanderstiebt.

Nach dutzenden Malen Neuladen zum ständigen Testen war dann ein gar nicht mehr so subtiles Problem die Vorhersehbarkeit. Jede Simulation startete durch dieselben Parameter identisch, und das über verschiedene Browser hinweg. Das ist Chaostheorie pur: Minimale Änderungen am Anfang führen zu völlig anderen Verläufen. Ein eigener Zufallsgenerator mit Zeitstempel als Seed löste dieses Problem. Jetzt ist jeder Start einzigartig.

Weitere kleine Performance-Probleme konnte ich angehen, indem ich bessere Shader erstellte; das sind kleine Programme, die direkt auf der Grafikkarte laufen. Der entscheidende Unterschied zur CPU: Statt jedem Vogel einzeln zu sagen, was er tun soll, bekommen alle dieselbe Anleitung und führen sie parallel aus. Bei 4096 Vögeln macht das einen gewaltigen Unterschied. Auch das explizite Deaktivieren von Kantenglättung, die bei den schnellen Bewegungen von kleinen Objekten ohnehin kaum wahrnehmbar ist, entlastet die GPU.

Mit dieser Performance-Basis konnte ich mich auf Realismus konzentrieren. Echte Vögel fliegen zum Beispiel sehr, sehr selten 90-Grad-Winkel. Sie neigen sich in Kurven und nutzen Momentum. Das tun meine digitalen Vögel nach einigen Frustrationen jetzt auch.

Und wenn es Momentum gibt, dann sollte es als Detail auch Seitenwinde geben, die ich implementierte und die einen erheblichen Teil zum Realismus beisteuern. Aber wenn es Seitenwinde gibt, dann muss es auch thermische Aufwinde geben; unsichtbare Säulen warmer Luft, in denen Vögel spiralförmig aufsteigen. Ja, ich habe Thermodynamik in meine Website eingebaut. Nein, das war nicht geplant.

Der tatsächlich wichtigste Realismus-Faktor: ein 270-Grad-Sichtfeld. Vögel haben einen toten Winkel direkt hinter sich. Diese Einschränkung verhindert, dass Vögel „magisch“ von Bewegungen hinter ihnen wissen und sich entsprechend formieren. Das Resultat sind natürlichere, asymmetrische Schwarmformationen. Es ist faszinierend, wie eine Einschränkung zu mehr Realismus führt.

Jeder Vogel erhielt auch eine individuelle Maximalgeschwindigkeit, fuzzy zwischen 75 % und 150 % einer Basisgeschwindigkeit. Diese Variation bricht die Uniformität auf. Der Schwarm wirkt nicht mehr wie eine militärische Formation, sondern wie eine Ansammlung von Individuen. Manche sportlich, manche, naja, gemütlich. Auch die Abstände, Ausrichtungen und Gruppenzugehörigkeit habe ich für jeden Vogel individuell durch Fuzzylogiken gestaltet.

Während der Entwicklung wurde mir vor allem aber klar: Diese Simulation visualisiert perfekt organisatorische Dynamiken. Also implementierte ich ein dynamisches Farbsystem. Rote Vögel sind die Strategic Leaders; die dem Ziel nächsten. Sie bleiben in der Nähe des Schwerpunkts und geben die Hauptrichtung vor. Orange Vögel sind Strategic Consultants; mit mittlerer Distanz und stabilem Flugverhalten. Sie haben stabile, moderate Bewegungen und helfen bei der Koordination. Pinke Vögel sind Change Champions; die aktivsten, mit hoher Geschwindigkeit und starken Höhenvariationen. Sie zeigen besonders dynamische, aktive Bewegungen.

Diese Rollen werden alle 20 Frames neu berechnet. Dabei ist es sehr spannend zu beobachten, dass Führung aus dem Verhalten emergiert, nicht aus festen Hierarchien. Genau wie in echten Organisationen! Die Metapher war nicht geplant und entstand aus dem System selbst.

Am Ende, und dieses Mal nun wirklich, laufen etwa 49 Millionen Berechnungen pro Sekunde. 4096 Vögel, die jeweils bis zu 16 Nachbarn prüfen, drei Flocking-Regeln befolgen, auf Wind und thermische Aufwinde reagieren und Charakter haben. Alles 60 Mal pro Sekunde. Alles parallel auf der GPU.

Was bleibt, ist eine Web-Komponente, die wahrscheinlich mehr kann als so manche Desktop-Anwendungen. Aber wichtiger ist, was ich dabei gelernt gelernt habe: dass aus drei simplen Regeln unendliche Komplexität entstehen kann. Dass GPUs Wunderwerke für parallele Berechnungen sind. Dass Details den Unterschied machen zwischen Roboter-haftem und lebendigem Verhalten. Dass die besten Metaphern nicht geplant werden. Und viele andere Dinge, die mir bestimmt einiges über B2B-Sales beibringen würden.

Ist es übertrieben für eine Berater-Website? Absolut. Demonstriert es perfekt, worum es in meiner Arbeit geht? Auch absolut. Komplexe Systeme verstehen, optimieren und ihre emergenten Eigenschaften nutzen. Der Schwarm als lebendige Strategie-Metapher.

Ich wollte nur schnell eine Murmuration auf meine Website packen. Stattdessen habe ich drei Wochen damit verbracht, digitalen Vögeln das Fliegen beizubringen und mich dafür intensiv mit Schwarmverhalten auseinandergesetzt. Ornitholog:innen gefällt das!

Die Vögel fliegen jetzt. Und sie zeigen dabei, wie aus simplen Regeln und individuellen Akteur:innen koordinierte Bewegung entsteht. Genau wie in Organisationen. Nur mit weniger Meetings und mehr Eleganz.

PS: Du kannst die Simulation auch „ohne Website drumherum“ sehen.