So I started tinkering with a genetic programming approach, composing simple behaviors into strategies dynamically. This raises the problem of fitness evaluation.
Archon (the tool, not the type) seems to be a reasonable place to start, so I tried running referenceplayer against itself on all 96 maps. result: 43/53. Then I get to thinking about p-values and such, so I run it again. Same result.
Turns out the only source of randomness in the game is the seed value in the map file. Great for reproducible debugging, not so great for strategy evaluation. So I hack the server to inject a new seed to the map on load. Better, but kinda slow to run enough games.
Looks like the server is essentially single threaded, or at least only one thread is doing significant work at a time. Sure you have to serialize games that pass team memory between them, but why won't it offload runMatch to a pool of worker threads of size matching the CPU cores available?
Are there fundamental reasons that won't work, or is it just a case of 'we never needed it before, so it's not there'?