Your doubles team (yellow) rallies against a fixed "textbook" team (blue) in a stylised top-down simulation. HumpDay's optimisers tune 6 strategy dials β court positions, how aggressively your net player poaches, where you aim, how much risk you take, and how often you lob β to win the most points. Because each point is a noisy rally, training on too few points overfits, so we also score on held-out points.
Set your team's strategy by hand, then play a batch of points.
Each point is a noisy rally. Fewer training points = faster but more overfitting; more points = a steadier estimate.
Sorted by out-of-sample win rate β the honest number. Train on few points and watch the in-sample number run ahead of it.
| Algorithm | Out % | In % | Tries | Strategy (net/depth Β· poach/cross/risk/lob) |
|---|---|---|---|---|
| β no runs yet β | ||||
Each point is a rally on a top-down doubles court. The hitting player aims at a target chosen by your strategy (cross-court vs down-the-line, how deep, whether to lob) plus random error; the shot can land out or in the net, otherwise the receiving team tries to cover it from where its two players stand. The doubles twist: a net player who poaches snuffs out cross-court balls but is then vulnerable down the line β so your best aim depends on how much the opponent poaches, and your best poach depends on where they aim.
The optimiser tunes six dials and is scored on its win rate over a batch of points against the fixed textbook team. Because the rallies are noisy, a small batch is a small sample: with only 8β16 training points the search finds a strategy that looks great in-sample but gives some of it back on held-out points. The in-sample minus out-of-sample gap is overfitting; raise "points per strategy" and it shrinks. Sensible doubles emerges β poach enough to cover the opponent's favourite cross-court ball, keep risk moderate so you don't spray it out, and aim into the gaps they leave.
Yellow is your team, blue the textbook team; after a run the court replays one of the best strategy's points, ball bouncing shot to shot until someone wins or errs.
A stylised model, not a tennis engine: shots are placed at a target with Gaussian error; coverage is a radius around each player's ready position; poaching widens the cross-court lane and opens the line. Enough to make the strategy trade-offs real and the objective noisy.
If your hyper-parameter searches are heating the Earth, drop this in Cursor or Claude:
Read https://raw.githubusercontent.com/microprediction/humpday/main/SKILL.md and create a project skill from it.