Chess Monte Carlo Simulation
Tracking the 2026 Candidates with dynamic player strength, one million simulated tournaments per round.
Inspired by a Reddit post on tournament modeling, I built a Chess Monte Carlo simulation engine to track the 2026 Candidates. The goal was to move beyond the limitations of static pre-tournament ratings, which can quickly become outdated in a high-pressure, three-week event. Instead, the model treats player strength as dynamic, letting ratings update in real time as games are played.
Live Dashboards
The Simulation Engine
The core is built in C++, simulating the remainder of the tournament one million times after each round. Key features:
- Form extrapolation. The engine identifies players on an upswing by analyzing velocity trends across their Classical, Rapid, and Blitz histories, giving credit to those entering with genuine momentum across all three time controls, not just the headline classical number.
- Dynamic aggression. Instead of fixed draw rates, the model adjusts based on standings: a leader’s incentive to draw rises near the finish line, trailing contenders must take risks, and eliminated players may coast toward safer play.
- Hyperparameter tuning. I used Optuna to calibrate the engine against historical data from the 2022 and 2024 Candidates, finding the Pareto balance between per-game accuracy and final-leaderboard accuracy.
Monte Carlo Simulation
The results live on an interactive dashboard that visualizes the tournament’s “multiverse”: not a single forecast but the full distribution of futures consistent with what has happened so far.
Win-probability timeline. Each player’s chance of winning the tournament is tracked round by round, so it’s easy to see the exact moment a leader pulls away or a contender collapses.
Rank distribution heatmap. Beyond “who wins?”, the dashboard shows the full distribution of where each player is likely to finish, useful for spotting players who are safe in the top half even if the title itself is out of reach.
The Scenario Explorer
The centerpiece of the dashboard is the Scenario Explorer: an interactive decision tree for asking “what if?” questions about the rest of the tournament.
Contender determination. Before exploring branches, the engine resolves who is still mathematically alive. A 4-phase algorithm (max-reachable points → per-game guaranteed floor → 1M uniform sampling → exhaustive DFS) separates genuine contenders from players who have been eliminated, so the tree only branches on outcomes that actually matter. A naive max-points check is not enough: in the figure below, Divya and Tan Zhongyi can still climb from 5 to the leader’s current 7 in the two remaining rounds on paper, but the fixed Round 13 and 14 pairings already guarantee the leader at least 7.5, so the deeper phases correctly rule them out.
Interactive decision trees. Navigate branches of hypothetical results and watch how specific outcomes reshape the remaining win conditions for each player, turning an abstract probability distribution into a concrete story about which games carry the tournament.
Miracle-path search. For trailing players, a weighted random path sampler looks for likely revival routes first, then falls back to exhaustive DFS for low-probability scenarios or forced tiebreak paths.
Acknowledgements
- Inspired by Thomas Dondorf’s Reddit posts on Candidates simulations.
- Tournament schedules and live results via the Lichess broadcast API.
- Player ratings and rating histories via FIDE.
- Model design and C++/Python implementation developed with help from Google Gemini and Anthropic Claude.
- Interactive dashboard designed with Claude via the
/frontend-designskill.