Programmierwettbewerb für
Schülerinnen und Schüler
Oktober 2025 – Juni 2026
Das Hauptproblem der aktuellen Stage Dark Signal ist es, die Positionen der Gems zu bestimmen. Hierzu gibt es verschiedenste Ansätze. Ich habe mich für einen “naiven” Ansatz entschieden: Raten :)
Na gut, ganz so einfach ist es nicht. Grob zusammengefasst rate ich verschiedenste Edelstein-Positionen, bewerte sie und verbessere sie iterativ. Für einen einzelnen Edelstein im Maze ist das Leben einfach: Man kann einfach per Brute-Force alle Positionen testen und die Auswählen, die am besten zu den gemessenen Signalen passen. Bei einer map von 49x29 sind das 1421 Konfigurationen (“States”) die man testen muss. Das geht schnell. Wenn man 2 Gems hat, können es dann schon 2.017.820, das war gerade so machbar ohne wilde Tricks. Bei 3 Gems hört der Spaß leider mit 2.863.286.580 States auf, in 100 ms wird das knapp. Was kann man also machen?
Mathematisch versuchen wir hier ein Inverses Problem zu Lösen (für Menschen die Mathe-Affine sind): Wir haben Messwerte vom einem skalaren Felds an verschiedenen Positionen gegeben und versuchen die Quellen (Gems) zu bestimmen. Mathematisch ist das leider nicht ganz trivial. Da ich meinen Bot in C programmiere, will ich keinen großen Solver basteln.
Vor nicht allzu langer Zeit habe ich ein Paper zum Thema Daten modellieren gelesen (Paper, kann ich sehr empfehlen. Lösungen als ipynb gibt es hier: Repo) Fitten von Daten zu einem Modell ist ein sehr ähnliches Problem. Der Bot misst das Signal an verschiedenen Orten (unsere Messwerte) und will wissen wo die Gems liegen müssen (Modell). Wir wissen (zum Glück) welchen Effekt die Gems auf das Signal haben. Also versucht auch der Bot das Problem zu lösen, welches Modell die gemessenen Werte produziert.
Der Metropolis-Hastings-Algorithmus versucht nun, genau dieses Modell zu bestimmen. Wir wissen, dass zu jedem Zeitpunkt 0–3 Gems im Maze vorhanden sind. Im Fall von zwei Gems gehen wir wie folgt vor: Wir generieren zufällige „States“ – also Positionen für zwei Gems, die zufällig im Maze verteilt sind. Pro State läuft der Prozess iterativ ab:
T ist dabei ein Parameter der Temperatur genannt wird (wegen Boltzmann-Gesetz). Je größer T, desto wahrscheinlicher wird der neue State angenommen, sodass der Parameterraum aggressiver abgesucht wird. Es ist wichtig, manchmal ‘schlechtere’ States zu besuchen, um nicht in lokalen Minima steckenzubleiben. Man kann sich das so vorstellen, dass der State durch den Parameterraum läuft und das Optimum sucht. Einen solchen Prozess nennt man auch Markov-Chain. Somit handelt es sich hier um eine Markov-Chain Monte-Carlo Methode.
Dieses Prozedere machen wir nicht nur mit einem State, sondern mit vielen sogenannten Walkern. In der Regel: Je mehr States, desto genauer das Resultat. Außerdem, je länger die Kette an besuchten States, desto besser approximiert sie die tatsächliche Lösung. Dieses Ensemble an Walkern macht der Algorithmus sehr stabil gegen Fehler und lokale Minima.
Da das Signal kein Noise oder ähnliches hat können wir einfach am Ende den State mit dem geringsten Fehler als ‘Wahrheit’, also also bestes Modell für unsere Messwerte benutzen.
Hier eine kleine Visualisierung (braucht JavaScript):
Hier sieht man das Ensemble-MCMC in Action:
Aktuell verwende ich 200 Walker mit jeweils 500 Iterationen pro möglicher Gem Zahl. Ich finde damit meist in 3-5 Messwerten/Moves die tatsächlichen Edelstein-Positionen. Klingt recht gut, keine Ahnung wie sich das mit anderen Methoden vergleicht. Mit ein paar Optimierungen am Code habe ich eine average response time des Bots von ca. 15 ms. In den letzten Scrims hat sich auch gezeigt, dass nur das finden der Gems alleine noch nicht ausreicht, um Top-Scores zu erzielen. Also heißt es: weiterbasteln. Ich bin gespannt was noch kommt!