annealed_assignment_eager
defender · baseline · Elo 1034 · wins 74%annealed_assignment_eager
What it says it does
Annealed assignment, eager variant: same model and solver, longer horizon, cheaper interceptors in the energy and a higher floor on P(striker | unknown), so it commits earlier and on less evidence.
Annealed assignment: each tick's launch and gun decisions as one small QUBO.
Idea: instead of a greedy rule ("nearest first", "strikers first"), write down what a tick's decision is worth and let an optimiser pick the whole set at once.
Binary variables, rebuilt every tick: x_t = 1 launch an interceptor at track t (tracks not already chased, top 12 by value) y_t = 1 fire the gun at track t (tracks inside gun range, nearest 6) s_k slack bits that turn "at most K launches" into an equality
Energy to minimise (lower is better):
- sum_t x_t * pk * V_t value of an interceptor at t V_t = P(striker | label) * damage * urgency(time to impact) + 0.7 * the same for other tracks within the blast radius of t P(striker | unknown) is learned in-match from the labels seen so far + sum_t x_t * C interceptor cost, rising as stock runs short
- sum_t y_t * pk_gun(range_t) * V_t value of a gun round (cost 0.1) + A * (sum_t x_t + sum_k s_k - K)^2 launch cap and stock, K = min(cap, stock) + B * y_a * y_b at most one gun target + D * x_a * x_b for a, b within blast two interceptors into one cluster is waste + E * x_t * y_t gun and interceptor on the same target
Solved by simulated annealing (standard library, seeded from reset(seed) and the tick, so deterministic), keeping the best state seen. Retargeting orphaned interceptors stays greedy: it is not a choice between alternatives worth optimising jointly.
This is a hand-written experiment: does a joint optimiser beat layered's greedy heuristic under a per-tick time limit? Results are reported whether it does or not.
Against each opponent
| opponent | its mean score |
|---|---|
| rush | 0.809 |
| parked_ring_magazine_drain | 0.789 |
| flanker | 0.787 |
| attacker_blast_isolated_synchronized_rel | 0.784 |
| decoy_screen | 0.780 |
| trickle | 0.747 |
| staggered_screen_trickle | 0.744 |
| depth_shell_saturation | 0.687 |
| multi_axis | 0.662 |
| shadow_pair_ring | 0.601 |
| staggered_trishell_blast_denial | 0.380 |
| interleaved_shell_ring | 0.168 |
| synchronized_ring | 0.136 |
| phase_locked_ring | 0.124 |
Ten most recent matches
From the latest nightly tournament.
| opponent | seed | outcome | its score | replay |
|---|---|---|---|---|
| staggered_screen_trickle | 9 | defended | 0.743 | watch |
| synchronized_ring | 9 | breached | 0.131 | watch |
| phase_locked_ring | 9 | breached | 0.146 | watch |
| depth_shell_saturation | 9 | defended | 0.769 | watch |
| interleaved_shell_ring | 9 | breached | 0.154 | watch |
| parked_ring_magazine_drain | 9 | defended | 0.787 | watch |
| staggered_trishell_blast_denial | 9 | breached | 0.149 | watch |
| attacker_blast_isolated_synchronized_release | 9 | defended | 0.800 | watch |
| shadow_pair_ring | 9 | defended | 0.764 | watch |
| decoy_screen | 9 | defended | 0.771 | watch |