archive by month
Skip to content

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

new bot Feint

New bot Feint appears to be a feint. It looks like a recompiled Steamhammer 2.3.5 playing terran; the DLL files are the same size in bytes, and even the bot and author names in the configuration file have not been touched. It this a test and it will be updated, or is it a throwaway?

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.

AIIDE 2019 - what bots wrote data

For the AIIDE 2019 main tournament, I looked in each bot’s write directory to see what files it wrote, if any, and in its AI directory to see if it had prepared data for any opponents. The usual disclaimers apply: A bot does not necessarily use the data it writes. Preparation for specific opponents is not necessarily in the form of data in the AI directory, it might be in code.

#botinfo
1LocutusThe learning files look just like last year’s. Locutus also has pre-learned data for all but 2 of its opponents (DaQin and AITP), plus a number of bots that did not compete.
2PurpleWaveThe learning files have an initially chosen strategy followed by a sequence of “fingerprinted” enemy strategies. (PurpleWave also has specific preparation for its opponents, but that’s in code rather than data.)
3BananaBrainA learning file for each opponent in the form of brief records of results. Each record consists of date+time, map, BananaBrain’s strategy (“PvZ_9/9gate”), the opponent’s recognized strategy (“Z_10hatch”), a floating point number that I haven’t discovered the meaning of, and the game result. Cool data, I want to analyze it. There is also pre-learned data for 7 of the tournament opponents.
4DaQinLearning files straight from its parent Locutus (very similar to Steamhammer files). There is no visible pre-learned data (in a quick check I also found no opponent-specific code).
5SteamhammerOpponent model files unchanged from last year. Also prepared data for 9 of the tournament opponents.
6ZZZKBotCarried over from last year. Learning files for each opponent with detailed but hard-to-interpret information about each game.
7MicrowaveOne file per opponent listing Microwave’s strategies, with win and loss counts for each limited to a max of 10. Microwave deliberately forgets history. This part is the same as last year. New is a “history” file for each opponent, with a one-line record of data about each game. Also pre-learned files for 8 tournament opponents plus many other bots. The author said in a comment that there may be errors in the learning data due to code bugs.
8IronNothing.
9XiaoYiLearning files like its parent SAIDA, for each defeat, internal error, or timeout.
10McRave2 files for each opponent, one with strategy information for all games similar to last year, and an “info” file which seems to include some kind of build order or unit count information about only one game.
11UAlbertaBotCarried over from past years. For each opponent, a file listing strategies with win and loss counts for each.
12AITPOpponent model files straight from Steamhammer. AITP is a Steamhammer fork.
13BunkerBoxeRNothing.

Virtually all bots recorded data about their games and opponents. Only holdover Iron and newcomer BunkerBoxeR chose to ignore history. Most bots from #7 Microwave on up also had prepared data about predictable opponents. Learning is now an expected feature. To aspire to a high finish, you pre-train against your opponents. And ideally come up with a trick that your opponents cannot prepare for, like Locutus’s defensive opening with zealot drop.

I already have scripts to parse most of these learning files. I’ll write a new one for BananaBrain.

Steamhammer 2.3.6 uploaded

I’ve uploaded Steamhammer 2.3.6 to SSCAIT. The main purpose of this point release is to fix a combat simulation bug that I cleverly—nay, brilliantly inserted just before the AIIDE tournament, to ensure that Steamhammer’s results didn’t discourage other bot authors. The bug caused deviations from excellence such as scoring 67% against Iron rather than 95%. The bug had a variety of effects, but the most important is that mutalisks were afraid of enemies that they could not see, even enemies like vultures that could not shoot back. Come into view and die, stay out of sight and live forever.

After AIIDE prep I wanted to do something fun, so I also added queen skills, improved defiler plague, and fixed a bunch of easier bugs and weaknesses, including a few important ones. Important changes are in bold.

combat simulation

Setup of combat simulation is corrected. In the AIIDE version I added code in the CombatSimulation class (which works the details of setting up a combat sim) to bypass the combat sim and return a short-circuit result in certain easy cases where the enemy has undetected cloaked units. FAP does not simulate cloaking and detection, so it was an important improvement. I reversed a condition in an important bit of code, which had the effect that the short-circuit worked correctly in the cases where it was supposed to, but also worked in cases where it was not supposed to. Ouch.

related to bases

An infested command center was misrecorded as belonging to both sides. That was a fun bug! There was a correct record saying it was zerg, and a leftover incorrect record claiming that it was still terran. I didn’t test mind control, but the bug must have affected that too. The most obvious effect was that a squad might be ordered to attack the location of the “enemy base,” after which they would gather around the infested CC and warm their hands (well, claws).

• A lifted command center no longer establishes a base. The code that checked “does somebody own this base?” did not consider whether a command center in the correct location might be in the air. That generally led units to collect underneath the lifted CC until it was either shot down or moved away from the base location. It didn’t cause any losses that I saw, but it did cause bad play.

Workers start transferring to a new base before the base’s resource depot completes. It’s something of a big deal, because Steamhammer zerg deliberately overproduces drones to populate a new base as soon as the hatchery starts, so that the base can become productive as early as possible. But then it didn’t transfer the drones until the hatchery completed. Now it computes the distance and transfers the drones to arrive after the hatchery finishes. It uses the shorter air distance instead of the true ground distance so workers are sent later than they could be, but it’s nevertheless an honorable improvement. Be afraid of the big macro.

queens

For fun, I added broodling and ensnare and made command center infestation more reliable. Steamhammer already had parasite skills. Parasite was more successful than I expected; in recent games I think the queen sometimes paid for itself in information about the enemy. Broodling and ensnare make games more fun when they come up, especially ensnare, and they’re not too costly. There remains a lot of room to improve queen play, especially queen maneuvering and coordination.

Broodling. If Steamhammer sees enough enemy units that want to turn into broodlings (like tanks, or high templar, or ultralisks), it will eventually make 1 or 2 queens and research broodling. Making 2 queens is new behavior. If broodling is researched, then broodling is the queen’s highest priority: The queen will stay home until it has enough energy, then join the army and broodling any enemy that wants it enough. Only if there is extra energy will it consider ensnare or parasite.

Ensnare. If Steamhammer sees a substantial number of enemies that enjoy being ensnared, it will eventually produce a queen, research ensnare, and oblige them. If ensnare is researched, then ensnare has priority over parasite: Steamhammer will only use parasite if the queen has enough energy that a future ensnare could still happen. (Ensnare and parasite both cost 75 energy.) The ensnare code works similarly to plague: It scans around and scores the possible ensnare targets to choose the best. It likes to ensnare fast units, and it likes to reveal cloaked units with ensnare, and of course it likes to goop up as many enemies as possible. Also, I updated FAP to understand that ensnare slows down the movement and firing rate of units. FAP’s understanding of ensnared movement is approximate, but its understanding of firing rate is nearly accurate. That way Steamhammer understands that ensnared units are weaker, and now might be a good time to attack them.

• If ensnare or broodling is researched, eventually also research the queen energy upgrade.

Infest command centers more reliably. Formerly, Steamhammer had no special infestation skill at all. It could infest a command center solely as a side effect of the queen’s behavior of staying with the army; if the army was hitting a command center, then the queen was in infestation range because the army was there. If the queen didn’t have energy for a spell, it stayed home and could not infest. Now the queen wakes up whenever an infestable command center is seen on the map, and moves toward it. Also, formerly the army might destroy the command center before the queen could infest it. Now the army recognizes when a queen is near and stops attacking the command center when it becomes infestable (below 1/2 HP). The army is more efficient, and more command centers turn to the dark side where they belong.

• Change to queen behavior that mainly affects cases where Steamhammer is contained to its natural: If a queen has enough energy to cast a spell, then its fallback retreat position is the front defense point, where it may be able to do some good. Otherwise its fallback retreat is the main base, where it should be relatively safe to sit and gain energy. This can make the queen more useful in a bad situation, but the queen is not likely to help much.

defilers

• There was an awesome extra digit in the constant “how many HP can plague eat up at most?” that Steamhammer uses in its forecast of how much damage a given plague will do. Oh... that is why it insisted on plaguing buildings even as I discounted them more and more—it thought it would do awesome damage! After fixing it, Steamhammer still loves to plague buildings; the practical effect of the fix is limited. But it has shifted its preference somewhat toward enemy units.

• I simplified the plague scoring code and tweaked it. Plague gets a higher score for putting a terran building into the red (so that it burns down if not repaired), and it will plague even a single enemy unit if it seems worth it.

The defiler might retreat to the main base and be useless when Steamhammer was contained to its natural and needed the defiler there to break out. I changed the defiler’s fallback retreat point to be the front defense point, which is also where any sunken colonies are placed. It’s not quite the same as the queen’s fallback retreat behavior. The queen needs a safe place to gather energy, the defiler can consume.

zerg

The finishing unit mix is drone-mutalisk. Formerly, when the opponent looked dead and Steamhammer wanted to chase down its last buildings, it made mutalisks plus whatever ground unit came out of the usual unit mix calculation, usually zerglings. That had rare unfortunate results when Steamhammer made too many ground units and could not get mutalisks. The drone count is capped at 75, so with a drone-mutalisk mix, Steamhammer will not run itself out of supply to make mutalisks and should almost never fail to finish off the opponent.

Ensure that there is at least one zergling or hydralisk in the army at all times after the opening book. Steamhammer scouts the enemy army primarily with its own army. If its army was wiped out in battle, it might sit back behind sunkens and drone up, thinking that the enemy army was also weak, and never learn better because it didn’t have forward units to see the enemy move out. “You mean, if I keep my eyes closed, I’m not safe after all?”

If terran or protoss has too much air, make a defensive spore colony even if Steamhammer also has a spire. Formerly, Steamhammer skipped the spore if it had a spire, because it used to be that scourge was defense enough. But if the enemy has too many air units, scourge is not enough. McRave (after an update this summer) is especially good at massing its corsairs and shooting down scourge. (In ZvZ, Steamhammer follows different rules for making defensive spores.)

• A temporary production freeze happened if Steamhammer wanted to upgrade air carapace... at the same time that it was morphing a greater spire. All production stopped until the greater spire completed. It was surprisingly common, it seemed to happen in most games where Steamhammer got a greater spire. Anyway, fixed now.

openings

• Added a protoss opening GoonObserver to directly counter DT rushes and other cloak rushes. Unfortunately the automatic “oh no, cloaked units, hurry and build cannons” reaction still happens and tends to delay the observers, but it’s still not a bad counter.

AIIDE 2019 - unknown maps per-player

Here are the per-player map tables for the AIIDE 2019 bonus tournament on “unknown” maps, meaning standard and well-known maps that weren’t announced beforehand. Since the competition is about maps, I want to look at the maps first.

With 10 opponents and 100 rounds, there are 10 * 9 * 100 / 2 = 4500 games total if all are played, meaning 900 games per player and 900 / 5 = 180 per player per map. Each player has 9 opponents, so there are 180/9 = 20 games per cell in these tables. The official results say that 4491 of the 4500 were successfully completed, so some cells have slightly fewer. Tail-ender UAlbertaBot participated in every game that did not complete (C0G has the same pattern).

LocutusoverallPolariLonginArcadiFightiRoadki
PurpleWave48%75%40%50%35%40%
DaQin73%75%75%85%75%55%
BananaBrain66%55%75%70%75%55%
Microwave98%100%90%100%100%100%
Steamhammer99%100%100%95%100%100%
XiaoYi97%100%90%100%95%100%
McRave96%100%95%100%100%85%
Iron100%100%100%100%100%100%
UAlbertaBot98%100%95%95%100%100%
overall86.11%89%84%88%87%82%


PurpleWaveoverallPolariLonginArcadiFightiRoadki
Locutus52%25%60%50%65%60%
DaQin76%60%90%70%95%65%
BananaBrain68%80%60%70%60%70%
Microwave96%95%100%95%95%95%
Steamhammer86%70%95%80%90%95%
XiaoYi90%90%80%90%90%100%
McRave93%95%95%90%95%90%
Iron98%100%100%100%90%100%
UAlbertaBot100%100%100%100%100%100%
overall84.28%79%87%83%87%86%


DaQinoverallPolariLonginArcadiFightiRoadki
Locutus27%25%25%15%25%45%
PurpleWave24%40%10%30%5%35%
BananaBrain41%60%30%35%30%50%
Microwave89%95%95%90%80%85%
Steamhammer97%95%95%100%100%95%
XiaoYi74%100%65%70%60%75%
McRave37%50%45%30%30%30%
Iron98%100%95%100%95%100%
UAlbertaBot77%75%70%89%68%80%
overall62.58%71%59%62%55%66%


BananaBrainoverallPolariLonginArcadiFightiRoadki
Locutus34%45%25%30%25%45%
PurpleWave32%20%40%30%40%30%
DaQin59%40%70%65%70%50%
Microwave74%75%70%75%75%75%
Steamhammer81%70%80%80%85%90%
XiaoYi62%50%70%50%70%70%
McRave69%80%70%55%65%75%
Iron56%30%55%65%45%85%
UAlbertaBot87%100%85%95%80%75%
overall61.56%57%63%61%62%66%


MicrowaveoverallPolariLonginArcadiFightiRoadki
Locutus2%0%10%0%0%0%
PurpleWave4%5%0%5%5%5%
DaQin11%5%5%10%20%15%
BananaBrain26%25%30%25%25%25%
Steamhammer84%90%95%75%80%80%
XiaoYi82%85%90%70%75%90%
McRave50%45%35%45%55%70%
Iron33%30%15%40%15%65%
UAlbertaBot65%70%60%79%60%55%
overall39.60%39%38%39%37%45%


SteamhammeroverallPolariLonginArcadiFightiRoadki
Locutus1%0%0%5%0%0%
PurpleWave14%30%5%20%10%5%
DaQin3%5%5%0%0%5%
BananaBrain19%30%20%20%15%10%
Microwave16%10%5%25%20%20%
XiaoYi50%25%80%70%45%30%
McRave89%85%90%95%90%85%
Iron59%85%40%60%55%55%
UAlbertaBot90%95%90%90%84%90%
overall37.75%40%37%43%35%33%


XiaoYioverallPolariLonginArcadiFightiRoadki
Locutus3%0%10%0%5%0%
PurpleWave10%10%20%10%10%0%
DaQin26%0%35%30%40%25%
BananaBrain38%50%30%50%30%30%
Microwave18%15%10%30%25%10%
Steamhammer50%75%20%30%55%70%
McRave29%35%40%25%20%25%
Iron80%80%85%70%90%75%
UAlbertaBot79%60%85%85%100%65%
overall37.00%36%37%37%42%33%


McRaveoverallPolariLonginArcadiFightiRoadki
Locutus4%0%5%0%0%15%
PurpleWave7%5%5%10%5%10%
DaQin63%50%55%70%70%70%
BananaBrain31%20%30%45%35%25%
Microwave50%55%65%55%45%30%
Steamhammer11%15%10%5%10%15%
XiaoYi71%65%60%75%80%75%
Iron41%25%30%45%40%65%
UAlbertaBot46%20%63%50%55%45%
overall36.04%28%36%39%38%39%


IronoverallPolariLonginArcadiFightiRoadki
Locutus0%0%0%0%0%0%
PurpleWave2%0%0%0%10%0%
DaQin2%0%5%0%5%0%
BananaBrain44%70%45%35%55%15%
Microwave67%70%85%60%85%35%
Steamhammer41%15%60%40%45%45%
XiaoYi20%20%15%30%10%25%
McRave59%75%70%55%60%35%
UAlbertaBot75%90%80%75%80%50%
overall34.44%38%40%33%39%23%


UAlbertaBotoverallPolariLonginArcadiFightiRoadki
Locutus2%0%5%5%0%0%
PurpleWave0%0%0%0%0%0%
DaQin23%25%30%11%32%20%
BananaBrain13%0%15%5%20%25%
Microwave35%30%40%21%40%45%
Steamhammer10%5%10%10%16%10%
XiaoYi21%40%15%15%0%35%
McRave54%80%37%50%45%55%
Iron25%10%20%25%20%50%
overall20.43%21%19%16%19%27%

Against its strong opponents, Locutus had trouble on the map Roadkill, possibly because of the low-ground main. If Locutus stuck with its cannons-at-the-ramp strategy, the cannons were weak on low ground. Iron also struggled on Roadkill. Polaris Rhapsody, the only 2-player map, also showed some extreme results—see BananaBrain versus Iron and McRave versus UAlbertaBot.

There are plenty more details in the tables.

fun game Simplicity-Locutus

Yesterday’s game Simplicity vs Locutus on Andromeda on BASIL starts out as one of the most entertaining bot games I have seen. The pictures show some of the cool stuff that Simplicity tried—with success. Then, after a tremendous fight where each side pressed temporary advantages and maxed its army, the replay loses sync and OpenBW cannot show the last half of the game.

Queens with broodling. The Research tab shows broodling research, and there are broodlings on the ground. Simplicity made 8 queens early and even researched queen energy, and the queens paid for themselves with interest. When Locutus attacked, zerg sent out as many queens as had energy to simultaneously spawn broodlings, helping to break the attacks. It’s a simple way to coordinate the queens to get tactical results, and is more effective than the common bot approach of using the queens as attrition weapons. Simplicity’s queens eventually died to corsairs; with more careful play, they could have lived to the end of the game, because Locutus was not skilled with its corsairs.

Broodlings!

Island base with static defense. The overlord on the left has just dropped off another drone to join the miners.

Island!

Drops. Simplicity repeatedly dropped small numbers of units into the far end of Locutus’s base, and Locutus did not react properly. The drops were not decisive, but were cost-effective.

Drops!

Both sides maxed their supply, or nearly so. At that point, Locutus had better upgrades but Simplicity had a larger army. Locutus could not keep its natural safe. Luckily for protoss, it was already mined out.

Mass battles!

But Locutus had a stronger economy with more bases and a large bank of resources, and Simplicity ran out of resources. The desync hides the end of the game, which timed out after an hour. I believe that Locutus wiped out all zerg it could reach on the ground, and then had no answer for the island base. When the game timed out, BASIL gave the win to Simplicity on points. Moral: You need at least enough island skills to make air units to attack inaccessible bases.

new bot ZNZZBot

New protoss ZNZZBot was uploaded to SSCAIT today. It has no apparent connection with ZZZKBot. Quick analysis shows that it is descended from Locutus, but its binary is twice the size of the current Locutus because ZNZZBot is still linked against the BWTA terrain library. I conclude that ZNZZBot was forked from an earlier Locutus, or from an earlier descendent of Locutus.

The bot’s author is given on SSCAIT as “znzz” and in its config file as “zzy”. I’m not sure whether that indicates an attachment to zealots, or fitful sleep.

In its first 5 games, all it has played so far on SSCAIT and BASIL, ZNZZBot scored a win over Krasi0 with the Locutus dragoon runby strategy, but also a loss against the much weaker opponent ICEbot where protoss showed poor macro and poor decisions. I glanced over a couple new openings defined in the config file, and found them a bit odd, perhaps not expertly designed.

That’s all I know so far. I expect we’ll find out more with time.

AIIDE 2019 - unknown maps tournament

The AIIDE 2019 unknown maps competition results are up. At first glance, the biggest surprise is that the ranking is extremely similar to the ranking in the main tournament. 10 bots chose to compete. The weakest players did not participate, so the winning rates for all bots are lower than in the main tournament.

The results for some reason don’t include a straight listing of the 5 maps used. They are (2) Polaris Rhapsody, (3) Longinus 2, (4) Arcadia 2, (4) Fighting Spirit, and (4) Roadkill. Fighting Spirit is of course familiar to SSCAIT participants. The first 4 maps are classics from the KESPA era (which ended in 2012) and Roadkill is a more recent design.

I know from test games that Steamhammer plays well on Arcadia. (I test Steamhammer on all kinds of maps as a regular thing.) I’m pleased to see that reflected in the map statistics. Other map preferences that stand out are that DaQin likes Polaris Rhapsody and dislikes Fighting Spirit, Microwave prefers Roadkill, and Iron had trouble on Roadkill.

I will analyze the unknown maps tournament, at least to some extent. I’m not sure exactly how. There’s a bit of an embarrassment of riches at the moment.

AIIDE 2019 - maps per player

I’m pleased with this one. This is the same data as yesterday, how each bot did against each other on each map, but organized by player rather than by map. If you’re a bot author, I think this is a better way to find out about strengths and weaknesses.

For example, the first table is from the point of view of Locutus. The percentages are Locutus’s win rates. The upset by DaQin on Aztec immediately stands out amid Locutus’s otherwise consistent results. I imagine that Bruce @ Locutus will examine those 10 games and perhaps find a bug that DaQin exploited. (Locutus played its cannons at ramp into zealot drop strategy in these games. It lost because cannons at the ramp are a poor defense when the outside is on higher ground—Aztec has low-ground main bases. Maybe a weakness in learning or preparation?)

LocutusoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
PurpleWave45%50%50%40%40%40%60%40%30%40%60%
BananaBrain89%100%100%80%100%100%80%70%100%70%90%
DaQin83%100%80%100%20%80%100%90%90%80%90%
Steamhammer97%90%100%100%90%100%90%100%100%100%100%
ZZZKBot99%100%100%100%100%100%100%100%90%100%100%
Microwave92%100%100%80%80%100%90%90%90%90%100%
Iron99%100%100%100%100%100%90%100%100%100%100%
XiaoYi96%100%100%100%90%70%100%100%100%100%100%
McRave99%100%100%100%100%100%100%100%90%100%100%
UAlbertaBot99%100%100%100%100%100%100%100%90%100%100%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR99%100%100%100%100%100%100%100%90%100%100%
overall91.42%95%94%92%85%91%92%91%89%90%95%


PurpleWaveoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus55%50%50%60%60%60%40%60%70%60%40%
BananaBrain44%80%70%80%50%60%10%40%20%0%30%
DaQin85%80%70%100%100%70%80%100%100%70%80%
Steamhammer71%90%100%70%40%60%80%60%70%90%50%
ZZZKBot100%100%100%100%100%100%100%100%100%100%100%
Microwave93%100%90%90%100%90%90%90%90%90%100%
Iron98%100%100%90%100%100%100%100%100%100%90%
XiaoYi97%90%100%100%100%100%90%100%90%100%100%
McRave89%100%90%100%100%90%80%100%70%70%90%
UAlbertaBot98%100%100%100%100%100%100%78%100%100%100%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR97%100%90%90%100%100%100%100%90%100%100%
overall85.54%91%88%90%88%86%81%86%83%82%82%


BananaBrainoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus11%0%0%20%0%0%20%30%0%30%10%
PurpleWave56%20%30%20%50%40%90%60%80%100%70%
DaQin51%30%40%60%80%50%30%60%60%60%40%
Steamhammer85%100%70%90%80%80%70%100%100%70%90%
ZZZKBot83%90%100%70%80%70%90%100%70%90%70%
Microwave71%90%70%90%70%60%70%60%80%60%60%
Iron59%40%70%50%60%60%70%80%50%70%40%
XiaoYi57%40%80%40%50%50%40%80%40%80%70%
McRave69%70%60%90%70%50%80%70%70%70%60%
UAlbertaBot84%80%90%80%90%80%90%80%89%90%70%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR100%100%100%100%100%100%100%100%100%100%100%
overall68.81%63%68%68%69%62%71%77%70%77%65%


DaQinoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus17%0%20%0%80%20%0%10%10%20%10%
PurpleWave15%20%30%0%0%30%20%0%0%30%20%
BananaBrain49%70%60%40%20%50%70%40%40%40%60%
Steamhammer94%100%100%90%100%100%100%100%70%90%90%
ZZZKBot10%10%20%10%10%10%20%10%0%10%0%
Microwave83%90%60%60%90%100%80%90%100%80%80%
Iron92%100%90%100%90%100%90%100%80%70%100%
XiaoYi82%100%100%90%100%90%60%70%60%60%90%
McRave41%40%60%40%40%20%50%30%40%30%60%
UAlbertaBot78%70%100%80%90%70%80%80%70%60%80%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR99%100%100%100%90%100%100%100%100%100%100%
overall63.33%67%70%59%68%66%64%61%56%57%66%


SteamhammeroverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus3%10%0%0%10%0%10%0%0%0%0%
PurpleWave29%10%0%30%60%40%20%40%30%10%50%
BananaBrain15%0%30%10%20%20%30%0%0%30%10%
DaQin6%0%0%10%0%0%0%0%30%10%10%
ZZZKBot59%40%60%80%80%40%50%40%60%50%90%
Microwave25%10%30%50%30%30%20%40%20%10%10%
Iron67%70%90%100%40%40%90%60%60%100%20%
XiaoYi50%30%60%50%20%10%80%50%80%60%60%
McRave86%100%90%100%100%70%100%90%90%40%80%
UAlbertaBot91%90%90%90%89%80%90%89%90%100%100%
AITP97%90%100%90%100%100%90%100%100%100%100%
BunkerBoxeR100%100%100%100%100%100%100%100%100%100%100%
overall52.25%46%54%59%54%44%57%50%55%51%52%


ZZZKBotoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus1%0%0%0%0%0%0%0%10%0%0%
PurpleWave0%0%0%0%0%0%0%0%0%0%0%
BananaBrain17%10%0%30%20%30%10%0%30%10%30%
DaQin90%90%80%90%90%90%80%90%100%90%100%
Steamhammer41%60%40%20%20%60%50%60%40%50%10%
Microwave44%50%0%60%40%50%50%50%60%30%50%
Iron55%0%50%60%30%50%100%50%80%50%80%
XiaoYi49%60%90%70%10%20%60%40%20%70%50%
McRave67%70%70%50%80%40%30%80%80%90%80%
UAlbertaBot90%90%80%90%100%90%90%70%100%90%100%
AITP72%70%60%60%90%80%20%70%90%90%90%
BunkerBoxeR99%100%100%100%100%100%90%100%100%100%100%
overall52.08%50%48%52%48%51%48%51%59%56%57%


MicrowaveoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus8%0%0%20%20%0%10%10%10%10%0%
PurpleWave7%0%10%10%0%10%10%10%10%10%0%
BananaBrain29%10%30%10%30%40%30%40%20%40%40%
DaQin17%10%40%40%10%0%20%10%0%20%20%
Steamhammer75%90%70%50%70%70%80%60%80%90%90%
ZZZKBot56%50%100%40%60%50%50%50%40%70%50%
Iron13%0%0%10%10%0%20%50%20%10%10%
XiaoYi65%60%80%70%60%80%40%80%60%30%90%
McRave64%60%80%100%70%50%60%70%60%30%60%
UAlbertaBot82%60%100%90%60%80%60%80%90%100%100%
AITP93%90%90%70%100%100%90%100%100%100%90%
BunkerBoxeR99%100%100%100%90%100%100%100%100%100%100%
overall50.67%44%58%51%48%48%48%55%49%51%54%


IronoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus1%0%0%0%0%0%10%0%0%0%0%
PurpleWave2%0%0%10%0%0%0%0%0%0%10%
BananaBrain41%60%30%50%40%40%30%20%50%30%60%
DaQin8%0%10%0%10%0%10%0%20%30%0%
Steamhammer33%30%10%0%60%60%10%40%40%0%80%
ZZZKBot45%100%50%40%70%50%0%50%20%50%20%
Microwave87%100%100%90%90%100%80%50%80%90%90%
XiaoYi26%10%50%0%50%20%40%20%30%40%0%
McRave65%70%80%80%80%80%70%50%40%40%60%
UAlbertaBot90%100%90%100%90%90%90%60%90%90%100%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR93%100%100%80%80%100%90%100%90%90%100%
overall49.25%56%52%46%56%53%44%41%47%47%52%


XiaoYioverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus4%0%0%0%10%30%0%0%0%0%0%
PurpleWave3%10%0%0%0%0%10%0%10%0%0%
BananaBrain43%60%20%60%50%50%60%20%60%20%30%
DaQin18%0%0%10%0%10%40%30%40%40%10%
Steamhammer50%70%40%50%80%90%20%50%20%40%40%
ZZZKBot51%40%10%30%90%80%40%60%80%30%50%
Microwave35%40%20%30%40%20%60%20%40%70%10%
Iron74%90%50%100%50%80%60%80%70%60%100%
McRave36%40%10%50%30%40%30%40%30%60%30%
UAlbertaBot73%44%60%90%80%80%75%60%89%89%60%
AITP100%100%100%100%100%100%100%100%100%100%100%
BunkerBoxeR98%100%100%100%90%100%100%100%90%100%100%
overall48.62%50%34%52%52%57%49%47%52%50%44%


McRaveoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus1%0%0%0%0%0%0%0%10%0%0%
PurpleWave11%0%10%0%0%10%20%0%30%30%10%
BananaBrain31%30%40%10%30%50%20%30%30%30%40%
DaQin59%60%40%60%60%80%50%70%60%70%40%
Steamhammer14%0%10%0%0%30%0%10%10%60%20%
ZZZKBot33%30%30%50%20%60%70%20%20%10%20%
Microwave36%40%20%0%30%50%40%30%40%70%40%
Iron35%30%20%20%20%20%30%50%60%60%40%
XiaoYi64%60%90%50%70%60%70%60%70%40%70%
UAlbertaBot43%40%60%50%10%40%30%20%70%40%70%
AITP82%80%70%60%100%90%80%80%100%100%60%
BunkerBoxeR71%70%80%70%50%80%70%70%80%70%70%
overall40.00%37%39%31%32%48%40%37%48%48%40%


UAlbertaBotoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus1%0%0%0%0%0%0%0%10%0%0%
PurpleWave2%0%0%0%0%0%0%22%0%0%0%
BananaBrain16%20%10%20%10%20%10%20%11%10%30%
DaQin22%30%0%20%10%30%20%20%30%40%20%
Steamhammer9%10%10%10%11%20%10%11%10%0%0%
ZZZKBot10%10%20%10%0%10%10%30%0%10%0%
Microwave18%40%0%10%40%20%40%20%10%0%0%
Iron10%0%10%0%10%10%10%40%10%10%0%
XiaoYi27%56%40%10%20%20%25%40%11%11%40%
McRave57%60%40%50%90%60%70%80%30%60%30%
AITP75%89%80%50%78%90%70%33%90%70%100%
BunkerBoxeR89%70%90%90%80%90%100%80%100%100%90%
overall28.04%31%25%22%29%31%31%33%27%26%25%


AITPoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus0%0%0%0%0%0%0%0%0%0%0%
PurpleWave0%0%0%0%0%0%0%0%0%0%0%
BananaBrain0%0%0%0%0%0%0%0%0%0%0%
DaQin0%0%0%0%0%0%0%0%0%0%0%
Steamhammer3%10%0%10%0%0%10%0%0%0%0%
ZZZKBot28%30%40%40%10%20%80%30%10%10%10%
Microwave7%10%10%30%0%0%10%0%0%0%10%
Iron0%0%0%0%0%0%0%0%0%0%0%
XiaoYi0%0%0%0%0%0%0%0%0%0%0%
McRave18%20%30%40%0%10%20%20%0%0%40%
UAlbertaBot25%11%20%50%22%10%30%67%10%30%0%
BunkerBoxeR59%30%20%70%40%70%100%80%60%50%70%
overall11.62%9%10%20%6%9%21%16%7%8%11%


BunkerBoxeRoverallBenzenDestinHeartbAztecTauCroAndromCircuiEmpireFortrePython
Locutus1%0%0%0%0%0%0%0%10%0%0%
PurpleWave3%0%10%10%0%0%0%0%10%0%0%
BananaBrain0%0%0%0%0%0%0%0%0%0%0%
DaQin1%0%0%0%10%0%0%0%0%0%0%
Steamhammer0%0%0%0%0%0%0%0%0%0%0%
ZZZKBot1%0%0%0%0%0%10%0%0%0%0%
Microwave1%0%0%0%10%0%0%0%0%0%0%
Iron7%0%0%20%20%0%10%0%10%10%0%
XiaoYi2%0%0%0%10%0%0%0%10%0%0%
McRave29%30%20%30%50%20%30%30%20%30%30%
UAlbertaBot11%30%10%10%20%10%0%20%0%0%10%
AITP41%70%80%30%60%30%0%20%40%50%30%
overall8.08%11%10%8%15%5%4%6%8%8%6%

The zergs and terrans seem more sensitive to the map than protoss. For example, Locutus vs PurpleWave win rates vary from 30% to 60%, which could be entirely due to statistical fluctuation, while ZZZKBot vs Iron ranges from 0% to 100%, which is not random. I imagine that ZZZKBot’s map selectivity has to do with its learning algorithm. But overall, there are many cases where the map seems to make a difference against opponents of similar strength. I think bots will benefit from more sensitivity to the map design.

AIIDE 2019 - per-map crosstables

A separate crosstable for each of the 10 maps. Most cells have only 10 games in them (some have fewer because of unsuccessful games), so the numbers are noisy. Nevertheless, I think the tables are full of insights—so full that it’s easy to be overwhelmed. I left the game counts out of the cells to make the tables more compact, so they are easier to compare.

Watch how ZZZKBot versus Iron varies strongly depending on the map.

(2) Benzene

PurpleWave’s favorite map. Is that because of Purple pathfinding skills? But Locutus liked the map too.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus95.00%50%100%100%90%100%100%100%100%100%100%100%100%
2PurpleWave90.83%50%80%80%90%100%100%100%90%100%100%100%100%
3BananaBrain63.33%0%20%30%100%90%90%40%40%70%80%100%100%
4DaQin66.67%0%20%70%100%10%90%100%100%40%70%100%100%
5Steamhammer45.83%10%10%0%0%40%10%70%30%100%90%90%100%
6ZZZKBot50.00%0%0%10%90%60%50%0%60%70%90%70%100%
7Microwave44.17%0%0%10%10%90%50%0%60%60%60%90%100%
8Iron55.83%0%0%60%0%30%100%100%10%70%100%100%100%
9XiaoYi49.58%0%10%60%0%70%40%40%90%40%44%100%100%
10McRave36.67%0%0%30%60%0%30%40%30%60%40%80%70%
11UAlbertaBot31.36%0%0%20%30%10%10%40%0%56%60%89%70%
12AITP9.24%0%0%0%0%10%30%10%0%0%20%11%30%
13BunkerBoxeR10.83%0%0%0%0%0%0%0%0%0%30%30%70%

(2) Destination

Key area on the map: Over the wall behind the enemy natural. Build an e-bay there and send tanks. Float the e-bay and siege the tanks, maybe add turrets for air defense. How many defending bots would survive? XiaoYi suffered badly on this map, but that’s not why.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus94.17%50%100%80%100%100%100%100%100%100%100%100%100%
2PurpleWave88.33%50%70%70%100%100%90%100%100%90%100%100%90%
3BananaBrain67.50%0%30%40%70%100%70%70%80%60%90%100%100%
4DaQin70.00%20%30%60%100%20%60%90%100%60%100%100%100%
5Steamhammer54.17%0%0%30%0%60%30%90%60%90%90%100%100%
6ZZZKBot47.50%0%0%0%80%40%0%50%90%70%80%60%100%
7Microwave58.33%0%10%30%40%70%100%0%80%80%100%90%100%
8Iron51.67%0%0%30%10%10%50%100%50%80%90%100%100%
9XiaoYi34.17%0%0%20%0%40%10%20%50%10%60%100%100%
10McRave39.17%0%10%40%40%10%30%20%20%90%60%70%80%
11UAlbertaBot25.00%0%0%10%0%10%20%0%10%40%40%80%90%
12AITP10.00%0%0%0%0%0%40%10%0%0%30%20%20%
13BunkerBoxeR10.00%0%10%0%0%0%0%0%0%0%20%10%80%

(2) Heartbreak Ridge

It’s a tricky map, but bots don’t seem to realize that. Steamhammer liked it a bit and Iron disliked it, but no bot stood out as particularly loving or hating it.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus91.67%40%80%100%100%100%80%100%100%100%100%100%100%
2PurpleWave90.00%60%80%100%70%100%90%90%100%100%100%100%90%
3BananaBrain67.50%20%20%60%90%70%90%50%40%90%80%100%100%
4DaQin59.17%0%0%40%90%10%60%100%90%40%80%100%100%
5Steamhammer59.17%0%30%10%10%80%50%100%50%100%90%90%100%
6ZZZKBot52.50%0%0%30%90%20%60%60%70%50%90%60%100%
7Microwave50.83%20%10%10%40%50%40%10%70%100%90%70%100%
8Iron45.83%0%10%50%0%0%40%90%0%80%100%100%80%
9XiaoYi51.67%0%0%60%10%50%30%30%100%50%90%100%100%
10McRave30.83%0%0%10%60%0%50%0%20%50%50%60%70%
11UAlbertaBot22.50%0%0%20%20%10%10%10%0%10%50%50%90%
12AITP20.00%0%0%0%0%10%40%30%0%0%40%50%70%
13BunkerBoxeR8.33%0%10%0%0%0%0%0%20%0%30%10%30%

(3) Aztec

A 3-player map with low-ground main bases. I like this map. DaQin liked it too, since it upset Locutus, unlike on any other map.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus85.00%40%100%20%90%100%80%100%90%100%100%100%100%
2PurpleWave87.50%60%50%100%40%100%100%100%100%100%100%100%100%
3BananaBrain69.17%0%50%80%80%80%70%60%50%70%90%100%100%
4DaQin67.50%80%0%20%100%10%90%90%100%40%90%100%90%
5Steamhammer53.78%10%60%20%0%80%30%40%20%100%89%100%100%
6ZZZKBot48.33%0%0%20%90%20%40%30%10%80%100%90%100%
7Microwave48.33%20%0%30%10%70%60%10%60%70%60%100%90%
8Iron55.83%0%0%40%10%60%70%90%50%80%90%100%80%
9XiaoYi51.67%10%0%50%0%80%90%40%50%30%80%100%90%
10McRave32.50%0%0%30%60%0%20%30%20%70%10%100%50%
11UAlbertaBot28.81%0%0%10%10%11%0%40%10%20%90%78%80%
12AITP5.88%0%0%0%0%0%10%0%0%0%0%22%40%
13BunkerBoxeR15.00%0%0%0%10%0%0%10%20%10%50%20%60%

(3) Tau Cross

Bases beyond the natural are open to attack. I think that is why Steamhammer had trouble. It was XiaoYi’s best map.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus90.83%40%100%80%100%100%100%100%70%100%100%100%100%
2PurpleWave85.83%60%60%70%60%100%90%100%100%90%100%100%100%
3BananaBrain61.67%0%40%50%80%70%60%60%50%50%80%100%100%
4DaQin65.83%20%30%50%100%10%100%100%90%20%70%100%100%
5Steamhammer44.17%0%40%20%0%40%30%40%10%70%80%100%100%
6ZZZKBot50.83%0%0%30%90%60%50%50%20%40%90%80%100%
7Microwave48.33%0%10%40%0%70%50%0%80%50%80%100%100%
8Iron53.33%0%0%40%0%60%50%100%20%80%90%100%100%
9XiaoYi56.67%30%0%50%10%90%80%20%80%40%80%100%100%
10McRave47.50%0%10%50%80%30%60%50%20%60%40%90%80%
11UAlbertaBot30.83%0%0%20%30%20%10%20%10%20%60%90%90%
12AITP9.17%0%0%0%0%0%20%0%0%0%10%10%70%
13BunkerBoxeR5.00%0%0%0%0%0%0%0%0%0%20%10%30%

(4) Andromeda

A bot that understands when to take the in-base mineral-only gains an edge. But so would a bot which understands how to attack it from outside, not as common a skill.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus92.50%60%80%100%90%100%90%90%100%100%100%100%100%
2PurpleWave80.83%40%10%80%80%100%90%100%90%80%100%100%100%
3BananaBrain70.83%20%90%30%70%90%70%70%40%80%90%100%100%
4DaQin64.17%0%20%70%100%20%80%90%60%50%80%100%100%
5Steamhammer56.67%10%20%30%0%50%20%90%80%100%90%90%100%
6ZZZKBot48.33%0%0%10%80%50%50%100%60%30%90%20%90%
7Microwave47.50%10%10%30%20%80%50%20%40%60%60%90%100%
8Iron44.17%10%0%30%10%10%0%80%40%70%90%100%90%
9XiaoYi49.15%0%10%60%40%20%40%60%60%30%75%100%100%
10McRave40.00%0%20%20%50%0%70%40%30%70%30%80%70%
11UAlbertaBot30.51%0%0%10%20%10%10%40%10%25%70%70%100%
12AITP20.83%0%0%0%0%10%80%10%0%0%20%30%100%
13BunkerBoxeR4.17%0%0%0%0%0%10%0%10%0%30%0%0%

(4) Circuit Breaker

Iron was unhappy with this map, though to me it seems like a good map for Iron’s skills.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus90.83%40%70%90%100%100%90%100%100%100%100%100%100%
2PurpleWave85.71%60%40%100%60%100%90%100%100%100%78%100%100%
3BananaBrain76.67%30%60%60%100%100%60%80%80%70%80%100%100%
4DaQin60.83%10%0%40%100%10%90%100%70%30%80%100%100%
5Steamhammer50.42%0%40%0%0%40%40%60%50%90%89%100%100%
6ZZZKBot50.83%0%0%0%90%60%50%50%40%80%70%70%100%
7Microwave55.00%10%10%40%10%60%50%50%80%70%80%100%100%
8Iron40.83%0%0%20%0%40%50%50%20%50%60%100%100%
9XiaoYi46.67%0%0%20%30%50%60%20%80%40%60%100%100%
10McRave36.67%0%0%30%70%10%20%30%50%60%20%80%70%
11UAlbertaBot33.33%0%22%20%20%11%30%20%40%40%80%33%80%
12AITP15.97%0%0%0%0%0%30%0%0%0%20%67%80%
13BunkerBoxeR5.83%0%0%0%0%0%0%0%0%0%30%20%20%

(4) Empire of the Sun

ZZZKBot’s favorite map.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus89.17%30%100%90%100%90%90%100%100%90%90%100%90%
2PurpleWave83.05%70%20%100%70%100%90%100%90%70%100%100%90%
3BananaBrain69.75%0%80%60%100%70%80%50%40%70%89%100%100%
4DaQin55.83%10%0%40%70%0%100%80%60%40%70%100%100%
5Steamhammer55.00%0%30%0%30%60%20%60%80%90%90%100%100%
6ZZZKBot59.17%10%0%30%100%40%60%80%20%80%100%90%100%
7Microwave49.17%10%10%20%0%80%40%20%60%60%90%100%100%
8Iron46.67%0%0%50%20%40%20%80%30%40%90%100%90%
9XiaoYi52.10%0%10%60%40%20%80%40%70%30%89%100%90%
10McRave48.33%10%30%30%60%10%20%40%60%70%70%100%80%
11UAlbertaBot26.72%10%0%11%30%10%0%10%10%11%30%90%100%
12AITP6.67%0%0%0%0%0%10%0%0%0%0%10%60%
13BunkerBoxeR8.33%10%10%0%0%0%0%0%10%10%20%0%40%

(4) Fortress

Fortress has corner bases that can be reached either by air, or by workers which mineral-walk through a gate. I have yet to see a bot that can take advantage of the corner bases. I'll be watching replays to see if I can find one. BananaBrain did well on this map, it's a candidate.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus90.00%40%70%80%100%100%90%100%100%100%100%100%100%
2PurpleWave81.67%60%0%70%90%100%90%100%100%70%100%100%100%
3BananaBrain76.67%30%100%60%70%90%60%70%80%70%90%100%100%
4DaQin57.50%20%30%40%90%10%80%70%60%30%60%100%100%
5Steamhammer50.83%0%10%30%10%50%10%100%60%40%100%100%100%
6ZZZKBot55.83%0%0%10%90%50%30%50%70%90%90%90%100%
7Microwave50.83%10%10%40%20%90%70%10%30%30%100%100%100%
8Iron46.67%0%0%30%30%0%50%90%40%40%90%100%90%
9XiaoYi50.42%0%0%20%40%40%30%70%60%60%89%100%100%
10McRave48.33%0%30%30%70%60%10%70%60%40%40%100%70%
11UAlbertaBot26.05%0%0%10%40%0%10%0%10%11%60%70%100%
12AITP7.50%0%0%0%0%0%10%0%0%0%0%30%50%
13BunkerBoxeR7.50%0%0%0%0%0%0%0%10%0%30%0%50%

(4) Python

Python is a grand old classic, a largely successful attempt to redesign Lost Temple without all the imbalances. It has 2 island bases.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus95.00%60%90%90%100%100%100%100%100%100%100%100%100%
2PurpleWave81.51%40%30%80%50%100%100%90%100%90%100%100%100%
3BananaBrain65.00%10%70%40%90%70%60%40%70%60%70%100%100%
4DaQin65.83%10%20%60%90%0%80%100%90%60%80%100%100%
5Steamhammer52.50%0%50%10%10%90%10%20%60%80%100%100%100%
6ZZZKBot57.50%0%0%30%100%10%50%80%50%80%100%90%100%
7Microwave54.17%0%0%40%20%90%50%10%90%60%100%90%100%
8Iron51.67%0%10%60%0%80%20%90%0%60%100%100%100%
9XiaoYi44.17%0%0%30%10%40%50%10%100%30%60%100%100%
10McRave40.00%0%10%40%40%20%20%40%40%70%70%60%70%
11UAlbertaBot25.42%0%0%30%20%0%0%0%0%40%30%100%90%
12AITP10.92%0%0%0%0%0%10%10%0%0%40%0%70%
13BunkerBoxeR5.83%0%0%0%0%0%0%0%0%0%30%10%30%

Next: I want to present the same information in a different format that I hope will be easier to draw lessons from.

AIIDE 2019 - race balance

The CoG results file is troublesome, so I’m analyzing AIIDE first after all. The purpose of a plan, after all, is not to be executed, but to be changed; contact with the enemy and all that. This year’s AIIDE detailed_results.txt file was easy to read and interpret. I only needed a couple small changes from last year’s script.

Here is my version of the crosstable. It is identical to the official crosstable, so it doesn’t include any new information. If somebody wants it, I can also post my version of the per-map results, but that doesn’t include any new information either.

#botoverallLocuPurpBanaDaQiSteaZZZKMicrIronXiaoMcRaUAlbAITPBunk
1Locutus91.42%45%
45/100
89%
89/100
83%
83/100
97%
97/100
99%
99/100
92%
92/100
99%
99/100
96%
96/100
99%
99/100
99%
99/100
100%
100/100
99%
99/100
2PurpleWave85.54%55%
55/100
44%
44/100
85%
85/100
71%
71/100
100%
100/100
93%
93/100
98%
98/100
97%
97/100
89%
89/100
98%
94/96
100%
100/100
97%
97/100
3BananaBrain68.81%11%
11/100
56%
56/100
51%
51/100
85%
85/100
83%
83/100
71%
71/100
59%
59/100
57%
57/100
69%
69/100
84%
83/99
100%
100/100
100%
100/100
4DaQin63.33%17%
17/100
15%
15/100
49%
49/100
94%
94/100
10%
10/100
83%
83/100
92%
92/100
82%
82/100
41%
41/100
78%
78/100
100%
100/100
99%
99/100
5Steamhammer52.25%3%
3/100
29%
29/100
15%
15/100
6%
6/100
59%
59/100
25%
25/100
67%
67/100
50%
50/100
86%
86/100
91%
89/98
97%
97/100
100%
100/100
6ZZZKBot52.08%1%
1/100
0%
0/100
17%
17/100
90%
90/100
41%
41/100
44%
44/100
55%
55/100
49%
49/100
67%
67/100
90%
90/100
72%
72/100
99%
99/100
7Microwave50.67%8%
8/100
7%
7/100
29%
29/100
17%
17/100
75%
75/100
56%
56/100
13%
13/100
65%
65/100
64%
64/100
82%
82/100
93%
93/100
99%
99/100
8Iron49.25%1%
1/100
2%
2/100
41%
41/100
8%
8/100
33%
33/100
45%
45/100
87%
87/100
26%
26/100
65%
65/100
90%
90/100
100%
100/100
93%
93/100
9XiaoYi48.62%4%
4/100
3%
3/100
43%
43/100
18%
18/100
50%
50/100
51%
51/100
35%
35/100
74%
74/100
36%
36/100
73%
69/95
100%
100/100
98%
98/100
10McRave40.00%1%
1/100
11%
11/100
31%
31/100
59%
59/100
14%
14/100
33%
33/100
36%
36/100
35%
35/100
64%
64/100
43%
43/100
82%
82/100
71%
71/100
11UAlbertaBot28.04%1%
1/100
2%
2/96
16%
16/99
22%
22/100
9%
9/98
10%
10/100
18%
18/100
10%
10/100
27%
26/95
57%
57/100
75%
72/96
89%
89/100
12AITP11.62%0%
0/100
0%
0/100
0%
0/100
0%
0/100
3%
3/100
28%
28/100
7%
7/100
0%
0/100
0%
0/100
18%
18/100
25%
24/96
59%
59/100
13BunkerBoxeR8.08%1%
1/100
3%
3/100
0%
0/100
1%
1/100
0%
0/100
1%
1/100
1%
1/100
7%
7/100
2%
2/100
29%
29/100
11%
11/100
41%
41/100

The race balance is not too interesting this year. In the crosstable, we see protoss at the top, zerg grouped in the middle, and mostly terran on the bottom, so we don’t need numbers to judge the race balance. But here’s the table anyway. The random row and the versus-random column are the least interesting of all, because UAlbertaBot was the only random player.

overallvTvPvZvR
terran29%14%28%50%
protoss70%86%71%80%
zerg52%72%29%88%
random28%50%20%12%

And here’s the breakdown of how each bot performed against each race. The most surprising results are that Steamhammer did poorly against these specific 2 zerg opponents, although ZvZ is in general its strongest matchup, and that weaker participants UAlbertaBot and BunkerBoxeR somehow scored higher against mighty protoss than against middling zerg. In the crosstable above, we can see the matchups which were responsible for the surprises.

#botraceoverallvTvPvZvR
1Locutusprotoss91.42%98%79%96%99%
2PurpleWaveprotoss85.54%98%68%88%98%
3BananaBrainprotoss68.81%79%47%80%84%
4DaQinprotoss63.33%93%30%62%78%
5Steamhammerzerg52.25%78%28%42%91%
6ZZZKBotzerg52.08%69%35%42%90%
7Microwavezerg50.67%68%25%66%82%
8Ironterran49.25%73%23%55%90%
9XiaoYiterran48.62%91%21%45%73%
10McRaveprotoss40.00%63%26%28%43%
11UAlbertaBotrandom28.04%50%20%12%-
12AITPterran11.62%20%4%13%25%
13BunkerBoxeRterran8.08%17%7%1%11%

We also see that XiaoYi annihilated terran opponents, even though it came in a little below Iron overall. Comparing to last year’s results, XiaoYi’s parent bot SAIDA wiped the floor with terrans even harder.

Next: The voluminous per-map crosstables.