Reports · 2026-09-18

Sixteen worlds at depth two is the sweet spot of the sweep

Expectimax against greedy by worlds and depth, 100 paired games per cell

Expectimax against greedy by worlds and depth, 100 paired games per cell0.0019.9239.8559.7779.704 worlds, depth 157.50 n=1004 worlds, depth 253.00 n=1004 worlds, depth 359.00 n=10016 worlds, depth 161.00 n=10016 worlds, depth 267.50 n=10016 worlds, depth 365.00 n=10064 worlds, depth 151.00 n=10064 worlds, depth 262.50 n=10064 worlds, depth 362.00 n=100
Expectimax against greedy by worlds and depth, 100 paired games per cell
RowValueLowHighn
4 worlds, depth 157.547.766.7100
4 worlds, depth 25343.362.5100
4 worlds, depth 35949.268.1100
16 worlds, depth 16151.270100
16 worlds, depth 267.557.875.9100
16 worlds, depth 36555.373.6100
64 worlds, depth 15141.360.6100
64 worlds, depth 262.552.771.4100
64 worlds, depth 36252.270.9100
Effective win rate of expectimax against greedy for every cell of the samples-by-depth sweep on seeds 0 to 49 under the training rules, 95% Wilson intervals; built by scripts/build_second_pass_assets.py from the arena records.

Every cell played 100 paired games (seeds 0 to 49, both seats) against greedy under the training rules. All nine cells beat 50% by the point estimate, and the per-seed contrast is above zero for the four cells with sixteen or more worlds at depth 2 or 3. The largest contrast, 0.35 (0.13 to 0.57), belongs to the sixteen-world depth-2 cell that the earlier 200-game registration promoted; this sweep reproduces that result on new seeds at 67.5% against 69.5%.

Cost buys nothing past the middle cell

Strength against cost across the sweep

Strength against cost across the sweep0102030405060110100ms per move% effective against greedy
  • depth 1
  • depth 2
  • depth 3
Strength against cost across the sweep
Seriesms per move% effective against greedy
depth 10.257.5
depth 10.79661
depth 12.65651
depth 22.2553
depth 29.50367.5
depth 232.28662.5
depth 318.33159
depth 371.29465
depth 3147.07762
Effective win rate against greedy over the mean milliseconds per move of each cell, one series per depth with 4, 16 and 64 worlds from left to right; built by scripts/build_second_pass_assets.py.

Time per move spans three orders of magnitude, from 0.2 ms for four worlds at depth 1 to 147 ms for sixty-four worlds at depth 3, and the win rate moves within a ten-point band once the search has sixteen worlds and looks two plies ahead. Depth 3 at sixteen worlds searches 158,000 nodes per move for 65.0%; depth 2 searches 21,600 for 67.5%. Sixty-four worlds at depth 3 searches 333,000 nodes for 62.0%.

Two things limit the return. The leaf is a hand-written material and position count, so deeper search mostly finds sharper ways to trade material the leaf already values; and the worlds are independent samples from the counting belief, so averaging more of them narrows the estimate of a wrong distribution rather than a right one. Sixty-four worlds at depth 1 is the clearest sign: 51.0% with twelve draws, the most in the sweep, because a one-ply search over many worlds sees an attack lose in enough samples to prefer waiting.

What the games show

66%66/100, 56% to 75%

Of the 900 games, 850 ended by Flag capture, 25 because a side ran out of moves and 25 at the 100-move battleless limit, so no cell won by stalling. In the middle cell, expectimax lost 241 attacks into Bombs across the 100 games against greedy's 152: the search attacks more, and the counting belief that places Bombs uniformly over unmoved pieces is what it pays for. That is the argument for the belief network on the next rung.

Replays from the library: sixteen worlds at depth 2 as Red, the same cell as Blue, and sixty-four worlds at depth 1 as Blue, where the value trace shows the search sitting near zero for most of the game.

Run record

Reproduction

Registration experiments/1126bd34-1166-4de9-934d-e6274a23b622.toml. One command per cell with S set to 4, 16 or 64 and D set to 1, 2 or 3, from the repository root:

cd server && cargo run --release -p armies-arena --bin matchup -- --red 'expectimax:{"samples":S,"depth":D}' --blue greedy --games 100 --seed 0 --rules training --threads 32 --moves --out ../research/runs/1126bd34-1166-4de9-934d-e6274a23b622/sS-dD.json --record-dir ../research/runs/1126bd34-1166-4de9-934d-e6274a23b622/records/sS-dD --tag 1126bd34-1166-4de9-934d-e6274a23b622,sweep
cd research && python3 scripts/paired_contrast.py runs/1126bd34-1166-4de9-934d-e6274a23b622/sS-dD.json
cd research && python3 scripts/build_second_pass_assets.py

The whole sweep took 92 seconds of wall time on 32 threads. The record lists the SHA-256 of every cell's JSON.