# ID Scoring Experiments, Seeds 1-4

These results use `id_standard_seed1.json` as the base generated battle shape:

- Map: `Alah`
- Max rounds: 10
- Setup: AI placement, forced single-option commands enabled
- Attacker: iterative deepening, six longbowmen with professions 1-6
- Defender: iterative deepening, six light infantry units with no attached heroes

The saved game zip at the repository root contains real Shardok battles, but the available
`shardok_state` rows are latest-state snapshots and the sampled states are terminal. They are
useful for saved-state ingestion checks, not for live AI decision win-rate measurement.

## Baseline

`STANDARD` attacker vs `STANDARD` defender:

- Attacker wins: 0 / 4
- Defender wins: 4 / 4
- Attacker win rate: 0%
- Average defender surviving units: 6.00
- Average defender surviving troops: 3510.25

Raw rows are recorded in `id_standard_baseline_seed1_4.csv`.

## Candidate Results

| Attacker scoring | Defender scoring | Attacker wins | Defender wins | Avg defender units | Avg defender troops | Notes |
| --- | --- | ---: | ---: | ---: | ---: | --- |
| `NORMALIZED` | `STANDARD` | 0 | 4 | 5.50 | 3224.00 | Better casualties than baseline, no win-rate movement. |
| `MCTS_OPTIMIZED` | `STANDARD` | 0 | 4 | 5.50 | 3503.50 | Similar troop outcome to baseline. |
| `STANDARD` with attacker unit decay removed | `STANDARD` | 0 | 4 | 6.00 | 3204.25 | Best casualty signal in this small sample, no win-rate movement. |

The attacker unit-decay experiment changes `StandardAIScoreCalculator::CombineAttackerScores` to
use a constant unit multiplier, matching the defender hold-castle scoring behavior. The rationale is
the same as the existing defender-side comment: decaying unit value late in the battle can make
tactical actions look worse than waiting when a side is behind on unit value.

## Candidate Raw Rows

### `NORMALIZED` Attacker vs `STANDARD` Defender

```csv
seed,attacker_scoring,defender_scoring,winner,end_reason,total_rounds,total_commands,attacker_ai_commands,defender_ai_commands,attacker_avg_depth,defender_avg_depth,attacker_surviving_units,defender_surviving_units,attacker_surviving_troops,defender_surviving_troops
1,NORMALIZED,STANDARD,defender,last_player_standing,9,121,60,43,2.53333,3.44186,0,5,0,2665
2,NORMALIZED,STANDARD,defender,last_player_standing,10,129,64,47,2.50000,3.46809,0,6,0,3102
3,NORMALIZED,STANDARD,defender,last_player_standing,9,116,59,41,2.59322,3.31707,0,6,0,3752
4,NORMALIZED,STANDARD,defender,last_player_standing,9,114,63,34,2.47619,3.47059,0,5,0,3377
```

### `MCTS_OPTIMIZED` Attacker vs `STANDARD` Defender

```csv
seed,attacker_scoring,defender_scoring,winner,end_reason,total_rounds,total_commands,attacker_ai_commands,defender_ai_commands,attacker_avg_depth,defender_avg_depth,attacker_surviving_units,defender_surviving_units,attacker_surviving_troops,defender_surviving_troops
1,MCTS_OPTIMIZED,STANDARD,defender,last_player_standing,9,129,64,46,2.48438,3.54348,0,6,0,3203
2,MCTS_OPTIMIZED,STANDARD,defender,last_player_standing,9,119,62,40,2.51613,3.22500,0,6,0,3559
3,MCTS_OPTIMIZED,STANDARD,defender,last_player_standing,9,115,62,35,2.67742,3.37143,0,5,0,3969
4,MCTS_OPTIMIZED,STANDARD,defender,last_player_standing,9,114,63,34,2.41270,3.41176,0,5,0,3283
```

### `STANDARD` Attacker With Unit Decay Removed vs `STANDARD` Defender

```csv
seed,attacker_scoring,defender_scoring,winner,end_reason,total_rounds,total_commands,attacker_ai_commands,defender_ai_commands,attacker_avg_depth,defender_avg_depth,attacker_surviving_units,defender_surviving_units,attacker_surviving_troops,defender_surviving_troops
1,STANDARD_NO_ATTACKER_UNIT_DECAY,STANDARD,defender,last_player_standing,10,135,65,51,2.53846,3.45098,0,6,0,2707
2,STANDARD_NO_ATTACKER_UNIT_DECAY,STANDARD,defender,last_player_standing,9,130,64,48,2.48438,3.58333,0,6,0,3149
3,STANDARD_NO_ATTACKER_UNIT_DECAY,STANDARD,defender,last_player_standing,9,129,63,45,2.57143,3.44444,0,6,0,3401
4,STANDARD_NO_ATTACKER_UNIT_DECAY,STANDARD,defender,last_player_standing,9,129,62,46,2.66129,3.41304,0,6,0,3560
```
