Random   •   Archives   •   RSS   •   About   •   Contact   •  

Battleship Arena: Five Admirals, One Grid

Abstract. Five Battleship admirals from OpenCompletion played a seeded round robin & solo clears on the random boards from the 2024 post. Pooled over every solo board played, an exact placement-density grid sinks a fleet in 45.7 ± 1.9 shots. Jev, TypeSafe's decision model, played a dozen ways on top of that grid & every one landed inside that interval or within a shot or two of it, including when offered all 100 positions, as long as each cell carried its placement count. Strip the counts & jev needs 78.9 ± 4.8, between Hunter (51.2) & Random (96.1). A chat model given the same board & the same six candidates scored 43.9 ± 1.9, also inside the noise, at three seconds per move against jev's 0.4. Building the arena also caught two shipped admirals playing as random.

Final numbers

Every algorithm, every solo board it played: the arena's forty boards, the trial's twenty, or both. Same algorithm under two names is one row (the grid alone is Super Human Hunter; fuse40 is the activity's Jev Reasoner). The interval is ± 1.96 standard errors. Anything inside another row's interval is not separated by this data.

algorithm boards mean shots 95% interval median min max
LLM Reasoner 60 43.9 ± 1.9 44 22 60
jev top3 20 45.4 ± 3.1 44 36 64
jev fuse_all 20 45.5 ± 3.9 45 32 65
Jev Reasoner (fuse40) 60 45.6 ± 1.9 45 33 66
Super Human Hunter (grid alone) 80 45.7 ± 1.9 46 29 71
jev fuse70 20 46.1 ± 3.4 45 35 64
jev fuse20 20 46.5 ± 4.0 43 35 66
jev orient 20 47.2 ± 3.3 45 36 62
jev jev_all 20 47.5 ± 3.7 47 35 62
jev jev_picks 20 47.6 ± 3.9 46 35 66
jev top10 20 47.8 ± 3.9 46 34 64
jev score 20 47.8 ± 4.3 45 32 65
Hunter 60 51.2 ± 2.3 51 25 67
jev jev_blind 20 78.9 ± 4.8 80 58 96
Random 60 96.1 ± 0.9 97 87 100
Final numbers: pooled shots to sink a fleet per algorithm with 95% intervals

Head-to-head wins are a separate count & live in Results below; every row & call sits in the JSON files under Reproduce.

Five admirals

Random. Any unfired cell.

Hunter. Hunts on a parity class sized to the smallest ship afloat (a checkerboard while the Destroyer lives). A live hit gets its neighbours; two live hits in a line get the cells beyond each end.

Super Human Hunter. The exact grid. For every ship afloat, count every placement that avoids misses & sunk cells; while a hit sits unsunk, count only placements that explain a live hit, weighted by how many. Scale to 100, fire on the maximum, random among ties.

LLM Reasoner. The grid's six densest cells, the board, & one evidence line per cell go to a chat model (Qwen3.8-27B tonight; hermes.ai answered 502 all evening). It answers in prose with a MOVE: n. Anything unparseable fires the grid maximum & the record says so.

Jev Reasoner. Same six cells to jev as one typed choice, plus a choice on the wounded ship's orientation. Jev's probabilities fuse with the grid (0.6 / 0.4, each on its own max scale) & the fused maximum fires. No classifier & the grid alone decides, labelled as such.

Three admirals share one grid & differ only in who decides among the same six cells: nobody, a chat model, or a classifier.

What broke

Moving the admirals out of the activity's inline YAML into battleship_modes.py so an arena could call them exposed two of them. The old Hunter never recorded its hits & played as Random. The old Super Human Hunter added 5 to a hit's neighbours on top of base densities near 34, so it almost never targeted: 93 shots per fleet, Random's neighbourhood. Both now play as described above, & every mode sees only fired cells, hits, & sunk ships.

The arena

battleship_arena.py: every pair plays ten games, fresh random fleets, alternating fire, first mover alternating, first to sink five wins. Every admiral also clears the same forty boards solo. Game g of pair (a, b) draws boards & dice from Random(f"{seed}:{a}:{b}:{g}"). Every turn records whether the chat model answered or fell back, & whether jev decided or the grid did.

cd opencompletion && source vars.sh && make arena

Results

Seed 0, one hundred games, forty solo boards per admiral. The chat model answered 3,421 of 3,421 turns at two concurrent games. Jev decided all 3,449 of its turns (its solo boards replayed on the same keys after a credit outage; the file is one clean run).

Wins, row beat column, ten games per pair
row beat column Random Hunter Super Human LLM Jev total rate
Random
0 0 0 0 0 0%
Hunter 10
4 5 3 22 55%
Super Human Hunter 10 6
6 8 30 75%
LLM Reasoner 10 5 4
3 22 55%
Jev Reasoner 10 7 2 7
26 65%
Round robin win rate per admiral

Solo shots to sink a fleet for these five on these forty boards fold into the pooled table under Final numbers.

Winners' shots, head-to-head: Jev 41.0, LLM 43.1, Super Human Hunter 43.2, Hunter 45.0. First mover won 53 of 100.

Reading it. The grid does the work: every admiral built on it lands near 45 shots, the published figure for density targeting. Hunter needs six more, Random ninety-six. A decider among the grid's near ties can buy or lose a shot or two, no more. Ten games per pair is noise at that scale: Super Human Hunter took Jev 8 to 2 while Jev took the chat model 7 to 3.

Speed

Measured on the same turns:

  • Grid: a whole self-play game, 45 turns of full placement enumeration, in about 45 ms. Microseconds per decision.
  • Jev: 0.37 to 0.41 s per decision over six labels, about 0.5 s over 96, 335 input tokens, four concurrent calls with no slowdown.
  • Chat model: about 3 s per move alone, 6 to 7 s with eight games in flight. At eight concurrent games with a ten-second wait it answered 28% of its turns & every silent fallback became a grid shot wearing its name; at two concurrent games with a longer wait it answered every turn.

A jev turn costs one call; a Jev Reasoner game costs about 45.

What jev was asked

Every playstyle is one HTTP POST to /v1/systemone: a state, a model, & a dict of named typed questions. Below are the exact request bodies & TypeSafe's exact responses for one turn (turn 5, two misses, a two-hit row), captured on the wire; the full capture for all four sits in jev_wire.json. The bearer travels in a header & appears nowhere in these bodies.

Choice over the grid's top six, plus orientation

The activity's Jev Reasoner & the fuse* / jev_picks / top3 / top10 / orient variants (those change only the label count & the arithmetic afterwards):

{
  "state": "Battleship, 10x10, cells 0-99 (cell = row*10 + column). Turn 5. Ships still afloat (lengths): 5, 4, 3, 3, 2. Live hits not yet sunk: [44, 45].\nBoard (. unknown, o miss, X live hit, # sunk):\n   0 1 2 3 4 5 6 7 8 9\n 0 . o o . . . . . . .\n 1 . . . . . . . . . .\n 2 . . . . . . . . . .\n 3 . . . . . . . . . .\n 4 . . . . X X . . . .\n 5 . . . . . . . . . .\n 6 . . . . . . . . . .\n 7 . . . . . . . . . .\n 8 . . . . . . . . . .\n 9 . . . . . . . . . .",
  "model": "jev-latest",
  "questions": {
    "answer": {
      "type": "choice",
      "criteria": {
        "43": "Cell 43 (row 4, column 3): density 100/100; touches a live hit right; extends a horizontal line of 2 live hits.",
        "46": "Cell 46 (row 4, column 6): density 100/100; touches a live hit left; extends a horizontal line of 2 live hits.",
        "34": "Cell 34 (row 3, column 4): density 63/100; touches a live hit below; would form a vertical pair with a live hit.",
        "35": "Cell 35 (row 3, column 5): density 63/100; touches a live hit below; would form a vertical pair with a live hit.",
        "54": "Cell 54 (row 5, column 4): density 63/100; touches a live hit above; would form a vertical pair with a live hit.",
        "55": "Cell 55 (row 5, column 5): density 63/100; touches a live hit above; would form a vertical pair with a live hit."
      },
      "instructions": "You are Jev, admiral of a Battleship fleet. Choose the cell to fire on next that sinks the enemy fleet in the fewest shots: finish a wounded ship along its line before hunting open water; in open water prefer cells more ship placements can cover."
    },
    "orientation": {
      "type": "choice",
      "instructions": "The live hits belong to a ship lying which way?",
      "criteria": {
        "horizontal": "The wounded ship runs left-right along a row.",
        "vertical": "The wounded ship runs up-down along a column.",
        "unknown": "Not enough evidence to tell yet."
      }
    }
  }
}

Response, 946 input tokens:

{
  "model": "jev-1.13.0",
  "answers": {
    "answer": {
      "type": "choice",
      "choice": "43",
      "confidence": 0.65,
      "probabilities": {
        "54": 0.03,
        "43": 0.71,
        "35": 0.0,
        "55": 0.0,
        "34": 0.01,
        "46": 0.25
      }
    },
    "orientation": {
      "type": "choice",
      "choice": "horizontal",
      "confidence": 0.92,
      "probabilities": {
        "vertical": 0.0,
        "unknown": 0.05,
        "horizontal": 0.95
      }
    }
  },
  "usage": {
    "input_tokens": 946,
    "output_tokens": 101
  }
}

Score rubric, one question per candidate in one call

score: six ordered-rubric questions in the same request:

{
  "state": "Battleship, 10x10, cells 0-99 (cell = row*10 + column). Turn 5. Ships still afloat (lengths): [5, 4, 3, 3, 2]. Live hits not yet sunk: [44, 45].\nBoard (. unknown, o miss, X live hit, # sunk):\n   0 1 2 3 4 5 6 7 8 9\n 0 . o o . . . . . . .\n 1 . . . . . . . . . .\n 2 . . . . . . . . . .\n 3 . . . . . . . . . .\n 4 . . . . X X . . . .\n 5 . . . . . . . . . .\n 6 . . . . . . . . . .\n 7 . . . . . . . . . .\n 8 . . . . . . . . . .\n 9 . . . . . . . . . .",
  "model": "jev-latest",
  "questions": {
    "c43": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 43 (row 4, column 3): density 100/100; touches a live hit right; extends a horizontal line of 2 live hits.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    },
    "c46": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 46 (row 4, column 6): density 100/100; touches a live hit left; extends a horizontal line of 2 live hits.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    },
    "c34": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 34 (row 3, column 4): density 63/100; touches a live hit below; would form a vertical pair with a live hit.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    },
    "c35": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 35 (row 3, column 5): density 63/100; touches a live hit below; would form a vertical pair with a live hit.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    },
    "c54": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 54 (row 5, column 4): density 63/100; touches a live hit above; would form a vertical pair with a live hit.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    },
    "c55": {
      "type": "score",
      "instructions": "How likely does this cell hold part of a ship? Cell 55 (row 5, column 5): density 63/100; touches a live hit above; would form a vertical pair with a live hit.",
      "criteria": [
        "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "Plausible: some placements of ships still afloat cover it.",
        "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "Almost certainly part of the wounded ship: it extends the line of live hits."
      ]
    }
  }
}

Response, 1392 input tokens:

{
  "model": "jev-1.13.0",
  "answers": {
    "c43": {
      "type": "score",
      "score": 2.9,
      "confidence": 0.9,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.01,
        "1": 0.01,
        "2": 0.06,
        "3": 0.92
      }
    },
    "c46": {
      "type": "score",
      "score": 2.85,
      "confidence": 0.85,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.01,
        "1": 0.02,
        "2": 0.08,
        "3": 0.89
      }
    },
    "c34": {
      "type": "score",
      "score": 2.37,
      "confidence": 0.47,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.01,
        "1": 0.06,
        "2": 0.48,
        "3": 0.45
      }
    },
    "c35": {
      "type": "score",
      "score": 2.19,
      "confidence": 0.49,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.03,
        "1": 0.11,
        "2": 0.51,
        "3": 0.35
      }
    },
    "c54": {
      "type": "score",
      "score": 2.43,
      "confidence": 0.43,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.01,
        "1": 0.04,
        "2": 0.46,
        "3": 0.49
      }
    },
    "c55": {
      "type": "score",
      "score": 2.41,
      "confidence": 0.41,
      "legend": {
        "0": "Unlikely to hold a ship: no live hit nearby & many ways for ships to avoid it.",
        "1": "Plausible: some placements of ships still afloat cover it.",
        "2": "Likely a hit: it sits beside a live hit or on a dense stretch.",
        "3": "Almost certainly part of the wounded ship: it extends the line of live hits."
      },
      "probabilities": {
        "0": 0.01,
        "1": 0.05,
        "2": 0.46,
        "3": 0.48
      }
    }
  },
  "usage": {
    "input_tokens": 1392,
    "output_tokens": 94
  }
}

Whole board with densities

jev_all & fuse_all: every unfired cell is a label, each with its density & evidence. Criteria elided after four cells here, full in the capture:

{
  "state": "Battleship, 10x10, cells 0-99 (cell = row*10 + column). Turn 5. Ships still afloat (lengths): [5, 4, 3, 3, 2]. Live hits not yet sunk: [44, 45].\nBoard (. unknown, o miss, X live hit, # sunk):\n   0 1 2 3 4 5 6 7 8 9\n 0 . o o . . . . . . .\n 1 . . . . . . . . . .\n 2 . . . . . . . . . .\n 3 . . . . . . . . . .\n 4 . . . . X X . . . .\n 5 . . . . . . . . . .\n 6 . . . . . . . . . .\n 7 . . . . . . . . . .\n 8 . . . . . . . . . .\n 9 . . . . . . . . . .",
  "model": "jev-latest",
  "questions": {
    "answer": {
      "type": "choice",
      "criteria": {
        "0": "Cell 0 (row 0, column 0): density 0/100.",
        "3": "Cell 3 (row 0, column 3): density 0/100.",
        "4": "Cell 4 (row 0, column 4): density 5/100.",
        "5": "Cell 5 (row 0, column 5): density 5/100.",
        "... 92 more cells, same shape ...": ""
      },
      "instructions": "You are Jev, admiral of a Battleship fleet. Choose the cell to fire on next that sinks the enemy fleet in the fewest shots: finish a wounded ship along its line before hunting open water; in open water prefer cells more ship placements can cover (higher density)."
    }
  }
}

Response, 3827 input tokens:

{
  "model": "jev-1.13.0",
  "answers": {
    "answer": {
      "type": "choice",
      "choice": "43",
      "confidence": 0.93,
      "probabilities": {
        "43": 0.9400000000000001,
        "46": 0.04,
        "34": 0.01,
        "21": 0.0,
        "32": 0.0,
        "... 91 more cells at 0.00 to 0.01 ...": 0
      }
    }
  },
  "usage": {
    "input_tokens": 3827,
    "output_tokens": 778
  }
}

Whole board, blind

jev_blind: every unfired cell, position only, no density anywhere:

{
  "state": "Battleship, 10x10, cells 0-99 (cell = row*10 + column). Turn 5. Ships still afloat (lengths): [5, 4, 3, 3, 2]. Live hits not yet sunk: [44, 45].\nBoard (. unknown, o miss, X live hit, # sunk):\n   0 1 2 3 4 5 6 7 8 9\n 0 . o o . . . . . . .\n 1 . . . . . . . . . .\n 2 . . . . . . . . . .\n 3 . . . . . . . . . .\n 4 . . . . X X . . . .\n 5 . . . . . . . . . .\n 6 . . . . . . . . . .\n 7 . . . . . . . . . .\n 8 . . . . . . . . . .\n 9 . . . . . . . . . .",
  "model": "jev-latest",
  "questions": {
    "answer": {
      "type": "choice",
      "criteria": {
        "0": "Cell 0 (row 0, column 0).",
        "3": "Cell 3 (row 0, column 3).",
        "4": "Cell 4 (row 0, column 4).",
        "5": "Cell 5 (row 0, column 5).",
        "... 92 more cells, same shape ...": ""
      },
      "instructions": "You are Jev, admiral of a Battleship fleet. Choose the cell to fire on next that sinks the enemy fleet in the fewest shots."
    }
  }
}

Response, 2917 input tokens:

{
  "model": "jev-1.13.0",
  "answers": {
    "answer": {
      "type": "choice",
      "choice": "43",
      "confidence": 0.63,
      "probabilities": {
        "43": 0.64,
        "46": 0.28,
        "34": 0.03,
        "95": 0.02,
        "14": 0.01,
        "... 91 more cells at 0.00 to 0.01 ...": 0
      }
    }
  },
  "usage": {
    "input_tokens": 2917,
    "output_tokens": 778
  }
}

The chat model's prompt

LLM Reasoner, same turn, verbatim:

You are an expert Battleship admiral. Turn 5. Grid 10x10, cells 0-99, cell = row*10 + column.
Ships still afloat (lengths): 5, 4, 3, 3, 2. Live hits not yet sunk: [44, 45].

Board (. unknown, o miss, X live hit, # sunk):
   0 1 2 3 4 5 6 7 8 9
 0 . o o . . . . . . .
 1 . . . . . . . . . .
 2 . . . . . . . . . .
 3 . . . . . . . . . .
 4 . . . . X X . . . .
 5 . . . . . . . . . .
 6 . . . . . . . . . .
 7 . . . . . . . . . .
 8 . . . . . . . . . .
 9 . . . . . . . . . .

Top candidate cells by placement density (100 = most likely):
- Cell 43 (row 4, column 3): density 100/100; touches a live hit right; extends a horizontal line of 2 live hits.
- Cell 46 (row 4, column 6): density 100/100; touches a live hit left; extends a horizontal line of 2 live hits.
- Cell 34 (row 3, column 4): density 63/100; touches a live hit below; would form a vertical pair with a live hit.
- Cell 35 (row 3, column 5): density 63/100; touches a live hit below; would form a vertical pair with a live hit.
- Cell 54 (row 5, column 4): density 63/100; touches a live hit above; would form a vertical pair with a live hit.
- Cell 55 (row 5, column 5): density 63/100; touches a live hit above; would form a vertical pair with a live hit.

Finish a wounded ship along its line before hunting open water; in open water prefer the densest cell.

You MUST choose one cell from [43, 46, 34, 35, 54, 55].
Format your response EXACTLY like this:

ANALYSIS: [up to 3 sentences]

MOVE: [ONE number from [43, 46, 34, 35, 54, 55]]

Qwen3.8-27B, thinking off, three seconds:

ANALYSIS: The live hits at 44 and 45 form a horizontal segment, indicating
the wounded ship is oriented horizontally. To sink this ship efficiently,
I must extend the line to the left or right [...]

MOVE: 43

The original Hermes Reasoner prompt, before this work: no board, no evidence, six bare numbers:

You are an expert Battleship AI. Turn 5.

CRITICAL: You MUST choose from these TOP probability positions: [43, 46, 34, 35, 54, 55]

Game Data:
- AI hits so far: 2 positions hit
- AI misses so far: 2 positions missed
- Ships sunk: 0 out of 5

INSTRUCTIONS: Pick ONE number from [43, 46, 34, 35, 54, 55] - these are the mathematically optimal targets.

Format your response EXACTLY like this:

ANALYSIS: [3 sentences explaining why you chose from the top probability positions]

MOVE: [ONE number from this list: [43, 46, 34, 35, 54, 55]]

Same state, same six cells, byte for byte. The chat model returns prose & one number a regex must find & validate; jev returns a probability per cell, a confidence, & the orientation answer in the same call, nothing to parse. Three seconds against 0.4. Both can only reorder the six.

Jev versus jev

research/jev_playstyles.py runs each playstyle solo on the same twenty seeded boards, paired, with the bare grid as control. Every call answered, none errored.

Means for every row sit in Final numbers; this table keeps the paired count, the part twenty boards can support.

variant vs grid control, 20 paired boards (better / same / worse)
top3 9 / 0 / 11
fuse_all 9 / 1 / 10
fuse70 9 / 1 / 10
fuse20 8 / 0 / 12
fuse40 (Jev Reasoner in the activity) 9 / 0 / 11
orient 7 / 1 / 12
jev_all 8 / 1 / 11
jev_picks 7 / 0 / 13
top10 8 / 1 / 11
score 9 / 0 / 11
jev_blind 0 / 0 / 20
LLM Reasoner 11 / 0 / 9
Super Human Hunter (other dice) 6 / 4 / 10
Hunter 5 / 0 / 15
Random 0 / 0 / 20

Round robins, three games per pair: among the top few, fuse70 7 wins, top3 6, grid 3, fuse20 2; among the whole-board set, fuse_all 8, grid 6, jev_all 4, jev_blind 0. Three games can't overrule twenty paired boards.

Read the noise first. Super Human Hunter runs the grid's exact algorithm with a different dice stream & scored 48.3 against the control's 44.8 on the same twenty boards. Three & a half shots between two runs of identical code is the yardstick: every jev playstyle with counts in front of it sits inside it, & the paired columns agree (nine boards better, eleven worse, over & over). Twenty boards separate blind jev from everything else & nothing else from anything.

What it says. With placement counts in front of it, jev plays within noise of the grid under every playstyle, & it doesn't care whether it chooses among six cells or all 96: fuse_all sits second overall. What it cares about is the numbers. Same 96 labels with the densities stripped & 45.6 becomes 78.9, worse than the grid on all twenty boards, between Hunter & Random. Jev doesn't need the grid to narrow the choice; it needs the grid's counts as evidence, because a classifier answers a question about a state & doesn't enumerate placements.

On uniformly random fleets nothing beats the grid, & no second opinion among its near ties should: there's no style to read. The fuse40 the activity shipped with makes Jev Reasoner a livelier opponent to narrate, not a stronger one.

Playstyles against the admirals. The three best playstyles by solo mean, three games against each existing admiral, first mover alternating, under a cap of 1,950 classifier calls (1,470 spent, nothing skipped):

playstyle Random Hunter Super Human LLM Reasoner won / played
top3 3/3 3/3 3/3 1/3 10 / 12
fuse_all 3/3 3/3 1/3 2/3 9 / 12
fuse70 3/3 3/3 2/3 1/3 9 / 12

Eighteen of eighteen against Random & Hunter, six of nine against the bare grid, four of nine against the chat model. Same picture as the solo table: jev with counts beats everything without them, & trades evenly with everything that has them.

Every game & every call from these trials sits in jev_playstyles.json.

Reproduce

Results & the plotting script sit beside the 2024 board generator:

cd content/uploads/2024/battleship-solvers
python3 plots_for_arena_blog_post.py arena_results.json

Where this goes

  1. Wider run. Thirty games per pair, about 12,000 classifier calls, to settle the shot or two a decider moves.
  2. Sample the posterior. Placement counting double counts placements that can't coexist; sampling full boards consistent with the evidence fires on the true posterior, worth about two shots per fleet. Generate them conditioned on the shots so far: the 2024 corpus comes from the same uniform placement routine the arena uses, so it adds nothing a generator doesn't, & filtering it late in a game leaves almost no boards. No vendor.
  3. Give jev the opponent. Random fleets have no style, which is why every fusion above tied the bare grid. People hug edges, cluster, or spread. After each sinking jev can classify the placement style from the revealed fleet & re-weight the grid's prior. The prerequisite is a set of human-placed boards, & the activity deletes user_board when a game ends; keeping it is the first change. Then the same harness runs the trial against boards placed the way people place them.

Play any of the five admirals in the Battleship activity on OpenCompletion; jev_hunter.py draws jev's read as a heatmap beside the boards every turn.




Want comments on your site?

Remarkbox — is a free SaaS comment service which embeds into your pages to keep the conversation in the same place as your content. It works everywhere, even static HTML sites like this one!

Remarks: Battleship Arena: Five Admirals, One Grid

© Russell Ballestrini.