archive by month
Skip to content

RPS analyzer and game solver

Regardless of any other adaptation skills you may have, if you can predict your enemy’s opening build, you can better counter it. But it’s not simple. Steamhammer tries to distinguish between opponents that play a fixed build, and those that vary their openings. For those that vary their openings, there is much more: Some choose randomly. Some like to repeat the opening that won the last game, switching only on loss. Some stick with an opening that wins more than a given percentage. Some try openings systematically, “A didn’t work, B is next.” Some choose randomly with some probability distribution over the more successful choices. Sometimes openings are treated as black boxes distinguished only by their names, sometimes as strategies which are understood to counter other strategies (Steamhammer does both at different times).

I am wondering whether it makes sense to write a rock-paper-scissors analyzer that tries to tease out exploitable patterns in the opponent’s behavior (there are established techniques), and combine it with a game solver to make better initial opening choices. On the one hand, many bots have exploitable patterns that I know about. If an RPS analyzer can find the patterns too, Steamhammer might seem to gain the mysterious “star sense” to always play the right thing for no visible reason. On the other hand, it’s relatively easy to reduce your exploitability to a low level—use randomness wisely. Also, as Steamhammer gains skills to adapt its strategy during the game, the initial opening choices make less difference. The gain might be little. And by trying to exploit patterns, Steamhammer could itself become more exploitable; it might backfire.

The parts of the system would be:

1. Classify the enemy build. Steamhammer already does this, though it needs improvement.

2. Statistically analyze the sequence of (win/loss, my opening, your opening) under the assumption that the opponent is trying to counter what we’re doing. Knowing what-counters-what may factor in. The output should be a probability distribution over opening classes, “what are they likely to do?”

3. Knowing what-counters-what definitely factors in here: Solve the game. We start with a prior probability of winning for each of our openings against each opening class the opponent might play, and thanks to Bayes we can update it as we learn about the opponent. That gives us a game matrix with uncertainties in the payoffs. (Since Steamhammer knows a huge number of opening builds, making the game matrix too big to fill in, I would classify Steamhammer’s openings too so that the output only decides which class of opening to play.) Without an RPS analyzer, we can solve the game (I expect I would use a Monte Carlo method to handle the uncertainties) and play not far from a Nash equilibrium (i.e., almost perfectly assuming unexploitable play from the opponent). If an RPS analyzer can make a good estimate of the opponent’s plans, in the best case we can do better: We can exploit the opponent’s deviation from the Nash equilibrium to win more than if we played to a Nash equilibrium ourselves.

It’s unclear to me whether either the RPS analyzer or the game solver is worth the effort. Does anybody have an opinion? Perhaps some bot I haven’t looked at has similar ideas?

AIIDE 2019 - what Microwave did

Here’s data from Microwave’s history files, using the same script as for BananaBrain with a little customization. Unlike Microwave’s learning files, which deliberately omit data and include information from pre-learning, the history files tell what Microwave actually did during the games. Microwave didn’t record information about the opponent’s strategy, so that table is left out. That made it look a little sparse, so I added columns giving the first and last games when the opening was tried, where the first game in the history file is game 0. We can see things like when a winning opening was found, and whether it kept winning. If there are fewer than 100 games recorded for an opponent because Microwave crashed, then the game numbers generally do not align with the tournament round numbers.

Against difficult opponents, Microwave experimented widely. Against some opponents that Microwave pre-trained against, it played whatever came out of pre-training. So I don’t have much to say about opponents in the top half of the post. But toward the bottom I’ve made some comments. Especially see the note to AITP.


#1 locutus

openinggameswinsfirstlast
10Hatch9Pool9gas812%152
2HatchHydra70%053
2HatchLurker729%8389
2HatchLurkerAllIn20%6390
2HatchMuta1225%356
3HatchHydraBust30%1057
3HatchLingBust30%3891
3HatchPoolHydra50%1692
4HatchBeforeGas40%2793
4PoolHard30%1558
4PoolSoft40%2159
5Pool20%3660
5PoolSpeed30%4194
6Pool30%4295
6PoolSpeed30%4396
7Pool20%3761
8Pool30%4497
9Pool922%4578
9PoolLurker20%4679
9PoolSpeed30%1162
9PoolSpeedLing20%4780
ZvP_10Hatch9Pool40%1781
ZvZ_Overpool11Gas40%1882
23 openings988%

#2 purplewave

openinggameswinsfirstlast
10Hatch9Pool9gas119%2093
2HatchHydra60%1487
2HatchMuta50%3594
3HatchHydraBust90%395
3HatchLingBust147%074
4PoolHard10%8080
4PoolSoft714%3075
5Pool812%1590
5PoolSpeed10%8181
6Pool10%8282
6PoolSpeed10%8383
7Pool80%1776
8Pool40%4291
9Pool10%8484
9PoolSpeed30%5292
9PoolSpeedLing1421%477
ZvP_10Hatch9Pool10%8585
ZvZ_Overpool11Gas10%8686
18 openings967%

#3 bananabrain

openinggameswinsfirstlast
10Hatch9Pool9gas10%5454
2HatchHydra10%5151
2HatchMuta10%5252
3HatchLingBust3749%092
4PoolHard30%2963
4PoolSoft40%2867
5Pool1145%2276
5PoolSpeed729%1978
6Pool10%6262
6PoolSpeed520%2068
7Pool10%5555
8Pool30%2469
9Pool743%5670
9PoolSpeed10%5353
9PoolSpeedLing30%2571
ZvZ_Overgas9Pool40%2677
ZvZ_Overpool11Gas30%3579
17 openings9331%

#4 daqin

openinggameswinsfirstlast
10Hatch9Pool9gas1118%277
2HatchHydra40%1878
2HatchLurker40%2379
2HatchMuta1323%1789
3HatchHydraBust30%2051
3HatchLingBust3139%1676
3HatchPoolHydra30%2552
4PoolSoft30%653
5Pool30%754
7Pool30%1155
9Pool30%156
9PoolSpeed30%1057
9PoolSpeedLing30%058
ZvP_10Hatch9Pool30%559
14 openings9019%

#5 steamhammer

openinggameswinsfirstlast
9PoolSpeed10075%099
1 openings10075%

#6 zzzkbot

openinggameswinsfirstlast
9PoolHatch10%00
ZvZ_Overgas11Pool7080%170
2 openings7179%


Why are only 71 games recorded? According to the official results, Microwave crashed in 56 games throughout the tournament, and 29 of those crashes happened against ZZZKBot. Microwave recorded every game in which it did not crash. It’s a debugging opportunity. :-/


#8 iron

openinggameswinsfirstlast
10Hatch9Pool9gas20%5382
2HatchHydra10%8383
2HatchLurkerAllIn20%6388
2HatchMuta119%072
3HatchHydraBust1533%577
3HatchHydraExpo10%8484
3HatchPoolHydra10%8585
4HatchBeforeGas40%1889
4PoolHard60%1378
4PoolSoft714%1171
5Pool10%8686
5PoolSpeed60%1479
6Pool20%5487
6PoolSpeed520%3592
7Pool1030%1968
8Pool714%1780
9Pool812%195
9PoolSpeedLing40%2196
OverpoolTurtle40%2281
19 openings9713%

#9 xiaoyi

openinggameswinsfirstlast
10Hatch9Pool9gas20%4247
2HatchLurker10%4848
2HatchMuta20%4546
4PoolSoft3863%138
5Pool250%039
7Pool5176%4999
9Pool250%4041
9PoolSpeedLing20%4344
8 openings10065%


As soon as Microwave found that 7 pool worked, it played 7 pool exclusively.


#10 mcrave

openinggameswinsfirstlast
2HatchMuta4062%079
3HatchHydraBust1392%8698
4PoolHard10%8080
4PoolSoft4062%140
9Pool10%8585
ZvZ_Overgas11Pool450%8184
6 openings9965%


Microwave was late to discover the success of the hydra bust opening. That’s why it was played so little. The example shows the importance of finding good ideas as early as possible. I am adding smarts to Steamhammer to make it better at finding the good tries fast.

It’s interesting that 2HatchMuta and 4PoolSoft have the same numbers, but were given up on at different times.


#11 ualbertabot

openinggameswinsfirstlast
4PoolSoft10082%099
1 openings10082%


The choice against UAlbertaBot was determined by pre-training. From scratch, I expect Microwave would have tried a wider variety.


#12 aitp

openinggameswinsfirstlast
9PoolSpeedLing10093%099
1 openings10093%


If the first try wins, keep it up. What if Microwave had an opening that would have won more than 93%? The theory is that, above some winning rate, the risk of losing by trying alternatives is higher than the risk of losing by sticking with a known good opening. But what winning rate is high enough to stick with? It depends on how much you respect your opponents. If you expect to win nearly every game, like Locutus, maybe you should switch to an alternative as soon as you lose a single game. If you expect to finish near the bottom, maybe you should stick with a strategy that wins 50%.

But more: How much do you respect each opponent? Maybe bots should have a “contempt factor” like chess programs may use to decide whether to aim for a draw: Accept a low winning rate strategy against Locutus, but demand 95% wins against the unknown who you’ve decided is a weak newbie. I would rather call it a respect factor! In a UCB algorithm, a level of respect is implicitly encoded in the exploration rate constant. Does any bot already have a respect factor for specific opponents?


#13 bunkerboxer

openinggameswinsfirstlast
5Pool10099%099
1 openings10099%


Apparently the initial choice against an unknown is random.

AIIDE 2019 - what BananaBrain learned

I wrote a script to analyze BananaBrain’s game history files, which record its experience with each opponent. For now, I had the script summarize the strategies played and the enemy strategies recognized. The history files also record the map and a value that represents the game duration. History files are rich with information, and there are many ways to summarize it. It would be interesting to see how strategy usage and win rate vary by map, among other possibilities.

The same script should work with minor changes to summarize Microwave’s history files.

BananaBrain had prepared history files for the opponents #1 Locutus, #2 PurpleWave, #5 Steamhammer, #6 ZZZKBot, #7 Microwave, and #8 Iron. Data from the prepared history files was not copied into the write directory. That is different from how Steamhammer and Locutus keep their game records, and it has the nice effect that the tables show exactly what happened in the tournament, from BananaBrain’s point of view.

For each opponent, the left table is BananaBrain’s choice. The right table is BananaBrain’s idea of what the opponent did. All the win rates are from BananaBrain’s point of view, so that, for example, when Locutus played P_1gatecore, BananaBrain won 5% of the time. Of course, the opponent’s view of its own strategy is likely to be more fine-grained than BananaBrain’s. To take the extreme case, Steamhammer played 30 different openings against BananaBrain, and BananaBrain recognized them in 8 categories.


#1 locutus

openinggameswins
PvP_10/12gate617%
PvP_12nexus1136%
PvP_2gatedt100%
PvP_2gatedtexpo90%
PvP_3gaterobo50%
PvP_3gatespeedzeal825%
PvP_4gategoon60%
PvP_9/9gate128%
PvP_9/9proxygate90%
PvP_nzcore812%
PvP_zcore40%
PvP_zcorez60%
PvP_zzcore617%
13 openings10010%
enemygameswins
P_1gatecore205%
P_cannonrush297%
P_fastexpand10%
P_ffe1921%
P_unknown3110%
5 openings10010%


As you might expect against Locutus, the best choice was a fast expansion.

Is the single game of enemy P_fastexpand a misrecognition? I suspect that Locutus played otherwise, and BananaBrain didn’t see everything and wasn’t able to draw the right conclusion. Or maybe it’s a bug somewhere. PurpleWave and McRave also show a single P_fastexpand game.


#2 purplewave

openinggameswins
PvP_10/12gate2370%
PvP_12nexus20%
PvP_2gatedt617%
PvP_2gatedtexpo333%
PvP_3gaterobo20%
PvP_3gatespeedzeal10%
PvP_4gategoon838%
PvP_9/9gate2688%
PvP_9/9proxygate1362%
PvP_nzcore30%
PvP_zcore425%
PvP_zcorez540%
PvP_zzcore425%
13 openings10056%
enemygameswins
P_1gatecore5456%
P_2gate2560%
P_2gatefast633%
P_fastexpand10%
P_ffe250%
P_unknown1267%
6 openings10056%


Against PurpleWave, different zealot rushes worked best. Maybe it is because zealot rushes depend for their success more on execution than on the enemy’s strategic reaction. PurpleWave is particularly good at reacting to the enemy strategy, and BananaBrain is good at execution.


#4 daqin

openinggameswins
PvP_10/12gate862%
PvP_12nexus633%
PvP_2gatedt617%
PvP_2gatedtexpo1283%
PvP_3gaterobo714%
PvP_3gatespeedzeal633%
PvP_4gategoon50%
PvP_9/9gate1493%
PvP_9/9proxygate967%
PvP_nzcore743%
PvP_zcore633%
PvP_zcorez743%
PvP_zzcore743%
13 openings10051%
enemygameswins
P_1gatecore8250%
P_unknown1856%
2 openings10051%


BananaBrain made quite a variety of tries, and was most successful with... zealot rush and dark templars, which are kind of different. BananaBrain’s varied opening choice is a strength.


#5 steamhammer

openinggameswins
PvZ_10/12gate15100%
PvZ_1basespeedzeal888%
PvZ_2basespeedzeal1182%
PvZ_4gate2archon757%
PvZ_5gategoon786%
PvZ_9/9gate1292%
PvZ_9/9proxygate15100%
PvZ_bisu475%
PvZ_neobisu250%
PvZ_sairdt7100%
PvZ_sairgoon20%
PvZ_stove1070%
12 openings10085%
enemygameswins
Z_10hatch3876%
Z_12hatch3184%
Z_12pool1191%
Z_4/5pool3100%
Z_9pool1100%
Z_9poolspeed4100%
Z_overpool2100%
Z_unknown10100%
8 openings10085%


2 gate zealot openings work well against Steamhammer—but only when played by PurpleWave or BananaBrain. Steamhammer can usually defend versus a lesser protoss.


#6 zzzkbot

openinggameswins
PvZ_10/12gate17100%
PvZ_1basespeedzeal1191%
PvZ_2basespeedzeal425%
PvZ_4gate2archon450%
PvZ_5gategoon667%
PvZ_9/9gate15100%
PvZ_9/9proxygate367%
PvZ_bisu560%
PvZ_neobisu425%
PvZ_sairdt12100%
PvZ_sairgoon650%
PvZ_stove13100%
12 openings10083%
enemygameswins
Z_4/5pool3385%
Z_9pool17100%
Z_9poolspeed2100%
Z_overpool2365%
Z_unknown2584%
5 openings10083%


I like that BananaBrain varies its opening choice even when several openings win 100%. (Steamhammer does too; if more than one opening has scored 100% so far, Steamhammer chooses randomly among them.) Playing a strong opening gives the opponent one problem to solve (“how do I survive this?”). Unpredictably playing one of several strong openings sets the opponent two problems (“what is this fiend doing, and then how do I live through it?”) which must both be solved, more than twice as difficult.


#7 microwave

openinggameswins
PvZ_10/12gate2090%
PvZ_1basespeedzeal1173%
PvZ_2basespeedzeal333%
PvZ_4gate2archon650%
PvZ_5gategoon875%
PvZ_9/9gate1788%
PvZ_9/9proxygate875%
PvZ_bisu1060%
PvZ_neobisu333%
PvZ_sairdt450%
PvZ_sairgoon20%
PvZ_stove862%
12 openings10071%
enemygameswins
Z_10hatch888%
Z_12hatch3855%
Z_12pool2100%
Z_4/5pool2871%
Z_9pool967%
Z_9poolspeed7100%
Z_overpool3100%
Z_unknown5100%
8 openings10071%

#8 iron

openinggameswins
PvT_10/12gate667%
PvT_10/15gate30%
PvT_12nexus425%
PvT_1gatedtexpo2584%
PvT_2gatedt1060%
PvT_9/9gate1060%
PvT_9/9proxygate475%
PvT_bulldog10%
PvT_dtdrop1464%
PvT_nzcore540%
PvT_proxydt20%
PvT_stove425%
PvT_zcore540%
PvT_zzcore743%
14 openings10058%
enemygameswins
T_1fac3063%
T_2fac10%
T_fastexpand2948%
T_unknown4062%
4 openings10058%


Bulldog! That involves protoss dropping zealots, typically on cliff tanks, with a simultaneous attack by ground. When successful, a bulldog can abruptly break a terran defense that is sound against any purely ground attack. I don’t think I’ve seen BananaBrain play that; I should watch more games versus terran. Can anybody point out an example?


#9 xiaoyi

openinggameswins
PvT_10/12gate1090%
PvT_10/15gate743%
PvT_12nexus520%
PvT_1gatedtexpo11100%
PvT_2gatedt757%
PvT_9/9gate633%
PvT_9/9proxygate617%
PvT_bulldog50%
PvT_dtdrop989%
PvT_nzcore617%
PvT_proxydt771%
PvT_stove875%
PvT_zcore633%
PvT_zzcore757%
14 openings10057%
enemygameswins
T_1fac3757%
T_fastexpand2065%
T_unknown4353%
3 openings10057%


The Stove worked against XiaoYi? Again, XiaoYi shows weakness against tricks. The Stove involves making scouts to harass while teching to dark templar. It should not be hard for a good terran to defend against; notice that Iron dealt with it well enough.


#10 mcrave

openinggameswins
PvP_10/12gate771%
PvP_12nexus650%
PvP_2gatedt667%
PvP_2gatedtexpo850%
PvP_3gaterobo978%
PvP_3gatespeedzeal862%
PvP_4gategoon757%
PvP_9/9gate875%
PvP_9/9proxygate633%
PvP_nzcore1090%
PvP_zcore757%
PvP_zcorez1090%
PvP_zzcore888%
13 openings10069%
enemygameswins
P_1gatecore3474%
P_2gate2665%
P_2gatefast2969%
P_fastexpand10%
P_proxygate4100%
P_unknown650%
6 openings10069%


It looks like most openings performed similarly against McRave, and BananaBrain struggled to identify what worked. I imagine a fierce learning battle, both trying to keep one step ahead.


#11 ualbertabot

openinggameswins
PvU_10/12gate1794%
PvU_9/9gate17100%
PvU_9/9proxygate1385%
PvU_flex1267%
PvU_nzcore1164%
PvU_zcore1688%
PvU_zzcore1377%
7 openings9984%
enemygameswins
P_1gatecore8100%
P_2gate683%
P_2gatefast2171%
P_unknown333%
T_1fac5100%
T_2fac7100%
T_2rax1090%
T_fastexpand3100%
T_unknown5100%
Z_10hatch2100%
Z_12hatch8100%
Z_4/5pool1771%
Z_unknown475%
13 openings9984%

#12 aitp

openinggameswins
PvT_10/12gate7100%
PvT_10/15gate8100%
PvT_12nexus6100%
PvT_1gatedtexpo8100%
PvT_2gatedt7100%
PvT_9/9gate6100%
PvT_9/9proxygate7100%
PvT_bulldog9100%
PvT_dtdrop7100%
PvT_nzcore7100%
PvT_proxydt7100%
PvT_stove9100%
PvT_zcore6100%
PvT_zzcore6100%
14 openings100100%
enemygameswins
T_1fac4100%
T_2fac12100%
T_fastexpand24100%
T_unknown60100%
4 openings100100%

#13 bunkerboxer

openinggameswins
PvT_10/12gate7100%
PvT_10/15gate7100%
PvT_12nexus7100%
PvT_1gatedtexpo7100%
PvT_2gatedt7100%
PvT_9/9gate6100%
PvT_9/9proxygate7100%
PvT_bulldog8100%
PvT_dtdrop7100%
PvT_nzcore6100%
PvT_proxydt8100%
PvT_stove8100%
PvT_zcore7100%
PvT_zzcore8100%
14 openings100100%
enemygameswins
T_unknown100100%
1 openings100100%


BananaBrain apparently does not have a bunker rush recognizer.

AIIDE 2019 - what AITP learned

AITP scored zero against over half of the participants, so its learning results are not deeply interesting. Also, its strategies are labeled with opaque sequences of letters and numbers. But it was easy to generate the tables, and they offer a little insight into AITP’s interesting design, so here they are.

Unlike other Steamhammer forks, AITP does not spell out concrete opening builds in the configuration file, at least not beyond 4 x SCV—start by making workers. The strategy names themselves are code sequences that tell what to do throughout the game. The letters A, B, C are stages of the game, and the combinations A1, A2 etc. are “modules” that may be active during the matching stage. Each module has its own update method to decide what to build, and the StrategyManager sometimes checks the current module for other decisions. There is module switching code in case of surprises (StrategyManager::shouldSwitchModule()); it also sets flags and updates other information.

I like it, it’s a flexible way to specify a plan for the whole game, and allows for changing plans on the fly. It’s an abstract strategy system, similar in principle to what I plan for Steamhammer. My implementation will look entirely different, though.

AITP has only 5 strategies configured. I gather that it can switch to other sequences on the fly if circumstances warrant. 5 is not many, though; I think they have only completed the basics. Here is the Steamhammer opening group it assigns to each strategy. It does not use the opening group strings, but they may have some heuristic value:

A1-B3-C2 AntiRush
A1-B1-B2-C2 Rush
A3-B5-C1 NoneBunker
A3-B7-C1 NoneBunker
A4-B2-C1 8BB (does that mean BBS?)


#1 locutus

openinggameswins
A1-B1-B2-C270%
A1-B3-C2100%
A3-B5-C1160%
A3-B7-C1270%
A4-B2-C1400%
5 openings1000%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Naked expand5959%0%1111%0%7%83%
Proxy2727%0%99%0%11%67%
Turtle99%0%33%0%0%67%
Unknown55%0%7777%0%0%80%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout1002:011:178:58
enemy combat units1003:492:428:06
enemy air units357:186:147:57
enemy cloaked units617:346:1411:26


AITP lost every game, but did not explore its possible strategies equally. It seems to have priorities. Maybe later I will look into how that works. AutoGasSteal is set true in the configuration file, but AITP did not record itself as stealing gas against any opponent. Presumably it is turned off in the code.


#2 purplewave

openinggameswins
A1-B1-B2-C270%
A1-B3-C2150%
A3-B5-C1170%
A3-B7-C1200%
A4-B2-C1300%
5 openings890%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Naked expand8090%0%33%0%2%98%
Unknown910%0%8697%0%0%89%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout892:031:196:53
enemy combat units893:393:116:22
enemy air units836:536:0311:38
enemy cloaked units606:535:2514:01

#3 bananabrain

openinggameswins
A1-B1-B2-C2110%
A1-B3-C250%
A3-B5-C1110%
A3-B7-C1370%
A4-B2-C1350%
5 openings990%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush99%0%33%0%0%78%
Heavy rush2020%0%55%0%10%70%
Naked expand3030%0%55%0%3%83%
Proxy3131%0%44%0%0%90%
Unknown99%0%8283%0%0%89%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout992:010:456:38
enemy combat units993:392:258:07
enemy air units696:313:3911:25
enemy cloaked units786:343:479:46

#4 daqin

openinggameswins
A1-B1-B2-C250%
A1-B3-C270%
A3-B5-C1170%
A3-B7-C1160%
A4-B2-C1280%
5 openings730%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Unknown73100%0%73100%0%0%100%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout734:032:4310:39
enemy combat units733:422:347:59
enemy air units737:015:558:43
enemy cloaked units3311:0110:0115:01

#5 steamhammer

openinggameswins
A1-B1-B2-C250%
A1-B3-C2176%
A3-B5-C140%
A3-B7-C1225%
A4-B2-C1215%
5 openings694%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Naked expand6797%3%1319%0%18%82%
Unknown23%50%5681%5%0%50%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout692:270:515:46
enemy combat units693:312:537:15
enemy air units487:245:2214:13
enemy cloaked units78:227:3411:21


Steamhammer is the highest-ranked opponent that AITP scored wins against. It looks like a few scattered games, though.


#6 zzzkbot

openinggameswins
A1-B3-C25147%
A3-B7-C130%
A4-B2-C1425%
3 openings5843%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush5798%44%3764%51%63%37%
Unknown12%0%2136%29%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout582:370:588:29
enemy combat units582:562:185:11
enemy air units438:136:3811:51
enemy cloaked units0---


It looks like ZZZKBot played its 4 pool in over half the games, and perhaps its guardian rush in the remainder. A1-B3-C2 is the strategy labeled AntiRush. AITP recorded more wins for itself than it actually scored, despite recording fewer games than it played. I suspect that AITP has changed the meaning of the numbers.


#7 microwave

openinggameswins
A1-B1-B2-C250%
A1-B3-C23222%
A3-B5-C1140%
A3-B7-C1170%
A4-B2-C170%
5 openings759%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush5979%8%57%0%3%93%
Naked expand1520%13%34%0%7%80%
Unknown11%0%6789%10%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout752:381:435:53
enemy combat units753:292:464:29
enemy air units1313:0111:2615:46
enemy cloaked units0---

#8 iron

openinggameswins
A1-B1-B2-C2190%
A1-B3-C250%
A3-B5-C1270%
A3-B7-C1120%
A4-B2-C1360%
5 openings990%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory9899%0%99100%0%100%0%
Unknown11%0%--0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout992:181:557:23
enemy combat units994:143:334:55
enemy air units956:055:376:39
enemy cloaked units955:555:266:38

#9 xiaoyi

openinggameswins
A1-B1-B2-C2100%
A1-B3-C2130%
A3-B5-C1250%
A3-B7-C1110%
A4-B2-C1360%
5 openings950%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory9499%0%95100%0%100%0%
Unknown11%0%--0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout951:471:228:27
enemy combat units953:132:394:46
enemy air units929:137:2211:14
enemy cloaked units896:265:4111:14

#10 mcrave

openinggameswins
A1-B1-B2-C230%
A1-B3-C21527%
A3-B5-C1140%
A3-B7-C1268%
A4-B2-C14030%
5 openings9818%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush66%17%22%0%17%67%
Heavy rush3738%19%44%0%5%89%
Naked expand4243%21%77%14%10%86%
Unknown1313%8%8587%20%0%92%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout981:591:1412:41
enemy combat units984:132:557:13
enemy air units367:396:1710:39
enemy cloaked units726:345:2911:01

#11 ualbertabot

openinggameswins
A1-B1-B2-C21421%
A1-B3-C23057%
A3-B5-C110%
A4-B2-C11421%
4 openings5939%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush5085%40%1322%54%20%74%
Naked expand712%14%35%33%0%71%
Unknown23%100%4373%35%0%50%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout582:411:1712:26
enemy combat units583:292:187:27
enemy air units87:056:4615:01
enemy cloaked units0---


Again, AITP recorded fewer games and more wins than happened. Is it a bug, or is it intentionally over-recording wins for certain strategies to focus its search? Or what? AITP is interesting, it deserves a closer look into the code.


#13 bunkerboxer

openinggameswins
A1-B3-C25698%
A3-B5-C13100%
2 openings5998%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Unknown23%100%5898%98%0%50%
Worker rush5797%98%12%100%0%100%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout562:071:503:25
enemy combat units367:442:589:22
enemy air units0---
enemy cloaked units0---

overall

totalTvTTvPTvZTvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
A1-B1-B2-C2863% 290% 330% 100% 1421%
A1-B3-C225642% 7474% 528% 10032% 3057%
A3-B5-C11492% 555% 750% 180% 10%
A3-B7-C11912% 230% 1262% 422%
A4-B2-C12916% 720% 1737% 326% 1421%
total97314%25323%4594%20217%5939%
openings played55554

AIIDE 2019 - what DaQin learned

DaQin is derived from Locutus and also keeps 200 game records. But DaQin did not have pre-learned data. No games were left uncompleted; there are 100 against each opponent.

DaQin plays fewer builds than the other bots I’ve looked at so far.


#1 locutus

openinggameswins
3GateDT10017%
1 openings10017%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
DarkTemplar rush8989%16%9696%17%97%2%
Proxy66%17%22%0%0%0%
Unknown55%40%22%50%0%0%
timing#medianearlylate
gas steal attempt471:431:392:06
gas steal success0---
enemy scout996:071:219:07
enemy combat units1004:342:226:47
enemy air units966:304:0218:41
enemy cloaked units0---


DaQin had an enemy-specific strategy configured for Locutus, so it didn’t try anything else. Locutus is the only opponent that DaQin tried to prepare for, as far as I can see.

DaQin incorrectly recognized dark templar rush as Locutus’s strategy in most games, then correctly recorded that no cloaked units were seen during the game. See yesterday for Locutus’s play against DaQin, which did not include any DT build. I assume that the dark templar recognition is deliberately over-cautious, because DTs are dangerous. Locutus does have a fake dark templar build, where it adds a citadel of Adun to fool opponents into expecting dark templar (it works against most UAlbertaBot-derived bots).


#2 purplewave

openinggameswins
2GateDT2322%
3GateDT30%
4GateGoon7414%
3 openings10015%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
DarkTemplar rush3232%16%3535%23%69%0%
Fast rush6666%14%6464%11%80%0%
Proxy11%100%11%0%0%0%
Unknown11%0%--0%0%
timing#medianearlylate
gas steal attempt290:460:460:50
gas steal success8---
enemy scout992:171:184:41
enemy combat units992:472:215:13
enemy air units418:424:0518:10
enemy cloaked units856:075:0615:41


Against PurpleWave, in contrast, DaQin less often foresaw dark templar, but apparently often faced them. (Arbiters can’t get out that fast.)


#3 bananabrain

openinggameswins
2GateDT425%
3GateDT6856%
4GateGoon2836%
3 openings10049%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
DarkTemplar rush4747%53%5555%62%51%0%
Fast rush4848%44%3939%33%35%0%
Heavy rush11%0%22%50%0%0%
Not fast rush11%100%22%0%0%0%
Proxy11%100%22%50%0%0%
Unknown22%50%--0%0%
timing#medianearlylate
gas steal attempt431:420:461:48
gas steal success9---
enemy scout1001:591:213:09
enemy combat units1002:572:195:43
enemy air units678:143:5812:42
enemy cloaked units285:474:5719:38

#5 steamhammer

openinggameswins
ForgeExpand5GateGoon10094%
1 openings10094%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush--11%100%0%0%
Heavy rush2929%97%1818%100%14%3%
Hydra bust11%100%22%100%0%0%
Not fast rush6464%92%7272%93%69%8%
Proxy--11%100%0%0%
Unknown66%100%66%83%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout972:250:516:03
enemy combat units1003:171:577:03
enemy air units189:235:3016:18
enemy cloaked units165:514:5713:43

#6 zzzkbot

openinggameswins
ForgeExpand5GateGoon9710%
ForgeExpandSpeedlots30%
2 openings10010%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush33%33%55%100%0%33%
Heavy rush9090%3%9393%4%100%0%
Not fast rush--11%100%0%0%
Unknown77%86%11%0%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout972:570:597:30
enemy combat units1002:391:474:31
enemy air units77:587:468:25
enemy cloaked units0---


How did ZZZKBot upset DaQin? These numbers suggest zergling bust (it could be hydras, but DaQin does have a hydra bust recognizer which did not fire): Mostly “heavy rush,” few mutalisks, no lurkers. Steamhammer also settled on zergling bust as the best bet, but was much less successful. Microwave tried its zergling bust build versus DaQin without success. Maybe ZZZKBot’s extreme aggression is the key.


#7 microwave

openinggameswins
ForgeExpand5GateGoon8485%
ForgeExpandSpeedlots1675%
2 openings10083%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush1515%93%1515%100%33%0%
Heavy rush3232%81%2020%85%16%9%
Not fast rush5050%80%5959%76%66%4%
Proxy--11%100%0%0%
Unknown33%100%55%100%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout972:331:106:10
enemy combat units903:291:506:37
enemy air units4110:375:1514:07
enemy cloaked units56:316:2310:23

#8 iron

openinggameswins
12NexusCarriers9296%
4GateGoon850%
2 openings10092%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory5555%96%9595%94%95%2%
Proxy88%50%33%33%0%12%
Unknown3737%95%22%100%0%0%
timing#medianearlylate
gas steal attempt922:192:152:35
gas steal success0---
enemy scout872:581:4112:09
enemy combat units1004:182:505:49
enemy air units368:236:2915:43
enemy cloaked units308:257:5415:43


12NexusCarriers seems to be the default build versus terran. Apparently terrans, even Iron, were not able to punish the fast expand. Well, they’re not supposed to be able to without risk, that’s the point of cutting probes for nexus on 12, but it does require good play from protoss to ensure.


#9 xiaoyi

openinggameswins
12NexusCarriers9384%
3GateDT10%
4GateGoon10%
DTDrop580%
4 openings10082%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory6060%83%4747%94%48%42%
Not fast rush2929%76%1010%80%14%48%
Proxy11%0%22%100%0%0%
Safe expand44%100%11%0%0%0%
Unknown66%100%4040%70%0%17%
timing#medianearlylate
gas steal attempt992:190:462:25
gas steal success3---
enemy scout932:232:1019:03
enemy combat units1003:242:337:06
enemy air units808:237:0917:30
enemy cloaked units118:157:578:27


XiaoYi usually got air tech pretty fast, that’s unusual and interesting. I’m guessing it scouted the carriers coming and prepared wraiths.


#10 mcrave

openinggameswins
2GateDT10%
3GateDT6252%
4GateGoon3724%
3 openings10041%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
DarkTemplar rush1919%53%1616%62%63%0%
Fast rush7979%39%8383%36%96%0%
Naked expand--11%100%0%0%
Unknown22%0%--0%0%
timing#medianearlylate
gas steal attempt131:410:461:46
gas steal success2---
enemy scout1002:221:256:11
enemy combat units1003:032:215:29
enemy air units216:113:3815:57
enemy cloaked units766:235:178:33


McRave upset DaQin. Dark templar in 3 out of 4 games, and they came out pretty early. PurpleWave showed a similar pattern, but it wasn’t as salient because it wasn’t an upset. The dark templar rush recognizer did not seem to be fully effective, possibly because it was overridden by the fast rush recognizer. DaQin’s best counter was DT-back-atcha.


#11 ualbertabot

openinggameswins
12NexusCarriers250%
3GateDT2588%
4GateGoon450%
DTDrop250%
ForgeExpand5GateGoon6778%
5 openings10078%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
DarkTemplar rush1212%75%1111%91%17%8%
Factory33%67%1111%100%0%0%
Fast rush6767%78%4747%57%51%7%
Heavy rush11%100%55%100%0%0%
Hydra bust--11%100%0%0%
Not fast rush1313%92%1515%100%8%15%
Proxy11%0%22%50%0%0%
Unknown33%67%88%100%0%0%
timing#medianearlylate
gas steal attempt241:430:462:17
gas steal success2---
enemy scout871:471:149:30
enemy combat units983:011:386:58
enemy air units97:376:0715:47
enemy cloaked units45:094:335:19


DaQin had some trouble adapting to random UAlbertaBot. This is a point where preparation for the opponent would have been valuable: Make a build that UAlbertaBot can’t beat and ensure that it is played. It can be a general-purpose build; PurpleWave included a cannon turtle build that is safe against all sorts of rushes.


#12 aitp

openinggameswins
12NexusCarriers100100%
1 openings100100%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory7979%100%55%100%4%96%
Unknown2121%100%9595%100%0%90%
timing#medianearlylate
gas steal attempt1002:192:162:25
gas steal success0---
enemy scout117:532:3811:45
enemy combat units1005:552:437:29
enemy air units6710:078:5014:01
enemy cloaked units0---

#13 bunkerboxer

openinggameswins
12NexusCarriers9598%
4GateGoon5100%
2 openings10098%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush--11%100%0%0%
Not fast rush7878%97%3535%100%35%60%
Proxy55%100%55%100%0%0%
Unknown1717%100%5959%97%0%71%
timing#medianearlylate
gas steal attempt932:202:157:19
gas steal success28---
enemy scout622:071:477:18
enemy combat units592:592:097:51
enemy air units0---
enemy cloaked units0---


Beating BunkerBoxeR with a build of fast expansion into carriers is... not the intuitive choice. But I guess it worked.


overall

totalPvTPvPPvZPvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
12NexusCarriers38294% 38094% 250%
2GateDT2821% 2821%
3GateDT25942% 10% 23337% 2588%
4GateGoon15725% 1464% 13921% 450%
DTDrop771% 580% 250%
ForgeExpand5GateGoon34865% 28162% 6778%
ForgeExpandSpeedlots1963% 1963%
total120063%40093%40030%30062%10078%
openings played74325

AIIDE 2019 - what Locutus learned

Locutus’s game records are in almost the same format as Steamhammer’s and can be summarized by the same script. I expect it will also work for DaQin and AITP.

Where Steamhammer was set to keep 100 game records per opponent, Locutus was set to keep 200. Since there were 100 rounds in the tournament, game counts over 100 mean that pre-learned data is included in the table alongside the tournament data. If Locutus was not trained on a near-final version of the opponent, then the two could be significantly different.


#2 purplewave

openinggameswins
4GateGoon2854%
4GateGoonWithObs1662%
FakeDTRush1020%
ForgeExpand1963%
ZealotDrop12773%
5 openings20066%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Dark templar2010%50%3015%37%45%0%
Fast rush32%100%52%80%0%0%
Heavy rush63%17%126%67%0%0%
Not fast rush17186%69%15376%71%81%0%
timing#medianearlylate
gas steal attempt921:440:442:01
gas steal success15---
enemy scout1862:271:0916:11
enemy combat units1983:292:197:26
enemy air units556:504:5020:31
enemy cloaked units9311:075:1319:54


After seeing a few Locutus-PurpleWave games I got the impression that PurpleWave reacted adequately to Locutus’s trick strategy of cannoning the ramp and then dropping zealots. So I was surprised that Locutus considered it the best choice. But the overall win rate is high compared to the tournament results, so I suspect it is influenced by pre-learned data from games against a weaker version of PurpleWave.


#3 bananabrain

openinggameswins
4GateGoon1283%
ForgeExpand3784%
ZealotDrop15195%
3 openings20092%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Dark templar52%80%2814%100%40%0%
Fast rush63%100%126%83%0%0%
Heavy rush10%100%1910%89%0%0%
Not fast rush18894%92%14170%91%70%0%
timing#medianearlylate
gas steal attempt591:450:461:52
gas steal success6---
enemy scout1961:570:4610:09
enemy combat units2003:302:187:25
enemy air units2015:4113:0517:35
enemy cloaked units316:135:4616:11

#4 daqin

openinggameswins
4GateGoon1164%
FakeDTRush10%
ForgeExpand10%
ZealotDrop8787%
4 openings10083%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Dark templar99%89%2121%76%11%0%
Fast rush22%100%33%67%0%0%
Not fast rush8888%82%7676%86%74%0%
Unknown11%100%--0%0%
timing#medianearlylate
gas steal attempt261:450:451:49
gas steal success4---
enemy scout973:022:1518:05
enemy combat units1003:312:195:22
enemy air units217:4716:2319:10
enemy cloaked units917:186:029:17

#5 steamhammer

openinggameswins
4GateGoon7100%
9-9GateDefensive5100%
CannonFirst4GateGoon11100%
ForgeExpand4Gate2Archon1173%
ForgeExpand5GateGoon15595%
ForgeExpandSpeedlots1100%
PlasmaCorsairsCarriers9100%
ProxyHeavyZealotRush210%
8 openings20094%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush147%100%2613%96%57%0%
Heavy rush2613%81%5930%92%38%0%
Hydra bust42%100%2312%87%50%0%
Not fast rush15678%96%9246%98%53%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout1882:210:5118:45
enemy combat units1993:102:027:11
enemy air units125:405:016:14
enemy cloaked units710:025:1519:39


The numbers in the “recognized” columns of the plan table show how widely Steamhammer cast its net for a solution to Locutus.

Locutus never tried to steal the gas of a zerg. Objectively, that makes sense. In the context of bot play, I’m not so sure; many bots of all races mess up their builds in the face of a gas steal.


#6 zzzkbot

openinggameswins
9-9GateDefensive4100%
CannonAtChokeFirst4GateGoon1354%
CannonFirst4GateGoon17899%
PlasmaCorsairsCarriers1100%
PlasmaProxy2Gate4100%
5 openings20096%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush11557%97%10754%94%73%0%
Heavy rush7839%96%6633%100%54%0%
Hydra bust10%100%21%100%100%0%
Not fast rush63%100%2512%96%17%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout2002:250:515:58
enemy combat units1962:282:037:59
enemy air units527:535:2613:43
enemy cloaked units0---

#7 microwave

openinggameswins
9-9GateDefensive2100%
ForgeExpand4Gate2Archon367%
ForgeExpand5GateGoon14699%
ForgeExpandSpeedlots4480%
PlasmaCorsairsCarriers2100%
PlasmaProxy2Gate3100%
6 openings20094%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush5025%82%4120%98%32%0%
Heavy rush3417%100%5025%90%47%0%
Hydra bust--178%100%0%0%
Not fast rush11557%98%9146%95%57%0%
Proxy10%100%10%100%0%0%
timing#medianearlylate
gas steal attempt0---
gas steal success0---
enemy scout1952:301:0721:14
enemy combat units1983:031:477:59
enemy air units6911:195:4924:25
enemy cloaked units326:375:2113:49

#8 iron

openinggameswins
CautiousDTDrop20098%
1 openings20098%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Not fast rush136%100%6130%100%46%0%
Wall-in18794%98%13970%97%71%0%
timing#medianearlylate
gas steal attempt350:460:450:48
gas steal success11---
enemy scout1902:451:4210:46
enemy combat units2004:072:346:39
enemy air units1178:186:5513:39
enemy cloaked units1178:186:5513:39


Locutus declared an enemy-specific strategy against Iron. I’m not sure why it also had pre-learned data.


#9 xiaoyi

openinggameswins
10-15GateGoon10%
10Gate25NexusFE250%
DTDrop10%
ForgeExpand10%
Proxy2ZealotsIntoGoons3093%
ProxyDTRush16595%
6 openings20093%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Not fast rush200100%93%200100%93%100%0%
timing#medianearlylate
gas steal attempt681:171:121:50
gas steal success12---
enemy scout1943:012:1115:29
enemy combat units2004:202:296:57
enemy air units1312:597:5415:10
enemy cloaked units48:007:548:18


Proxy DT rush. That tends to confirm my picture of XiaoYi as vulnerable to tricks.


#10 mcrave

openinggameswins
4GateGoon580%
4GateGoonWithObs3100%
FakeDTRush10%
ForgeExpand250%
ZealotDrop18994%
5 openings20093%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Dark templar32%100%168%94%67%0%
Fast rush32%100%189%100%0%0%
Heavy rush21%50%52%100%0%0%
Not fast rush19296%93%16180%92%82%0%
timing#medianearlylate
gas steal attempt991:460:451:57
gas steal success2---
enemy scout1932:091:2114:38
enemy combat units2003:352:217:26
enemy air units2411:447:1920:31
enemy cloaked units6011:035:1514:25

#11 ualbertabot

openinggameswins
CannonFirst4GateGoon18899%
PlasmaProxy2Gate10100%
Proxy9-9Gate20%
3 openings20098%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Dark templar10%100%116%100%0%0%
Fast rush2312%100%2914%93%22%0%
Heavy rush4824%96%6332%100%29%0%
Not fast rush12864%99%9748%99%51%0%
timing#medianearlylate
gas steal attempt952:001:572:03
gas steal success0---
enemy scout1272:111:185:45
enemy combat units1353:222:016:54
enemy air units76:456:416:53
enemy cloaked units114:344:305:13


Locutus configured an enemy-specific strategy against UAlbertaBot. Openings other than CannonFirst4GateGoon are from pre-learned data, which was ignored in making the opening decision.


#12 aitp

openinggameswins
DTDrop66100%
ForgeExpand3397%
Turtle1100%
3 openings10099%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush22%100%77%100%0%0%
Heavy rush11%100%11%100%0%0%
Not fast rush7777%99%6262%100%62%0%
Unknown11%100%--0%0%
Wall-in1919%100%3030%97%42%0%
timing#medianearlylate
gas steal attempt430:460:451:27
gas steal success15---
enemy scout263:192:416:02
enemy combat units1003:482:017:49
enemy air units0---
enemy cloaked units0---

#13 bunkerboxer

openinggameswins
10Gate25NexusFE2195%
CannonFirst4GateGoon88100%
ForgeExpand79100%
PlasmaProxy2Gate10100%
Proxy9-9Gate20%
5 openings20098%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush178%100%2010%90%24%0%
Heavy rush3618%94%3518%100%31%0%
Not fast rush14774%99%14472%99%83%1%
Unknown--10%100%0%0%
timing#medianearlylate
gas steal attempt871:290:452:03
gas steal success16---
enemy scout1042:071:273:18
enemy combat units1132:262:018:14
enemy air units0---
enemy cloaked units0---

overall

totalPvTPvPPvZPvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
10-15GateGoon10% 10%
10Gate25NexusFE2391% 2391%
4GateGoon6368% 5664% 7100%
4GateGoonWithObs1968% 1968%
9-9GateDefensive11100% 11100%
CannonAtChokeFirst4GateGoon1354% 1354%
CannonFirst4GateGoon465100% 18999% 276100%
CautiousDTDrop20098% 20098%
DTDrop6799% 6799%
FakeDTRush1217% 1217%
ForgeExpand17290% 11398% 5975%
ForgeExpand4Gate2Archon1471% 1471%
ForgeExpand5GateGoon30197% 30197%
ForgeExpandSpeedlots4580% 4580%
PlasmaCorsairsCarriers12100% 12100%
PlasmaProxy2Gate27100% 7100% 20100%
Proxy2ZealotsIntoGoons3093% 3093%
Proxy9-9Gate40% 40%
ProxyDTRush16595% 16595%
ProxyHeavyZealotRush210% 10%
Turtle1100% 1100%
ZealotDrop55488% 55488%
total220092%60097%70084%60095%30098%
openings played2285103

AIIDE 2019 - what Steamhammer learned

Today is Steamhammer. With a mid-rank finish and the widest range of builds, plus informative game records, Steamhammer may give us the best insight into how other bots played.

The tournament was 100 rounds, and Steamhammer was configured to remember the previous 100 game records, because in play there is no reason to remember more (earlier records are increasingly discounted). Steamhammer also had pre-learned game records for many opponents, so when the game record count reached 100, new records added caused old pre-learned records to drop away. Not all 100 tournament games happened for each opponent, but the pre-learned games filled in the small gaps so that Steamhammer ended up with exactly 100 game records per opponent in every case.

The “opening” table counts Steamhammer’s opening choices. The “plan” table shows the plan that Steamhammer first predicted that the opponent would play, then recognized that the opponent was playing. Both prediction and recognition can be wrong. The timing table is new this year, an attempt to get a little more information out of Steamhammer’s rich game records. For some events, it gives the count of games in which the event occurred, and the median time, earliest time, and latest time it occurred in those games when it did. The times are given under the assumption that 1 second of game time is exactly 24 frames, a simplification.

gas steal attempt - When Steamhammer sent out the drone to steal gas (if it did).
gas steal success - Whether the gas steal attempt succeeded in taking the opponent’s gas. Steamhammer doesn’t record the time it happens, so this is only a success count.
enemy scout - When the enemy scout first reached Streamhammer’s base.
enemy combat units - When the first enemy combat unit was seen.
enemy air units - When the enemy is first known to have tech for flying units (except overlords).
enemy cloaked units - When the enemy is first known to have tech for cloaked units.


#1 locutus

openinggameswins
11Gas10PoolMuta10%
12Hatch12Pool10%
2.5HatchMuta20%
2HatchHydra10%
2HatchHydraBust40%
2HatchLingAllInSpire10%
3HatchHydraBust50%
3HatchHydraExpo10%
3HatchLateHydras+150%
3HatchLingBust230%
4HatchBeforeGas10%
4HatchBeforeLair50%
5HatchBeforeGas20%
5PoolHard2Player20%
5Scout10%
7PoolSoft10%
8-8HydraRush10%
8Hatch7Pool10%
8Pool10%
9Pool20%
9PoolHatch20%
9PoolSpeedAllIn10%
AntiFact_Overpool9Gas10%
DefilerRush20%
Over10Hatch2Sunk10%
Over10HatchSlowLings10%
Over10PoolMuta10%
OverhatchExpoLing20%
OverhatchExpoMuta20%
Overpool2HatchLurker10%
OverpoolHatch10%
OverpoolHydra120%
OverpoolSpeed40%
OverpoolSunk10%
Overpool_4HatchLing20%
PurpleSwarmBuild10%
Sparkle 1HatchMuta10%
Sparkle 2HatchMuta10%
ZvP_3BaseSpire+Den10%
ZvP_3HatchPoolHydra20%
ZvP_4HatchPoolHydra1421%
ZvT_12PoolMuta20%
ZvZ_12PoolLing10%
ZvZ_12PoolLingB10%
ZvZ_Overpool9Gas10%
45 openings1003%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush--44%0%0%0%
Safe expand5656%2%4444%5%43%5%
Turtle4444%5%4545%2%43%9%
Unknown--77%0%0%0%
timing#medianearlylate
gas steal attempt431:290:002:34
gas steal success23---
enemy scout1001:351:116:51
enemy combat units1005:234:107:58
enemy air units712:057:3921:34
enemy cloaked units811:244:3921:34


It looks like Locutus opened forge-expand every game. It worked. Steamhammer desperately tried everything, including ZvZ builds and island builds, and finally squeezed 3 wins with a risky extreme macro opening, 4 hatcheries before spawning pool, which was able to win one game in five. I should add 5 and 6 hatch before pool and see if they help.

Locutus rarely made corsairs or dark templar. I wonder what its criteria are? Maybe it won before it got that far. The scout was usually quite early, and the first combat unit was seen late, as expected for a cannon-first opener.

I played over the 3 wins. They were in rounds 65, 70, and 73; after that, I expect that Locutus found a way to win. In 2 games, Steamhammer pulled ahead in early economy with its greedy opening, then struggled to defend and fell into a losing position. But Locutus got most of its units stuck in its base, and Steamhammer was able to turn it around and win after a hard fight with critical defiler support. In the third win, Locutus chose a zealot-archon unit mix that Steamhammer knows how to cope with, and zerg powered through.


#2 purplewave

openinggameswins
10Pool9Gas10%
11HatchTurtleHydra5044%
11HatchTurtleLurker10%
11HatchTurtleMuta1520%
12Hatch_4HatchLing10%
2HatchLingAllInSpire10%
3HatchHydraExpo10%
3HatchLing10%
3HatchLingExpo10%
4HatchBeforeLair10%
5PoolSoft10%
7Pool12Hatch10%
9PoolBurrow10%
AntiZeal_12Hatch10%
HiveRush10%
Over10Hatch20%
Over10Hatch1Sunk30%
Over10Hatch2Sunk10%
OverhatchLateGas10%
Overpool+110%
OverpoolSpeed10%
OverpoolTurtle20%
ZvP_3HatchPoolHydra10%
ZvT_7Pool10%
ZvZ_Overpool9Gas933%
25 openings10028%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush--22%0%0%0%
Heavy rush9999%28%9090%24%90%4%
Safe expand--33%100%0%0%
Turtle--11%100%0%0%
Unknown11%0%44%50%0%0%
timing#medianearlylate
gas steal attempt411:131:092:36
gas steal success37---
enemy scout982:131:1915:06
enemy combat units992:352:155:59
enemy air units5113:575:1520:37
enemy cloaked units4814:016:0217:11


PurpleWave in contrast went with mostly 2 gate openings against Steamhammer; that’s what “heavy rush” means for protoss. Steamhammer countered with early sunkens plus hydras or, less successfully, mutalisks (this version had a bug that weakened mutalisk play). There are also 3 wins with a ZvZ fast mutalisk opening. 2 gates should beat that, so protoss either played poorly or chose a different build in those games.


#3 bananabrain

openinggameswins
10HatchHydra10%
11Gas10PoolLurker20%
11Gas10PoolMuta1010%
11HatchTurtleHydra10%
12Hatch_4HatchLing10%
2.5HatchMuta10%
2HatchLingAllInSpire10%
3HatchHydra20%
3HatchHydraBust10%
3HatchHydraExpo10%
3HatchLateHydras10%
3HatchLingExpo911%
5PoolHard10%
6Pool10%
6PoolSpeed10%
7-7HydraLingRush10%
8Gas7PoolLurker B10%
9HatchMain9Pool9Gas10%
9PoolBurrow10%
9PoolSpeed10%
9PoolSpire10%
AntiFact_2Hatch1540%
AntiFact_Overpool9Gas10%
AntiZeal_12Hatch100%
Over10Hatch1Sunk10%
Over10HatchBust2825%
OverpoolSpeed10%
OverpoolTurtle 010%
ZvP_Overpool3Hatch20%
ZvT_3HatchMuta10%
30 openings10015%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush7070%14%3232%3%33%39%
Naked expand22%0%11%100%0%50%
Proxy--44%0%0%0%
Safe expand2323%17%1616%31%17%35%
Turtle55%20%1010%20%0%20%
Unknown--3737%16%0%0%
timing#medianearlylate
gas steal attempt501:261:091:38
gas steal success31---
enemy scout1001:561:213:17
enemy combat units1002:562:198:19
enemy air units835:192:5111:41
enemy cloaked units616:263:2714:05


BananaBrain contrasts with both previous opponents in that it played a variety of builds. Steamhammer was unable to predict what was coming. It looks strange that the best reaction was an opening designed to counter terran factory-first builds that include a vulture runby, but in fact it is a mildly specialized 2 hatch mutalisk variant and not so surprising. BananaBrain made corsairs and dark templar in most games.


#4 daqin

openinggameswins
10HatchHydra10%
10Pool9Hatch10%
11Gas10PoolLurker119%
11Gas10PoolMuta10%
11HatchTurtleLurker10%
12Hatch12Pool10%
12HatchTurtle20%
12Hatch_4HatchLing20%
2HatchHydraBust10%
2HatchLurker10%
3HatchHydra10%
3HatchHydraBust10%
3HatchHydraExpo40%
3HatchLing10%
3HatchLingBust21020%
3HatchLingExpo10%
4HatchBeforeGas30%
4HatchBeforeLair30%
4PoolSoft10%
5HatchBeforeGas20%
5Scout10%
8-8HydraRush10%
8Hatch7Pool10%
8Hatch7PoolSpeed1916%
9GasLair10%
9HatchExpo9Pool9Gas20%
9PoolBurrow10%
9PoolSpeedAllIn10%
AntiFact_2Hatch10%
AntiFactory10%
OverhatchExpoLing30%
OverhatchExpoMuta10%
OverhatchLateGas10%
Overpool+110%
OverpoolSunk10%
ZvP_2HatchMuta10%
ZvP_3BaseSpire+Den110%
ZvZ_12Gas11Pool10%
ZvZ_12HatchMain10%
ZvZ_12Pool10%
40 openings1006%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush--44%0%0%0%
Proxy--66%0%0%0%
Safe expand1111%9%2323%13%18%0%
Turtle8989%6%6363%5%62%4%
Unknown--44%0%0%0%
timing#medianearlylate
gas steal attempt431:261:091:58
gas steal success24---
enemy scout991:341:149:35
enemy combat units1005:264:076:58
enemy air units319:478:5416:19
enemy cloaked units369:447:2314:39


DaQin played forge-expand and has similar timings to Locutus, for the same reasons. The fast scout is to allow adjustment of the cannon count and timing, and the late combat units are due to getting a gateway later. Steamhammer couldn’t find any better reaction than to try to bust with zerglings, either early or late, and it was not particularly successful.


#6 zzzkbot

openinggameswins
2.5HatchMuta10%
3HatchLingExpo10%
9HatchExpo9Pool9Gas367%
9PoolLurker933%
9PoolSpeedAllIn10%
9PoolSunkHatch1258%
9PoolSunkSpeed933%
OverpoolSunk1338%
ZvZ_Overgas9Pool1258%
ZvZ_Overpool9Gas3982%
10 openings10059%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Turtle100100%59%7979%71%79%21%
Unknown--2121%14%0%0%
timing#medianearlylate
gas steal attempt261:141:111:37
gas steal success12---
enemy scout992:550:377:23
enemy combat units1004:062:254:43
enemy air units665:295:0310:11
enemy cloaked units0---


ZZZKBot mostly played a turtle-into-mutalisks strategy against Steamhammer, and was somewhat successful. You can read the idea straight out of the tables above. The 2:25 earliest timing but 4:06 median timing for combat units says that ZZZKBot sometimes rushed zerglings, but usually not.


#7 microwave

openinggameswins
11Gas10PoolLurker2843%
11Gas10PoolMuta1520%
2HatchHydra10%
3HatchLing10%
3HatchLingBust210%
5PoolHard10%
6Pool10%
7-7HydraLingRush10%
9GasLair10%
9HatchMain9Pool9Gas10%
9PoolLurker10%
OverhatchLing10%
OverhatchMuta2030%
OverpoolLurker10%
PurpleSwarmBuild10%
Sparkle 1HatchMuta812%
ZvZ_12HatchExpo10%
ZvZ_12HatchMain20%
ZvZ_Overpool11Gas10%
ZvZ_Overpool9Gas10%
ZvZ_OverpoolTurtle1225%
21 openings10025%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush77%29%22%50%0%86%
Naked expand8989%26%2323%17%25%73%
Turtle44%0%11%0%0%75%
Unknown--7474%27%0%0%
timing#medianearlylate
gas steal attempt541:300:421:57
gas steal success1---
enemy scout1002:391:373:47
enemy combat units1002:272:143:58
enemy air units396:255:219:19
enemy cloaked units0---


Microwave played a 9 pool speed build into expansion and then spire, which you cannot read out of the plan table because Steamhammer didn’t recognize it accurately. But in the timing table you can see that combat units (zerglings) were early and air units (mutalisks) were not late.

Steamhammer was not able to steal Microwave’s gas. It probably should have stopped trying.


#8 iron

openinggameswins
2.5HatchMuta10%
5HatchBeforeGas10%
5Scout10%
7-7HydraLingRush4384%
8Gas7PoolLurker B10%
AntiFact_13Pool1155%
AntiFactory3964%
OverhatchExpoMuta10%
OverhatchMuta10%
Sparkle 2HatchMuta10%
10 openings10067%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory100100%67%9191%70%91%9%
Unknown--99%33%0%0%
timing#medianearlylate
gas steal attempt301:261:252:03
gas steal success0---
enemy scout873:270:3415:09
enemy combat units1002:592:295:27
enemy air units2313:5310:1120:07
enemy cloaked units696:395:3511:47


Look at that huge range of scout timings! 0:34 means that the scout SCV was sent immediately at the start of the game and went directly to the zerg base. 15:09 probably means that no enemy unit got into the base until the end of the game when Steamhammer lost (Steamhammer is on BWAPI 4.1.2 and cannot detect scans). Steamhammer prevented the scout entirely in 13 out of the 100 games by its own count; 15:09 is probably the same. Steamhammer was not able to steal Iron’s gas, and did eventually give up trying.


#9 xiaoyi

openinggameswins
12Hatch13Pool10%
2HatchLingAllInSpire1619%
2HatchLurkerAllIn10%
3HatchLurker10%
3HatchPoolMuta10%
5PoolSoft10%
7-7HydraLingRush3669%
7PoolMid2475%
AntiFact_13Pool933%
AntiFactory10%
AntiFactoryHydra812%
Over10Hatch10%
12 openings10050%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory9898%51%7474%41%74%21%
Naked expand--11%100%0%0%
Safe expand--33%33%0%0%
Unknown22%0%2222%82%0%50%
timing#medianearlylate
gas steal attempt461:261:052:08
gas steal success1---
enemy scout922:371:347:29
enemy combat units1002:392:253:22
enemy air units5512:238:5516:30
enemy cloaked units617:395:4217:07


Steamhammer liked 7 pool against XiaoYi, just as Microwave did, but also liked its dawn hydra rush.


#10 mcrave

openinggameswins
2HatchHydraBust580%
3HatchHydraBust667%
9PoolHatch1984%
Over10Hatch2Sunk3288%
Over10Hatch2SunkHard2692%
OverpoolTurtle1283%
6 openings10086%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush9797%87%6464%80%63%19%
Safe expand22%100%1111%100%0%0%
Turtle11%0%77%100%0%0%
Unknown--1818%94%0%0%
timing#medianearlylate
gas steal attempt531:281:111:33
gas steal success33---
enemy scout922:211:149:55
enemy combat units982:422:158:51
enemy air units6910:025:0614:18
enemy cloaked units3010:295:0116:39

#11 ualbertabot

openinggameswins
5Scout2875%
Over10Hatch2Sunk10%
OverpoolTurtle7197%
3 openings10090%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory55%100%88%100%0%0%
Fast rush44%100%1111%100%0%25%
Heavy rush8686%88%4747%87%48%24%
Naked expand55%100%1010%100%0%40%
Unknown--2424%83%0%0%
timing#medianearlylate
gas steal attempt431:120:001:16
gas steal success23---
enemy scout792:111:194:23
enemy combat units612:431:464:33
enemy air units1014:2012:0216:57
enemy cloaked units1214:252:3816:57


Thanks to pre-learning, I expected Steamhammer to play its overpool turtle build every game. I’m not sure why it didn’t. I also don’t know how it hit on the 5 scout build, which means send out a drone at 5 supply to scout very early, then leave all decisions to the strategy boss. It’s a logical try against a random opponent, especially one that has a single strategy for each race, and it was fairly successful. But it did not appear in the pre-learned data.


#12 aitp

openinggameswins
7-7HydraLingRush1292%
9HatchExpo9Pool9Gas30100%
AntiFact_13Pool22100%
AntiFactory2195%
AntiFactoryHydra1493%
ZvT_3HatchMuta10%
6 openings10096%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory8787%97%3030%97%28%62%
Fast rush44%100%44%100%0%50%
Heavy rush44%100%22%100%25%50%
Turtle44%100%55%60%0%25%
Unknown11%0%5959%98%0%0%
timing#medianearlylate
gas steal attempt441:251:121:58
gas steal success3---
enemy scout253:312:4119:11
enemy combat units1003:231:578:09
enemy air units3111:277:4619:34
enemy cloaked units597:385:1916:34


AITP scored zip against both mass zerglings (9HatchExpo9Pool9Gas) and against fast mutalisks (AntiFact_13Pool). And it successfully scouted Steamhammer’s base only 25% of the time. If you don’t scout reliably, it will be hard to withstand rushes.


#13 bunkerboxer

openinggameswins
9PoolExpo42100%
9PoolSunkHatch31100%
9PoolSunkSpeed27100%
3 openings100100%
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Proxy6666%100%3535%100%36%36%
Unknown--4242%100%0%0%
Worker rush3434%100%2323%100%15%53%
timing#medianearlylate
gas steal attempt401:351:321:37
gas steal success33---
enemy scout912:101:473:47
enemy combat units842:432:093:27
enemy air units0---
enemy cloaked units0---


Steamhammer was not able to judge whether BunkerBoxeR was playing a proxy (with its proxy bunker) or a worker rush (since it sent SCVs in support). But it didn’t matter. The reactions are nearly the same. Since BunkerBoxeR never wants gas, stealing its gas was a waste.


overall

totalZvTZvPZvZZvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
10HatchHydra20% 20%
10Pool9Gas10% 10%
10Pool9Hatch10% 10%
11Gas10PoolLurker4132% 138% 2843%
11Gas10PoolMuta2715% 128% 1520%
11HatchTurtleHydra5143% 5143%
11HatchTurtleLurker20% 20%
11HatchTurtleMuta1520% 1520%
12Hatch12Pool20% 20%
12Hatch13Pool10% 10%
12HatchTurtle20% 20%
12Hatch_4HatchLing40% 40%
2.5HatchMuta50% 10% 30% 10%
2HatchHydra20% 10% 10%
2HatchHydraBust1040% 1040%
2HatchLingAllInSpire1916% 1619% 30%
2HatchLurker10% 10%
2HatchLurkerAllIn10% 10%
3HatchHydra30% 30%
3HatchHydraBust1331% 1331%
3HatchHydraExpo70% 70%
3HatchLateHydras10% 10%
3HatchLateHydras+150% 50%
3HatchLing30% 20% 10%
3HatchLingBust21414% 1315% 10%
3HatchLingExpo128% 119% 10%
3HatchLurker10% 10%
3HatchPoolMuta10% 10%
4HatchBeforeGas40% 40%
4HatchBeforeLair90% 90%
4PoolSoft10% 10%
5HatchBeforeGas50% 10% 40%
5PoolHard20% 10% 10%
5PoolHard2Player20% 20%
5PoolSoft20% 10% 10%
5Scout3168% 10% 20% 2875%
6Pool20% 10% 10%
6PoolSpeed10% 10%
7-7HydraLingRush9377% 9179% 10% 10%
7Pool12Hatch10% 10%
7PoolMid2475% 2475%
7PoolSoft10% 10%
8-8HydraRush20% 20%
8Gas7PoolLurker B20% 10% 10%
8Hatch7Pool20% 20%
8Hatch7PoolSpeed1916% 1916%
8Pool10% 10%
9GasLair20% 10% 10%
9HatchExpo9Pool9Gas3591% 30100% 20% 367%
9HatchMain9Pool9Gas20% 10% 10%
9Pool20% 20%
9PoolBurrow30% 30%
9PoolExpo42100% 42100%
9PoolHatch2176% 2176%
9PoolLurker1030% 1030%
9PoolSpeed10% 10%
9PoolSpeedAllIn30% 20% 10%
9PoolSpire10% 10%
9PoolSunkHatch4388% 31100% 1258%
9PoolSunkSpeed3683% 27100% 933%
AntiFact_13Pool4274% 4274%
AntiFact_2Hatch1638% 1638%
AntiFact_Overpool9Gas20% 20%
AntiFactory6273% 6174% 10%
AntiFactoryHydra2264% 2264%
AntiZeal_12Hatch110% 110%
DefilerRush20% 20%
HiveRush10% 10%
Over10Hatch30% 10% 20%
Over10Hatch1Sunk40% 40%
Over10Hatch2Sunk3580% 3482% 10%
Over10Hatch2SunkHard2692% 2692%
Over10HatchBust2825% 2825%
Over10HatchSlowLings10% 10%
Over10PoolMuta10% 10%
OverhatchExpoLing50% 50%
OverhatchExpoMuta40% 10% 30%
OverhatchLateGas20% 20%
OverhatchLing10% 10%
OverhatchMuta2129% 10% 2030%
Overpool+120% 20%
Overpool2HatchLurker10% 10%
OverpoolHatch10% 10%
OverpoolHydra120% 120%
OverpoolLurker10% 10%
OverpoolSpeed60% 60%
OverpoolSunk1533% 20% 1338%
OverpoolTurtle8593% 1471% 7197%
OverpoolTurtle 010% 10%
Overpool_4HatchLing20% 20%
PurpleSwarmBuild20% 10% 10%
Sparkle 1HatchMuta911% 10% 812%
Sparkle 2HatchMuta20% 10% 10%
ZvP_2HatchMuta10% 10%
ZvP_3BaseSpire+Den120% 120%
ZvP_3HatchPoolHydra30% 30%
ZvP_4HatchPoolHydra1421% 1421%
ZvP_Overpool3Hatch20% 20%
ZvT_12PoolMuta20% 20%
ZvT_3HatchMuta20% 10% 10%
ZvT_7Pool10% 10%
ZvZ_12Gas11Pool10% 10%
ZvZ_12HatchExpo10% 10%
ZvZ_12HatchMain30% 10% 20%
ZvZ_12Pool10% 10%
ZvZ_12PoolLing10% 10%
ZvZ_12PoolLingB10% 10%
ZvZ_Overgas9Pool1258% 1258%
ZvZ_Overpool11Gas10% 10%
ZvZ_Overpool9Gas5070% 1030% 4080%
ZvZ_OverpoolTurtle1225% 1225%
total120052%40078%50028%20042%10090%
openings played1112493293


Steamhammer knows 142 different openings. In the whole tournament, it was only able to try 111 of them! It tried the most openings versus protoss, since it was looking everywhere for an escape from the overwhelming top protoss bots. Most openings were tried only a few times and lost every game, which means that Steamhammer would have performed better without them. That’s expected and even intentional; my plan is to add smarts until it is able to make good guesses about what to try. The work is underway.

AIIDE 2019 - what Microwave learned

Microwave keeps its result files in the same format as UAlbertaBot: A file for each opponent, and in the file a list of strategies tried, each with win and loss counts. But Microwave independently restricts the win count and the loss count to not exceed 10. This amounts to intentionally forgetting older history when there has been a lot of it. The advantage is that Microwave adapts its strategies more quickly if the opponent shifts its play. The disadvantage, of course, is that information is thrown away. As a side effect, the numbers in the “total” and “overall” cells of my tables are not too informative.

This post looks at Microwave’s result_*.txt files for each opponent, since it’s what I’ve done before and I already had a script to parse them. This year Microwave also kept history_*.txt files with a record of each game. I could get a fuller picture of what Microwave did from the history files. I’m not sure whether Microwave uses the history files to make decisions. Still, if this is about “what Microwave learned,” then the result files are what Microwave learned, at least in large part.

Microwave has pre-learned data files for a number of opponents. Data from those files survived to be included in these tables. In other words, the tables here include not only tournament games, but in some cases preparation games played before the tournament.

Microwave’s author MicroDK commented that Microwave might have a bug in keeping its learning files, since the numbers did not always agree with official tournament results. As explained yesterday for UAlbertaBot, the player cannot always know what the tournament manager decides is the outcome of the game. Between that and the pre-learned data, I see reason to doubt that Microwave had a bug. But I didn’t look into details.

This year Microwave recorded a total of 32 strategies, compared to 19 last year. I tried to keep the tables tractable by breaking them down by opponent race, since not all strategies were tried against all races. Nevertheless, prepare to scroll right!

terran

It seems that most of Microwave’s openings worked about equally poorly against Iron, which is interesting and hard for me to explain. 2 hatch muta equals 3 hatch hydra bust equals 7 pool—among others? XiaoYi was vulnerable to rushes, and Microwave settled on 7 pool. After seeing the learning files of only 2 bots, I’m already getting a picture of XiaoYi as strong but apparently not robust against tricky strategies; UAlbertaBot chose DT rush against it. AITP and BunkerBoxeR were easy opponents and seem to have been vulnerable to the first thing Microwave tried, so that zerg never felt the need to vary.

The tournament had 100 rounds. Totals of more than 100 games versus an opponent, as versus Iron here, are a sign that pre-learned data was carried over. Microwave did not have time during the competition to try this many strategies so many times each.

#bottotal10Hatch9Pool9gas2HatchHydra2HatchLurker2HatchLurkerAllIn2HatchMuta3HatchHydraBust3HatchHydraExpo3HatchLingBust3HatchPoolHydra4HatchBeforeGas4PoolHard4PoolSoft5Pool5PoolSpeed6Pool6PoolSpeed7Pool8Pool9Pool9PoolLurker9PoolSpeed9PoolSpeedLingOverpoolTurtleZvZ_Overpool11Gas
8iron63-175  26%1-5 17%1-5 17%1-5 17%2-7 22%5-10 33%5-10 33%1-5 17%0-5 0%1-5 17%2-7 22%5-10 33%5-10 33%1-5 17%5-10 33%1-5 17%3-8 27%5-10 33%5-10 33%3-8 27%4-10 29%2-7 22%2-7 22%3-8 27%0-3 0%
9xiaoyi22-13  63%0-2 0%-0-1 0%-0-2 0%------10-4 71%1-1 50%---10-0 100%-1-1 50%--0-2 0%--
12aitp10-0  100%---------------------10-0 100%--
13bunkerboxer10-0  100%------------10-0 100%-----------
overall-  36%1-7 12%1-5 17%1-6 14%2-7 22%5-12 29%5-10 33%1-5 17%0-5 0%1-5 17%2-7 22%5-10 33%15-14 52%12-6 67%5-10 33%1-5 17%3-8 27%15-10 60%5-10 33%4-9 31%4-10 29%2-7 22%12-9 57%3-8 27%0-3 0%

protoss

Aha, Bananabrain had a weakness against Microwave’s 3 hatch zergling bust! I’ve seen the same on BASIL, e.g. Microwave-BananaBrain on Empire of the Sun, where BananaBrain was negligent in setting up the defense of its natural. In general, Bananabrain showed sensitivity to the opponent’s strategy; the other top protoss bots were more consistent.

#bottotal10Hatch9Pool9gas2HatchHydra2HatchLurker2HatchLurkerAllIn2HatchMuta3HatchHydraBust3HatchHydraExpo3HatchLingBust3HatchPoolHydra4HatchBeforeGas4PoolHard4PoolSoft5Pool5PoolSpeed6Pool6PoolSpeed7Pool8Pool9Pool9PoolLurker9PoolSpeed9PoolSpeedLingZvP_10Hatch9PoolZvZ_Overgas11PoolZvZ_Overgas9PoolZvZ_Overpool11Gas
1locutus0-202  0%0-10 0%0-10 0%0-10 0%0-8 0%0-10 0%0-10 0%-0-8 0%0-8 0%0-8 0%0-10 0%0-10 0%0-10 0%0-8 0%0-8 0%0-8 0%0-10 0%0-8 0%0-10 0%0-7 0%0-10 0%0-7 0%0-7 0%--0-7 0%
2purplewave26-154  14%2-10 17%2-9 18%0-6 0%0-5 0%2-10 17%2-10 17%0-4 0%3-10 23%0-4 0%0-4 0%0-3 0%3-10 23%3-10 23%0-3 0%0-3 0%0-3 0%3-10 23%2-9 18%0-3 0%0-5 0%1-7 12%3-10 23%0-3 0%--0-3 0%
3bananabrain85-130  40%1-3 25%2-4 33%2-5 29%1-5 17%2-4 33%0-2 0%1-4 20%10-4 71%1-4 20%0-5 0%6-7 46%10-9 53%10-9 53%5-7 42%3-5 38%4-6 40%1-3 25%4-6 40%4-6 40%0-5 0%2-4 33%4-6 40%0-2 0%-7-8 47%5-7 42%
4daqin8-64  11%2-9 18%0-4 0%0-4 0%-3-10 23%0-3 0%-3-10 23%0-3 0%--0-3 0%0-3 0%---0-3 0%-0-3 0%-0-3 0%0-3 0%0-3 0%---
10mcrave95-78  55%2-2 50%2-3 40%5-3 62%2-3 40%10-4 71%10-0 100%0-4 0%2-3 40%1-2 33%1-4 20%3-2 60%10-4 71%1-4 20%2-3 40%5-4 56%10-5 67%4-5 44%2-3 40%7-4 64%0-3 0%3-3 50%3-2 60%2-2 50%8-4 67%-0-2 0%
overall-  25%7-34 17%6-30 17%7-28 20%3-21 12%17-38 31%12-25 32%1-12 8%18-35 34%2-21 9%1-21 5%9-22 29%23-36 39%14-36 28%7-21 25%8-20 29%14-22 39%8-31 21%8-26 24%11-26 30%0-20 0%6-27 18%10-28 26%2-17 11%8-4 67%7-8 47%5-19 21%

zerg

Steamhammer and ZZZKBot are opposite opponents, from Microwave’s point of view. Whatever worked against one did not work against the other. Most of the numbers in Steamhammer’s row, by the way, are from preparation games. I see the same numbers in the pre-learned data file. According to the history file, Microwave played its 9 pool speed opening in every game.

#bottotal12Pool4PoolHard4PoolSoft5Pool5PoolSpeed6Pool6PoolSpeed7Pool8Pool9HatchMain8Pool8Gas9PoolHatch9PoolSpeed9PoolSunkenOverpoolSpeedOverpoolTurtleZvZ_Overgas11PoolZvZ_Overpool11Gas
5steamhammer26-16  62%2-2 50%--1-2 33%-----2-2 50%1-2 33%10-0 100%1-2 33%4-3 57%--5-3 62%
6zzzkbot67-70  49%0-2 0%1-5 17%0-2 0%10-7 59%0-2 0%0-2 0%5-10 33%1-5 17%7-10 41%10-7 59%10-4 71%0-2 0%0-2 0%3-4 43%10-4 71%10-0 100%0-2 0%
overall-  52%2-4 33%1-5 17%0-2 0%11-9 55%0-2 0%0-2 0%5-10 33%1-5 17%7-10 41%12-9 57%11-6 65%10-2 83%1-4 20%7-7 50%10-4 71%10-0 100%5-5 50%

random

UAlbertaBot was the only random participant. It’s striking how similar openings can have different outcomes, though the numbers are noisy because the game counts intentionally limited and an opening that makes a bad first impression may not be repeated.

#bottotal4PoolHard4PoolSoft5Pool5PoolSpeed6Pool6PoolSpeed7Pool8Pool9PoolSpeedLing
11ualbertabot34-21  62%5-4 56%10-0 100%4-4 50%10-3 77%4-3 57%1-2 33%0-2 0%0-2 0%0-1 0%
overall-  62%5-4 56%10-0 100%4-4 50%10-3 77%4-3 57%1-2 33%0-2 0%0-2 0%0-1 0%

AIIDE 2019 - what UAlbertaBot learned

#11 UAlbertaBot was one of the weaker participants, but no player shut it out. Even against #1 Locutus, UAlbertaBot scored 1 win and learned a little bit about its opponent. That also tells us something about each opponent.

The “total” column gives UAlbertaBot’s view of how many games it won and lost, which does not always line up with the tournament results. The results give UAlbertaBot 6 crashes, when it presumably could not record any information. Also if one side overstepped the frame time limit (UAlbertaBot never did), or if the game timed out and was decided on points (12 instances for UAlbertaBot), the player has no way to know what the tournament manager decided, and the two may disagree about who won. Something like that must explain why UAlbertaBot recorded 3 wins for itself against #2 PurpleWave when officially it won only 2 games. These issues cause difficulties for learning, but as long as most games finish normally it shouldn’t be serious.

#bottotalTerranTerranTerranTerranProtossProtossProtossZergZergZergZerg
4RaxMarinesMarineRushTankPushVultureRushDTRushDragoonRushZealotRush2HatchHydra3HatchMuta3HatchScourgeZerglingRush
1locutus1-99  1%0-9 0%0-8 0%0-8 0%0-8 0%0-11 0%1-15 6%0-10 0%0-8 0%0-8 0%0-7 0%0-7 0%
2purplewave3-93  3%0-8 0%0-8 0%0-8 0%0-8 0%3-18 14%0-8 0%0-7 0%0-7 0%0-7 0%0-7 0%0-7 0%
3bananabrain16-82  16%0-7 0%1-10 9%0-6 0%0-6 0%0-4 0%0-4 0%9-20 31%0-4 0%0-4 0%0-4 0%6-13 32%
4daqin21-77  21%0-10 0%0-9 0%0-9 0%0-9 0%0-3 0%3-8 27%5-8 38%0-2 0%0-2 0%0-2 0%13-15 46%
5steamhammer9-89  9%0-4 0%8-9 47%0-4 0%0-4 0%0-6 0%1-9 10%0-5 0%0-12 0%0-12 0%0-12 0%0-12 0%
6zzzkbot10-89  10%0-8 0%0-8 0%0-8 0%0-7 0%0-4 0%0-4 0%8-16 33%0-7 0%0-7 0%0-7 0%2-13 13%
7microwave18-81  18%0-7 0%2-12 14%0-7 0%0-7 0%0-3 0%0-3 0%13-11 54%1-9 10%0-5 0%1-9 10%1-8 11%
8iron9-90  9%1-9 10%1-8 11%0-5 0%0-5 0%0-8 0%0-8 0%3-18 14%0-6 0%0-6 0%0-6 0%4-11 27%
9xiaoyi26-68  28%0-4 0%0-5 0%4-13 24%0-4 0%21-5 81%0-2 0%0-5 0%0-7 0%0-7 0%0-6 0%1-10 9%
10mcrave56-44  56%-22-9 71%--0-4 0%10-19 34%0-5 0%---24-7 77%
12aitp71-23  76%-19-8 70%----24-5 83%19-2 90%7-2 78%1-2 33%1-4 20%
13bunkerboxer88-12  88%-34-4 89%----30-0 100%---24-8 75%
overall-  28%1-66 1%87-98 47%4-68 6%0-58 0%24-66 27%15-80 16%92-110 46%20-64 24%7-60 10%2-62 3%76-115 40%

UAlbertaBot was random. Its learning plan is to first play its best opening for each race (terran marine rush, protoss zealot rush, zerg zergling rush), and switch away only if it lost too often. If you are always losing, there is no harm in experimentation. Against strong opponents it tried everything, to little avail. Against weak opponents, the best opening might be reliable, so it did not try others.

UAlbertaBot’s configuration file has enemy-specific strategies defined for many historical opponents. In this tournament, 2 of them reappeared: Iron and ZZZKBot, and the declaration for ZZZKBot says “make the default choices.” I don’t see evidence in the table that UAlbertaBot paid attention to its Iron-specific strategies, so I watched replays to find out. It turned out as I expected, an enemy-specific strategy became the default strategy, the expected best opening, and if it failed severely enough (as it always did against Iron) then UAlbertaBot would try its other strategies.

The “overall” row across the bottom tells us that its best openings truly were the best. In most cases, it did no good to try alternatives. The notable exceptions are that the dark templar rush won against XiaoYi, while the 2 hatch hydra rush won against AITP (this suggests that AITP consistently followed a mech strategy). Of course, UAlbertaBot played random, which can confuse opponents that learn. It’s possible that a protoss bot that always rushed dark templar might do less well against XiaoYi, and so on.

Some openings were useless in the tournament, and UAlbertaBot would have done better without them. For example, the 3 hatchery scourge opening is designed to combat XIMP by Tomas Vajda, and scored miserably. The terran vulture rush made 58 losses and no wins at all, a weight pulling down the ranking.

There is more to learn from the table. Steamhammer had some trouble against the terran marine rush, but shut out the zealots and the zerglings. The other 2 zergs had more trouble against the hard zealot rush (which was historically difficult for zerg bots to cope with, at least zerg bots other than KillerBot by Marian Devecka). I think the difference ultimately reflects the skills of the different bots. Steamhammer has micro and defensive weaknesses against ranged units in general (the one loss against protoss was to the dragoon rush). Its opening learning is ingenious enough to cover the weakness, but only at the expense of losses against protoss and zerg. So instead Steamhammer’s learning converged on the idea of allowing the marines to win sometimes, and strictly controlling the other races. It’s counterintuitive but effective.

CIG 2018 - what Locutus learned

Locutus only recorded 8 games. It is configured to retain 200 game records, and I read the source code and verified that Locutus does not intentionally drop game records before the limit of 200. Recording exactly 8 games is the same problem that McRave suffered, and must be due to CIG problems. I don't know what the underlying problem was. My suspicion is that CIG organizers or tournament software may have accidentally or mistakenly cleared learning data for some bots. If that is what happened, and it happened once 8 games before the end of the tournament, it seems likely that it happened more than once. Who knows, though? The error might be somewhere else. Maybe they mistakenly shipped us data from after round 8 instead of round 125—in that case the tournament may have run normally, and only the data about it is wrong.

Locutus has prepared data for some opponents, stored in the AI directory. When Locutus finds it has no game records for a given opponent, it looks in AI to see if it has prepared data, and if so, it reads in those game records. At the end of the game, it writes out the prepared game records along with the record for the newly played game, and from then on the prepared records are treated like any others and retained unless and until the 200 record limit is passed.

How many other bots were affected by the 8 game problem?


Here is Locutus’s prepared data. Against some opponents, like McRave, Locutus picks out openings to avoid at first. If other openings don’t win either, I’m sure Locutus will come back and try these anyway. Against others, it picks out winners to try first. For some, it simply provides data. Most but not all of the prepared data is for opponents which were carried over from last year, for which pre-learning is sure to be helpful... if it is done on the same maps.

#3 mcrave

openinggameswins
12Nexus5ZealotFECannons10%
Turtle10%
2 openings20%

#6 iron

openinggameswins
DTDrop14100%
1 openings14100%

#7 zzzkbot

openinggameswins
ForgeExpand5GateGoon2100%
1 openings2100%

#11 ualbertabot

openinggameswins
4GateGoon10%
9-9GateDefensive250%
ForgeExpand5GateGoon1593%
3 openings1883%

#14 aiur

openinggameswins
4GateGoon3100%
9-9GateDefensive1100%
2 openings4100%

#16 ziabot

openinggameswins
9-9GateDefensive10%
ForgeExpand5GateGoon1100%
2 openings250%

#19 terranuab

openinggameswins
DTDrop10100%
1 openings10100%

#21 opprimobot

openinggameswins
DTDrop11100%
1 openings11100%

#22 sling

openinggameswins
ForgeExpand5GateGoon2100%
1 openings2100%

#23 srbotone

openinggameswins
DTDrop7100%
PlasmaProxy2Gate1100%
2 openings8100%

#24 bonjwa

openinggameswins
DTDrop6100%
PlasmaProxy2Gate1100%
2 openings7100%

overall

totalPvTPvPPvZPvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
12Nexus5ZealotFECannons10% 10%
4GateGoon475% 3100% 10%
9-9GateDefensive450% 1100% 10% 250%
DTDrop48100% 48100%
ForgeExpand5GateGoon2095% 5100% 1593%
PlasmaProxy2Gate2100% 2100%
Turtle10% 10%
total8092%50100%667%683%1883%
openings played72423

Here is Locutus’s learned data. In every case, the number of games recorded is 8 plus the number of games in the prepared data. With only 8 games there is not much to go on, but the prepared data does seem to have helped Locutus choose successful openings.

#2 purplewave

openinggameswins
12Nexus5ZealotFECannons10%
4GateGoon10%
9-9GateDefensive580%
Proxy9-9Gate10%
4 openings850%

#3 mcrave

openinggameswins
12Nexus5ZealotFECannons10%
4GateGoon367%
Proxy9-9Gate5100%
Turtle10%
4 openings1070%

#4 tscmoo

openinggameswins
4GateGoon10%
9-9GateDefensive10%
ForgeExpand5GateGoon425%
Proxy9-9Gate250%
4 openings825%

#5 isamind

openinggameswins
4GateGoon683%
9-9GateDefensive1100%
Proxy9-9Gate1100%
3 openings888%

#6 iron

openinggameswins
DTDrop2295%
1 openings2295%

#7 zzzkbot

openinggameswins
ForgeExpand5GateGoon786%
ForgeExpandSpeedlots250%
Proxy9-9Gate10%
3 openings1070%

#8 microwave

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#9 letabot

openinggameswins
DTDrop888%
1 openings888%

#10 megabot

openinggameswins
4GateGoon8100%
1 openings8100%

#11 ualbertabot

openinggameswins
4GateGoon10%
9-9GateDefensive250%
ForgeExpand5GateGoon2391%
3 openings2685%

#12 tyr

openinggameswins
4GateGoon8100%
1 openings8100%

#13 ecgberht

openinggameswins
DTDrop888%
1 openings888%

#14 aiur

openinggameswins
12Nexus5ZealotFECannons10%
2GateDTExpo1100%
4GateGoon580%
9-9GateDefensive1100%
Proxy9-9Gate475%
5 openings1275%

#15 titaniron

openinggameswins
DTDrop8100%
1 openings8100%

#16 ziabot

openinggameswins
9-9GateDefensive10%
ForgeExpand5GateGoon683%
ForgeExpandSpeedlots250%
Proxy9-9Gate1100%
4 openings1070%

#17 steamhammer

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#18 overkill

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#19 terranuab

openinggameswins
DTDrop18100%
1 openings18100%

#20 cunybot

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#21 opprimobot

openinggameswins
DTDrop19100%
1 openings19100%

#22 sling

openinggameswins
ForgeExpand5GateGoon10100%
1 openings10100%

#23 srbotone

openinggameswins
DTDrop15100%
PlasmaProxy2Gate1100%
2 openings16100%

#24 bonjwa

openinggameswins
DTDrop14100%
PlasmaProxy2Gate1100%
2 openings15100%

#25 stormbreaker

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#26 korean

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

#27 salsa

openinggameswins
ForgeExpand5GateGoon8100%
1 openings8100%

overall

totalPvTPvPPvZPvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
12Nexus5ZealotFECannons30% 30%
2GateDTExpo1100% 1100%
4GateGoon3382% 3187% 20%
9-9GateDefensive1164% 786% 10% 333%
DTDrop11297% 11297%
ForgeExpand5GateGoon10693% 7997% 2781%
ForgeExpandSpeedlots450% 450%
PlasmaProxy2Gate2100% 2100%
Proxy9-9Gate1573% 1182% 250% 250%
Turtle10% 10%
total28890%11497%5480%8693%3471%
openings played102644

CIG 2018 - what Steamhammer learned

I wrote a new script to analyze Steamhammer’s learning data. A couple points: 1. Steamhammer crashed in nearly half of its games in CIG 2018. It can’t save learning data after a crash, so against some opponents Steamhammer had few opportunities to experiment. The number of crashes varied strongly depending on the opponent. 2. Steamhammer was set to remember the previous 100 games, since I figure there’s no play advantage to remembering more. The tournament was 125 rounds long. So in the tables below, “100 games” means that Steamhammer played at least 100 games without crashing, and up to 25 games may have been dropped, the early games. Against some weak opponents, Steamhammer learned, within 25 games, how to win 100% of the remaining games, and those tables give a 100% win rate for remembered games. Steamhammer did not score 100% against any opponent overall; it always had some losses in early games.

I should be able to run the same analysis for Steamhammer forks which retain Steamhammer’s opponent model file format.

#1 Locutus

openinggameswins
2HatchHydraBust10%
3HatchHydraExpo20%
3HatchLingBust10%
3HatchLingExpo10%
4HatchBeforeGas10%
OverpoolSpeed956%
6 openings1533%

A mystery is solved. Why was Steamhammer’s crash rate higher than I expected? Because many opponents learned to make Steamhammer crash. A crash for the opponent is a win, and the bot doesn’t care how it wins, so if it can learn a plan that makes the opponent crash reliably, it will. The stronger opponents tend to be learning bots, so Steamhammer crashed more often on average against strong opponents. This also means that my glib conclusion that Steamhammer won 66% of non-crash games, so it seems to have kept up with general progress is not sound. The non-crash games were mostly against weak opponents.

Locutus was lucky that it could figure out how to break Steamhammer. As Bruce mentioned in a comment, this Locutus version had a bug when facing certain zergling timings, and Steamhammer quickly figured out how to exploit the bug. It’s possible that Steamhammer minus the crash would have upset Locutus.

#2 PurpleWave

openinggameswins
11Gas10PoolMuta10%
3HatchHydra30%
3HatchLurker10%
4PoolSoft10%
7Pool12Hatch10%
7PoolSoft10%
9Hatch8Pool10%
9HatchExpo9Pool9Gas10%
9PoolSpeed10%
AntiFactory10%
Over10Hatch60%
Over10Hatch1Sunk70%
Over10Hatch2Sunk180%
Over10HatchBust10%
Over10HatchSlowLings40%
OverhatchMuta10%
OverpoolHatch10%
OverpoolTurtle30%
ZvP_3HatchPoolHydra20%
ZvP_4HatchPoolHydra10%
ZvT_12PoolMuta10%
ZvZ_Overpool11Gas10%
22 openings580%

PurpleWave shut out Steamhammer. It didn’t learn to make Steamhammer crash because every game was a win for it anyway. Steamhammer desperately tried alternatives all over the map, including crazy all-ins and openings intended for ZvT and ZvZ, and nothing worked.

#3 McRave

openinggameswins
11Gas10PoolLurker10%
4HatchBeforeGas10%
9HatchExpo9Pool9Gas10%
9PoolSpeed5100%
ZvP_3HatchPoolHydra20%
5 openings1050%

#4 tscmoo

openinggameswins
9PoolExpo10%
9PoolHatch10%
9PoolSunkHatch10%
AntiFact_2Hatch10%
Over10Hatch2Sunk10%
OverhatchExpoLing1315%
OverpoolSpeed2223%
7 openings4018%

#5 ISAMind

openinggameswins
3HatchHydraExpo10%
4HatchBeforeGas10%
OverpoolSpeed4100%
ZvP_2HatchMuta70%
ZvP_3HatchPoolHydra60%
5 openings1921%

#6 Iron

openinggameswins
2HatchHydra10%
3HatchLingExpo20%
4PoolHard10%
6PoolSpeed10%
9Hatch8Pool10%
9HatchMain9Pool9Gas10%
9PoolSunkSpeed10%
AntiFact_13Pool40%
AntiFact_2Hatch8312%
AntiFactory10%
Over10Hatch10%
PurpleSwarmBuild10%
ZvP_2HatchMuta10%
ZvT_12PoolMuta10%
14 openings10010%

Iron is not a learning bot, so it did not learn to crash Steamhammer. Still, these results show a weakness in Steamhammer: Its best opening against Iron is AntiFactory, which it tried only once in these 100 games. Steamhammer did not explore enough. I tried to fix the weakness in Steamhammer 2.0.

#7 ZZZKBot

openinggameswins
11Gas10PoolMuta10%
8Pool729%
9HatchMain9Pool9Gas10%
9PoolSpeed10%
OverhatchMuta10%
Overpool+110%
OverpoolSpeed10%
ZvZ_12HatchMain20%
ZvZ_12Pool10%
ZvZ_12PoolLing4858%
ZvZ_Overgas9Pool20%
ZvZ_Overpool9Gas20%
12 openings6844%

#8 Microwave

openinggameswins
9PoolSunkHatch580%
9PoolSunkSpeed2767%
OverpoolSunk10%
OverpoolTurtle333%
ZvZ_12PoolLing10%
5 openings3762%

This looks like successful learning. Too bad Steamhammer only successfully played 37 of the 125 games.

#9 LetaBot

openinggameswins
11Gas10PoolLurker10%
2HatchLurkerAllIn40%
3HatchHydraExpo10%
3HatchLurker1338%
9HatchExpo9Pool9Gas4536%
OverpoolLurker1331%
ZvP_2HatchMuta10%
ZvT_12PoolMuta10%
ZvT_13Pool10%
ZvT_3HatchMuta10%
10 openings8131%

#10 MegaBot

openinggameswins
11Gas10PoolLurker10%
3HatchHydra10%
3HatchHydraExpo10%
3HatchLingExpo2143%
Over10Hatch10%
OverhatchExpoLing1100%
ZvP_3HatchPoolHydra20%
7 openings2836%

#11 UAlbertaBot

openinggameswins
3HatchLingExpo10%
5PoolHard2Player10%
9PoolExpo10%
9PoolSpeed10%
9PoolSunkHatch4633%
9PoolSunkSpeed2948%
Over10Hatch1Sunk20%
OverpoolSpeed10%
ZvZ_Overpool9Gas10%
9 openings8335%

#12 Tyr

openinggameswins
9PoolHatch5100%
ZvP_3HatchPoolHydra50%
2 openings1050%

#13 Ecgberht

openinggameswins
11Gas10PoolLurker1050%
2HatchLurker2361%
2HatchLurkerAllIn4475%
Over10HatchBust333%
OverpoolLurker875%
OverpoolSpeed333%
ZvT_13Pool10%
7 openings9265%

#14 Aiur

openinggameswins
11Gas10PoolLurker1100%
5PoolHard2Player1100%
9PoolSunkHatch1100%
9PoolSunkSpeed2100%
Over10Hatch10%
Over10Hatch1Sunk250%
Over10Hatch2Hard1100%
Over10HatchSlowLings1100%
OverpoolSpeed2100%
OverpoolTurtle367%
10 openings1580%

#15 TitanIron

openinggameswins
3HatchLingBust10%
AntiFact_13Pool650%
AntiFact_2Hatch10%
AntiFactory7442%
Over10Hatch2Sunk10%
OverhatchExpoMuta10%
OverpoolLurker10%
ZvZ_Overgas9Pool1421%
ZvZ_Overpool9Gas10%
9 openings10037%

This selection of openings implies that TitanIron plays a factory-first build against zerg, like Iron, and is a non-learning bot, like Iron. Later I’ll look into the source and find out for sure.

#16 Ziabot

openinggameswins
11Gas10PoolMuta425%
2.5HatchMuta10%
3HatchHydraBust10%
6PoolSpeed10%
8Pool771%
9Hatch8Pool10%
9PoolHatch450%
ZvP_2HatchTurtle10%
ZvZ_12Pool10%
ZvZ_12PoolMain1625%
ZvZ_Overpool11Gas1050%
ZvZ_Overpool9Gas5374%
12 openings10056%

Low win rates against Zia and some other opponents suggest to me that Steamhammer had other new weaknesses besides crashing. I think Steamhammer should score over 80% against Zia.

#18 Overkill

openinggameswins
11Gas10PoolMuta1090%
4PoolHard2396%
6PoolSpeed28100%
9Hatch8Pool10%
OverhatchLing250%
OverpoolSpeed1392%
ZvZ_12HatchExpo250%
ZvZ_12PoolMain10%
8 openings8091%

#19 TerranUAB

openinggameswins
2HatchLurker5290%
AntiFact_13Pool888%
AntiFact_2Hatch978%
AntiFactory3190%
4 openings10089%

#20 CUNYbot

openinggameswins
11Gas10PoolMuta978%
OverhatchLing3497%
ZvZ_12PoolLing2796%
ZvZ_Overgas9Pool10%
ZvZ_Overpool9Gas1989%
5 openings9092%

#21 OpprimoBot

openinggameswins
11Gas10PoolLurker367%
2HatchLurker250%
2HatchLurkerAllIn683%
6PoolSpeed19100%
OverpoolLurker10%
OverpoolSpeed580%
ZvT_12PoolMuta2095%
ZvT_3HatchMuta20100%
ZvT_3HatchMutaExpo24100%
9 openings10094%

#22 Sling

openinggameswins
4PoolHard475%
4PoolSoft6100%
5PoolHard2Player3100%
ZvZ_12HatchMain10%
ZvZ_Overgas9Pool10%
5 openings1580%

The selection of fast rush openings suggests that Sling played a macro strategy which was countered by fast rushes. But I don’t want to draw strong conclusions based on 15 non-crash games out of 125.

#23 SRbotOne

openinggameswins
11Gas10PoolLurker1493%
2HatchLurker1090%
2HatchLurkerAllIn1090%
3HatchLurker17100%
4PoolSoft17100%
5PoolHard7100%
9HatchExpo9Pool9Gas475%
9PoolLurker3100%
OverpoolLurker5100%
9 openings8795%

The wide range of lurker openings means that SRbotOne by Johan Kayser fought with mostly barracks units. Well, we already knew that.

#24 Bonjwa

openinggameswins
9PoolExpo6100%
9PoolSunkHatch5100%
9PoolSunkSpeed5100%
AntiFact_2Hatch3100%
AntiFactory5100%
ZvT_2HatchMuta1100%
6 openings25100%

#25 Stormbreaker

openinggameswins
11Gas10PoolMuta1100%
4PoolHard1100%
9PoolSunkHatch8100%
9PoolSunkSpeed8100%
OverhatchLing1100%
OverhatchMuta7100%
OverpoolSpeed1100%
OverpoolSunk7100%
ZvZ_12HatchExpo2100%
ZvZ_12HatchMain3100%
ZvZ_12PoolLing1100%
ZvZ_12PoolMain3100%
12 openings43100%

#26 Korean

openinggameswins
4PoolHard1100%
4PoolSoft3100%
5PoolHard5100%
5PoolHard2Player3100%
5PoolSoft1100%
6PoolSpeed6100%
OverhatchLing9100%
OverhatchMuta12100%
ZvZ_12HatchExpo13100%
ZvZ_12HatchMain16100%
ZvZ_12PoolLing14100%
ZvZ_12PoolMain17100%
12 openings100100%

#27 Salsa

openinggameswins
4PoolHard2100%
4PoolSoft4100%
5PoolHard7100%
5PoolHard2Player1100%
5PoolSoft1100%
6PoolSpeed8100%
OverhatchLing11100%
OverhatchMuta8100%
ZvZ_12HatchExpo12100%
ZvZ_12HatchMain20100%
ZvZ_12PoolLing13100%
ZvZ_12PoolMain12100%
ZvZ_Overgas9Pool1100%
13 openings100100%

overall

totalZvTZvPZvZZvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
11Gas10PoolLurker3168% 2871% 333%
11Gas10PoolMuta2669% 10% 2572%
2.5HatchMuta10% 10%
2HatchHydra10% 10%
2HatchHydraBust10% 10%
2HatchLurker8782% 8782%
2HatchLurkerAllIn6473% 6473%
3HatchHydra40% 40%
3HatchHydraBust10% 10%
3HatchHydraExpo50% 10% 40%
3HatchLingBust20% 10% 10%
3HatchLingExpo2536% 20% 2241% 10%
3HatchLurker3171% 3073% 10%
4HatchBeforeGas30% 30%
4PoolHard3291% 10% 3194%
4PoolSoft3197% 17100% 10% 13100%
5PoolHard19100% 7100% 12100%
5PoolHard2Player989% 1100% 7100% 10%
5PoolSoft2100% 2100%
6PoolSpeed6397% 2095% 4398%
7Pool12Hatch10% 10%
7PoolSoft10% 10%
8Pool1450% 1450%
9Hatch8Pool40% 10% 10% 20%
9HatchExpo9Pool9Gas5137% 4939% 20%
9HatchMain9Pool9Gas20% 10% 10%
9PoolExpo875% 6100% 20%
9PoolHatch1070% 5100% 450% 10%
9PoolLurker3100% 3100%
9PoolSpeed862% 683% 10% 10%
9PoolSunkHatch6650% 5100% 1100% 1392% 4732%
9PoolSunkSpeed7265% 683% 2100% 3574% 2948%
AntiFact_13Pool1856% 1856%
AntiFact_2Hatch9721% 9621% 10%
AntiFactory11257% 11158% 10%
Over10Hatch90% 10% 80%
Over10Hatch1Sunk119% 911% 20%
Over10Hatch2Hard1100% 1100%
Over10Hatch2Sunk200% 10% 180% 10%
Over10HatchBust425% 333% 10%
Over10HatchSlowLings520% 520%
OverhatchExpoLing1421% 1100% 1315%
OverhatchExpoMuta10% 10%
OverhatchLing5796% 5796%
OverhatchMuta2993% 10% 2896%
Overpool+110% 10%
OverpoolHatch10% 10%
OverpoolLurker2854% 2854%
OverpoolSpeed6156% 862% 1573% 1587% 2322%
OverpoolSunk888% 888%
OverpoolTurtle933% 633% 333%
PurpleSwarmBuild10% 10%
ZvP_2HatchMuta90% 20% 70%
ZvP_2HatchTurtle10% 10%
ZvP_3HatchPoolHydra170% 170%
ZvP_4HatchPoolHydra10% 10%
ZvT_12PoolMuta2383% 2286% 10%
ZvT_13Pool20% 20%
ZvT_2HatchMuta1100% 1100%
ZvT_3HatchMuta2195% 2195%
ZvT_3HatchMutaExpo24100% 24100%
ZvZ_12HatchExpo2997% 2997%
ZvZ_12HatchMain4293% 4293%
ZvZ_12Pool20% 20%
ZvZ_12PoolLing10479% 10479%
ZvZ_12PoolMain4973% 4973%
ZvZ_Overgas9Pool1921% 1421% 520%
ZvZ_Overpool11Gas1145% 10% 1050%
ZvZ_Overpool9Gas7674% 10% 7476% 10%
total159664%68562%15526%63382%12329%
openings played6937363113

This summary table took me hours to get right, so I hope it's useful.

Steamhammer played 69 openings in 1596 non-crash games, which is around 2/3rds of the openings it knows. No single matchup had more than 37 different openings. There were far more games against terran and zerg than against protoss and random, partly due to the crashing pattern. Against the random opponents (Tscmoo and UAlbertaBot), it settled on mostly general-purpose openings, as you might expect. Its best matchup was ZvZ, with a Jaedong-like 82% win rate (and lately, Jaedong crashes half the time too, so they’re just alike).

Openings that were both popular and successful include 2HatchLurker and 2HatchLurkerAllIn versus terran, 6PoolSpeed with a 97% win rate against mostly weak opponents, 9PoolSunkSpeed used across all matchups, and ZvZ specialties OverhatchLing, ZvZ_12PoolLing, and ZvZ_Overpool9Gas. None of the opening choices surprises me, though some of the win rates do.

CIG 2018 - what Overkill learned

After analyzing AIUR yesterday, I ran a similar (but much simpler) analysis for the classic zerg #18 Overkill. The version in CIG 2018 has not been updated since 2015 and is the same version that still plays on SSCAIT. In 2015 it was a sensation, placing 3rd in both CIG and AIIDE—its place of 18 in this tournament, with about 35% win rate, suggests huge progress over the past 3 years. But keep reading; Overkill appears to have been broken in this tournament. I did this analysis once before: See what Overkill learned in AIIDE 2015.

Classic Overkill knows 3 openings, a 9 pool opening which stays on one base for a good time, and 10- and 12-hatch openings to get mutalisks first. When it chooses 9 pool, that means that the opponent is either rushing (so the 9 pool is necessary to defend) or is being too greedy (which the 9 pool can exploit). Overkill counts some games twice in an attempt to learn faster, so sometimes its total game count is larger than the number of rounds in the tournament (125).

NinePoollingTenHatchMutaTwelveHatchMutatotal
opponentnwinnwinnwinnwin
#1 Locutus420%420%410%1250%
#2 PurpleWave430%430%420%1280%
#3 McRave440%440%430%1310%
#4 tscmoo400%400%472%1271%
#5 ISAMind420%420%410%1250%
#6 Iron547%320%393%1254%
#7 ZZZKBot472%390%472%1332%
#8 Microwave546%350%422%1313%
#9 LetaBot526%330%402%1253%
#10 MegaBot6012%240%417%1258%
#11 UAlbertaBot410%410%482%1301%
#12 Tyr400%390%472%1261%
#13 Ecgberht5716%244%4212%12312%
#14 Aiur9434%147%1712%12528%
#15 TitanIron3611%200%6916%12512%
#16 Ziabot160%160%9323%12517%
#17 Steamhammer10748%70%1010%12442%
#19 TerranUAB2467%30%9883%12578%
#20 CUNYbot1844%617%10166%12561%
#21 OpprimoBot3667%30%8676%12571%
#22 Sling6746%60%5242%12542%
#23 SRbotOne2374%425%9589%12284%
#24 Bonjwa7592%425%4687%12588%
#25 Stormbreaker7091%20%5387%12588%
#26 Korean7799%20%4693%12595%
#27 Salsa46100%3294%46100%12498%
total130536%5976%137240%327432%

The 10 hatch opening was useless in this tournament—against every opponent, 10 hatch was the worst choice, at best tying for 0. In 2015, 10 hatch was about as successful as the other openings.

Signs are that something was wrong with Overkill in this tournament. In AIIDE 2015, then #3 Overkill scored 23% against then #4 UAlbertaBot, 68% against #5 AIUR, and 99% against #17 OpprimoBot. In CIG 2018, it was 1.6% against UAlbertaBot, 28% against AIUR, 71% against OpprimoBot. All versions appear to be the same in both tournaments—I didn’t look closely, but I did unpack the sources and check dates (in particular, Overkill has file change dates up to 8 October 2015 in both tournaments). Overkill had 14 crash games in CIG 2018, not enough to account for the difference. It’s hard to believe that the maps could have shifted results that much.

Tomorrow: What went wrong with Overkill?

CIG 2018 - what AIUR learned

Here is what the classic protoss bot AIUR learned about each opponent over the course of CIG 2018. AIUR has not been updated in many years and has fallen behind the state of the art, but its varied strategies and learning still make it a tricky opponent in a long tournament. Seeing AIUR's counters for each opponent tells us something about how the opponent played. For past editions, see AIIDE 2017 what AIUR learned and what AIUR learned (AIIDE 2015).

This is generated from data in AIUR's final write directory. There were 125 rounds and 5 maps, one 2-player and two each 3- and 4-player maps. For some opponents, all games were recorded, giving 25 games on the 2-player map and 50 games each on 3- and 4-player maps. For most opponents, fewer games were recorded. AIUR recorded 2932 games, and the results table lists 318 crashes for AIUR. 2932 + 318 = 3250, the correct total game count. Unrecorded games were lost due to crashes, and for no other reason.

First the overview, summing across all opponents.

overall234total
 nwinsnwinsnwinsnwins
cheese7249%12765%13235%33149%
rush2941%26933%26155%55944%
aggressive1323%22568%18478%42271%
fast expo3324%18548%20748%42546%
macro4633%18052%13560%36153%
defensive14175%31473%37955%83465%
total33454%130056%129856%293256%
  • 2, 3, 4 - map size, the number of starting positions
  • n - games recorded
  • wins - winning percentage over those games
  • cheese - cannon rush
  • rush - dark templar rush
  • aggressive - fast 4 zealot drop
  • fast expo - nexus first
  • macro - aim for a strong middle game army
  • defensive - try to be safe against rushes

Looking across the bottom row, you can see that AIUR had a plus score on every size of map, and that it had to choose different strategies to do so well. It's a strong result for a bot which has essentially no micro skills and has not been updated since 2014. It does still have the best cannon rush of any bot, if you ask me.

#1 locutus234total
 nwinsnwinsnwinsnwins
cheese10%80%2512%349%
rush10%100%60%170%
aggressive10%40%50%100%
fast expo10%140%50%200%
macro10%70%40%120%
defensive10%714%50%138%
total60%502%506%1064%

Even against the toughest opponents, AIUR can scrape a small edge with learning. Against Locutus, it pulled barely above zero, but got a few extra wins because it discovered that its cannon rush occasionally scores on 4-player maps. Results against PurpleWave below are similar. I suspect that if AIUR had played the cannon rush every game, Locutus would have adapted and nullified the edge. Maybe it did, and that’s why the edge is so small.

#2 purplewave234total
 nwinsnwinsnwinsnwins
cheese10%80%3918%4815%
rush10%80%20%110%
aggressive10%100%30%140%
fast expo40%80%20%140%
macro10%100%20%130%
defensive30%60%20%110%
total110%500%5014%1116%


#3 mcrave234total
 nwinsnwinsnwinsnwins
cheese1100%10%10%333%
rush10%412%10%432%
aggressive00%20%30%50%
fast expo10%10%4217%4416%
macro10%30%10%50%
defensive10%20%20%50%
total520%502%5014%1059%

Against McRave, the choice is nexus first. McRave must have settled on a macro opening itself.

#4 tscmoo234total
 nwinsnwinsnwinsnwins
cheese1127%10%10%1323%
rush10%10%30%50%
aggressive10%119%10%138%
fast expo520%3315%10%3915%
macro10%20%2214%2512%
defensive10%20%2218%2516%
total2020%5012%5014%12014%

Against the unpredictable Tscmoo, AIUR wavered before settling on an unpredictable set of answers. Notice that not all the strategies are well explored: If you win less than 1 game in 5, then playing an opening 3 times is not enough. If the tournament were much longer, AIUR would likely have scored higher because of its slow but effective learning.

#5 isamind234total
 nwinsnwinsnwinsnwins
cheese10%20%40%70%
rush1100%3719%388%7614%
aggressive00%10%30%40%
fast expo10%50%20%80%
macro10%10%20%40%
defensive10%40%10%60%
total520%5014%506%10510%

ISAMind may be based on Locutus, but unlike Locutus it is vulnerable to AIUR’s dark templar rushes. It’s a sign that it is not as mature and well tested.

#6 iron234total
 nwinsnwinsnwinsnwins
cheese10%10%50%70%
rush10%2619%20%2917%
aggressive00%20%20%40%
fast expo10%10%3110%339%
macro10%195%40%244%
defensive10%10%60%80%
total50%5012%506%1059%


#7 zzzkbot234total
 nwinsnwinsnwinsnwins
cheese40%20%20%80%
rush40%40%10%90%
aggressive30%20%10%60%
fast expo30%30%10%70%
macro70%50%40%160%
defensive40%3429%4112%7919%
total250%5020%5010%12512%

4 pooler ZZZKBot is of course best countered by a defensive anti-rush strategy. Well, it helped, but the rush is too strong for AIUR to survive reliably. On the 2-player map, AIUR found no answer.

#8 microwave234total
 nwinsnwinsnwinsnwins
cheese20%20%10%50%
rush10%277%10%297%
aggressive10%10%10%30%
fast expo10%20%10%40%
macro10%10%922%1118%
defensive1822%1724%3625%7124%
total2417%5012%4922%12317%

Microwave apparently also played a rushy style versus AIUR. That’s interesting. I think that AIUR’s defensive strategy is good against pressure openings generally, so Microwave was likely playing low-econ but not necessarily fast rushes.

#9 letabot234total
 nwinsnwinsnwinsnwins
cheese10%10%10%30%
rush10%10%333%520%
aggressive00%333%10%425%
fast expo10%4149%4349%8548%
macro1100%333%10%540%
defensive10%10%10%30%
total520%5044%5044%10543%

Fast expo makes sense against LetaBot’s “wait for it... wait for it... here it comes!” one big smash.

#10 megabot234total
 nwinsnwinsnwinsnwins
cheese10%20%30%60%
rush250%40%3811%4411%
aggressive10%30%30%70%
fast expo10%30%20%60%
macro20%3628%20%4025%
defensive1894%20%20%2277%
total2572%5020%508%12526%

Why did MegaBot have so much more trouble on the 2-player map? According to the official per-map result table, MegaBot did fine overall on Destination (the one 2-player map), so its trouble came only against AIUR. Maybe I should watch replays and diagnose it.

#11 ualbertabot234total
 nwinsnwinsnwinsnwins
cheese10%10%10%30%
rush20%4337%20%4734%
aggressive10%20%10%40%
fast expo10%20%10%40%
macro1833%10%10%2030%
defensive10%10%4416%4615%
total2425%5032%5014%12423%


#12 tyr234total
 nwinsnwinsnwinsnwins
cheese10%10%10%30%
rush1100%10%3281%3479%
aggressive00%3746%875%4551%
fast expo1100%333%367%757%
macro10%633%333%1030%
defensive10%20%333%617%
total540%5040%5072%10555%

I suspect that Tyr suffered here because it is a jvm bot and could not write its learning file.

#13 ecgberht234total
 nwinsnwinsnwinsnwins
cheese1100%3889%250%4188%
rush1100%10%4367%4567%
aggressive00%475%10%560%
fast expo1100%10%20%425%
macro10%367%10%540%
defensive10%367%10%540%
total560%5082%5060%10570%


#15 titaniron234total
 nwinsnwinsnwinsnwins
cheese10%10%250%425%
rush10%10%333%520%
aggressive00%4279%4288%8483%
fast expo10%10%10%30%
macro1100%250%10%450%
defensive1100%30%10%520%
total540%5068%5078%10571%

TitanIron appears to have been too predictable. Notice that the winning strategy on most maps was never tried (without crashing) on the 2-player map. It might have won there too.

#16 ziabot234total
 nwinsnwinsnwinsnwins
cheese1650%250%10%1947%
rush10%20%10%40%
aggressive10%10%333%520%
fast expo10%250%00%333%
macro10%10%10%30%
defensive333%4269%4457%8962%
total2339%5062%5052%12354%


#17 steamhammer234total
 nwinsnwinsnwinsnwins
cheese10%10%10%30%
rush367%475%9100%1688%
aggressive3100%17100%15100%35100%
fast expo20%20%250%617%
macro1100%10100%10%1292%
defensive14100%16100%22100%52100%
total2483%5092%5094%12491%


#18 overkill234total
 nwinsnwinsnwinsnwins
cheese10%30%250%617%
rush00%250%10%333%
aggressive00%10%1060%1155%
fast expo10%367%00%450%
macro00%00%00%00%
defensive1688%4190%3778%9485%
total1878%5080%5072%11876%


#19 terranuab234total
 nwinsnwinsnwinsnwins
cheese1100%888%10%1080%
rush1100%11100%30100%42100%
aggressive00%475%250%667%
fast expo1100%16100%683%2396%
macro1100%989%1090%2090%
defensive1100%250%10%450%
total5100%5092%5090%10591%


#20 cunybot234total
 nwinsnwinsnwinsnwins
cheese10%250%475%757%
rush1100%10%20%425%
aggressive00%475%1392%1788%
fast expo10%250%250%540%
macro1100%989%13100%2396%
defensive1100%32100%15100%48100%
total560%5090%4990%10488%


#21 opprimobot234total
 nwinsnwinsnwinsnwins
cheese1100%12100%683%1995%
rush1100%5100%7100%13100%
aggressive00%7100%4100%11100%
fast expo1100%11100%17100%29100%
macro1100%8100%7100%16100%
defensive1100%7100%9100%17100%
total5100%50100%5098%10599%


#22 sling234total
 nwinsnwinsnwinsnwins
cheese10%10%10%30%
rush1100%5100%250%888%
aggressive00%13100%13100%26100%
fast expo1100%7100%10100%18100%
macro1100%8100%11100%20100%
defensive1100%16100%13100%30100%
total580%5098%5096%10596%


#23 srbotone234total
 nwinsnwinsnwinsnwins
cheese10%250%10%425%
rush1100%9100%367%1392%
aggressive00%13100%16100%29100%
fast expo1100%10100%8100%19100%
macro1100%786%6100%1493%
defensive1100%9100%16100%26100%
total580%5096%5096%10595%


#24 bonjwa234total
 nwinsnwinsnwinsnwins
cheese1100%9100%475%1493%
rush1100%13100%10100%24100%
aggressive00%7100%10100%17100%
fast expo1100%6100%7100%14100%
macro1100%7100%8100%16100%
defensive1100%8100%11100%20100%
total5100%50100%5098%10599%


#25 stormbreaker234total
 nwinsnwinsnwinsnwins
cheese475%10%475%967%
rush00%580%10100%1593%
aggressive00%18100%7100%25100%
fast expo00%00%6100%6100%
macro00%9100%8100%17100%
defensive20100%17100%15100%52100%
total2496%5096%5098%12497%


#26 korean234total
 nwinsnwinsnwinsnwins
cheese7100%2100%10100%19100%
rush00%7100%8100%15100%
aggressive00%5100%8100%13100%
fast expo00%8100%8100%16100%
macro00%5100%6100%11100%
defensive14100%23100%10100%47100%
total21100%50100%50100%121100%

Well, if you win every game, learning cannot help.

#27 salsa234total
 nwinsnwinsnwinsnwins
cheese9100%15100%9100%33100%
rush00%00%3100%3100%
aggressive00%11100%8100%19100%
fast expo00%00%4100%4100%
macro00%8100%7100%15100%
defensive15100%16100%19100%50100%
total24100%50100%50100%124100%

the critical vital absolutely essential filename question of the decade

Here is a question of virtually no importance that nevertheless has me puzzled: What should I call my learning files?

For now, Steamhammer has an opponent model file for each opponent, named om_[opponent].txt. OM for opponent model. It makes sense, or anyway it makes as much sense as an arbitrary filename can. I like names that make sense.

The next learning data I want to add is opening models, so that Steamhammer can know the timings. With knowledge of both opponent strategies and its own opening strategies, it will be able to directly compare and find counters: Your attack comes at this time, which opening is ready at that timing? It will also be able to recognize which openings are similar to others, so that when it can’t match a strategy, finding good openings by trial and error is quicker.

What should I name the opening model files? Opponent models and opening models are both empirical data, and should be updated as games are played. But the unfortunate words “opponent” and “opening” are too much alike to abbreviate nicely. Should I start with “enemy” and “build order”? “Bot” and “strategy”? Most abbreviations seem unintuitive. My best idea so far is to rename the om_* files to bot_* and use the prefix open_ for openings. Maybe OK?

What’s your idea? Because, according to the bikeshed principle, everyone should have an opinion on this....

Steamhammer’s learning results

When I uploaded Steamhammer 1.4.3 to SSCAIT on 11 June, I erased its learned data from the server. Its elo immediately plunged, partly because the voters wanted to put it through its paces against strong opponents, and partly because it needs its learning data to cope. Most rushbots, and many others, won their first or first few games against Steamhammer. That didn’t change when I uploaded 1.4.4 a week later—the improvements weren’t many.

Finally, only in the past several days, I’ve started to feel that Steamhammer has learned enough that it is closing in on its equilibrium elo. It has been wavering around the high 2100’s, not able to break above 2200 but not falling far either. It seems about right, at least for SSCAIT conditions.

The findings. As I’ve mentioned, clearing the learning data was a deliberate test to see how well the learning system works when learning from scratch. I’m fairly pleased. I see weaknesses, but only weaknesses I expected. Against XIMP, Steamhammer has settled on an opening that has won every game so far, but is not as strong as the 3 hatch before pool opening that I hand-chose for it in the old days. Steamhammer only sees that it wins. It can’t tell the difference between openings that win nearly all games because it sees only the winning rate; it needs an evaluation function that can tell it “this one wins more convincingly.” Against Proxy, it won one game with its unusual 6 pool opening. Then it played another game and recorded another win—because Proxy crashed. Steamhammer thought it had found a winner, and had to lose some games before it realized that the 6 pool was not a reliable counter. (It would be, if not for Proxy’s powerful worker defense.) Possibly 5 pool or 4 pool would succeed, but Steamhammer does not know that some openings are related to others. When I teach it that, it will be able to realize that if one opening shows promise but is not quite successful, it should try related openings.

In some cases, Steamhammer hit on surprising counters. The most striking example is against TyrProtoss, which had been winning every game with its cannon turtle into timing attack strategy. Steamhammer tried its 2 hatch lurker all-in attack, which did not make sense to me—Steamhammer’s lurkers suck when cannons are around, it has little idea how to break the cannons and no idea how to bypass them. But it won a game. We’ll see if it keeps winning!

I expected the weaknesses, and I expected the surprising counters. I feel as though I understood the learning system and its limitations fairly well. It gives me confidence that my planned improvements, when I finally get around to them, will be real improvements.

no more enemy-specific strategies for Steamhammer

Working on the opponent model today, I made one of the key changes for the next version:

    "UseEnemySpecificStrategy" : false,
    "EnemySpecificStrategy" :
    {
    },

No more openings hand-configured for known opponents. Steamhammer has to figure out everything on its own. I’ve been working toward this for a long time, and it’s good to finally take the step. I expect play to become more varied—Steamhammer is likely to discover surprising solutions for some opponents. Play should also become stronger, especially in tournaments where opponents like to prepare specially against select enemies. They’ll have to look for ways to exploit Steamhammer’s tactical and micro mistakes, because the game plans will be too adaptive.

I also wrote the terran vulture-first recognizer for the plan recognizer today. It recognizes a plan called Factory that can only be followed by terran, and Steamhammer zerg is configured to counter the plan with the AntiFactory opening. Testing against Iron, it worked perfectly: The first game, Iron won easily. The second game, Steamhammer countered and fought back hard (and happened to win). That’s how it’s supposed to work.

The recognizer was easy to write. Maybe I should write a few more recognizers and counters.

Iron should be a good test case, because Iron is strong enough to usually defeat the counter—AntiFactory puts up a tough battle, but still mostly loses. Opening learning success looks like this: Steamhammer realizes that AntiFactory is probably best, though not all that good, and explores other openings sometimes but not too often. I think I should be able to get that right.

Will playing better games against Iron entice voters on SSCAIT? I think it might happen. If so, I will quickly grow bored with similar Iron-Steamhammer games, but stream watchers may be pleased. Iron would likely lose a few elo points to Steamhammer on average, instead of gaining as it does now.

The upcoming version 1.4.2 has important improvements for all races, including some improvements I haven’t mentioned. Strategy, macro, and micro are better. Look forward to higher rankings for Steamhammer and Randomhammer.