I meant to summarize McRave’s learning data today, but to know what to put in the tables I had to understand how the numbers are used. Yesterday I examined McRave’s strategy representation with three elements, like “PoolHatch,Overpool,2HatchMuta”. In the code, the elements are named “build” (like PoolHatch), “opener” (like Overpool) and “transition” (like 2HatchMuta). Today I read the code to see what the numbers in the learning files are and how they are used.
Here’s a sample data file, showing McRave doing well versus Steamhammer. The first two numbers are the overall wins and losses. After that, delimited by dashes, is a section for the first build, followed by a section for the openers of that build and a section for the transitions of the build. Then more sections for the other two builds and their appendages. Each element has an independent count of wins and losses.
The code calls a function to check which triples are allowed and deals with other minor details, but even with the fiddly bits it’s simple: It picks the build with the highest UCB value, then given that build the corresponding opener with the highest UCB value, then given that build and opener the transition with the highest UCB value. Because of how the data file is organized, this can be done in one pass. The code is in the file LearningManager.cpp in the nested function parseLearningFile().
In theory, this three-level hierarchy could speed up learning. For example, you might be able to conclude that PoolHatch is better than PoolLair against some opponent, even if you don’t have enough data to know which PoolHatch opener or transition is best. My intuition is that the hierarchical scheme should on average work better than a flat scheme, but that there will be perverse situations where it does worse. Many of the triples are not allowed, which limits the value of the hierarchy. There should be enough data from this tournament to judge whether the hierarchy brought an advantage; it would be interesting to do the analysis.
Next: OK, now I know what tables to generate. I have to add some features to my script, but soon I should be able to post the summary tables.
McRave lists its strategy choices with three names, such as “PoolLair,9Pool,1HatchMuta.” In trying to understand what McRave learned, I myself learned more about what the 3 names mean: They are chosen from a small structured set of composable elements which are strung together into full strategies. Here is the scheme:
I made up the numbering to depict how the elements fit together, as I understand it: First you pick a top-level category of builds, 1 2 or 3. Say you pick 2, spawning pool then hatchery. Under that, you pick a concrete build order that implements the top-level category, 2.1.x, from the list of ways that McRave knows to make a spawning pool first. After that—not under it—you pick a followup strategy, 2.2.x, from the strategies that are reachable via that category of builds. Notice that 9Pool appears under both PoolHatch and PoolLair (both are pool first), and that 2HatchMuta appears under both HatchPool and PoolHatch (all you need are 2 hatcheries). I count 15 different possible strategies in this scheme, 2 under HatchPool, 12 under PoolHatch, and 1 under PoolLair.
In principle, combinatorial schemes like this can represent a huge number of strategies with a small number of building blocks. Adding the one new item of 2.2.4 2HatchLurker would add 4 new strategies, though they might not all make sense in games. Having separate elements could also give a learning algorithm clues about how to generalize its findings.
In practice, McRave does not play all the strategies it can represent. It appears to have tight restrictions based on matchup. This list is based on the strategies that are mentioned in the learning files, not on code analysis, so it might be incomplete or misleading.
• ZvT: HatchPool-12Hatch or PoolHatch-Overpool or PoolHatch-12Pool, then for any of those, 2HatchMuta or 2HatchSpeedling.
• ZvP: PoolHatch-Overpool or PoolHatch-12Pool, then 2HatchMuta or (rarely) 2HatchSpeedling.
• ZvZ: PoolHatch-12Pool then 2HatchMuta or 2HatchSpeedling, or PoolLair-9Pool-1HatchMuta.
• ZvR: PoolHatch-Overpool or PoolHatch-12Pool, then 2HatchMuta or 2HatchSpeedling.
Next: Tables showing what strategy choices McRave learned.
Dragon’s learning file format is spare, one line for each game giving strategy name and win or loss, nothing more. Dragon has 7 strategies, and against most opponents tried all of them. Its habit is to keep with a winning strategy, trying others sporadically but generally switching when the current plan starts to fail.
Dragon calls its worker rush “dirty worker rush”. Perhaps we should get it together with Stone so it can learn a nice clean worker rush.
#1 stardust
opening
games
wins
first
last
1rax fe
16
6%
6
147
2rax bio
18
6%
2
143
2rax mech
14
0%
0
148
bio
26
8%
4
149
dirty worker rush
23
13%
1
114
mass vulture
40
10%
3
144
siege expand
13
0%
5
145
7 openings
150
7%
As you can see in the “first” column (the first game each strategy was played), Dragon tried all 7 strategies in the first 7 games because they all lost on their first tries. Worker rush turned out to be the most successful plan, as far as that goes, which is very interesting. Mass vultures were the most-played plan despite not having the highest win rate, apparently because the worker rush had a string of losses so that vultures looked better in recent games. (Maybe Dragon figured that Stardust had learned how to deal with the worker rush.)
How did mass vultures have any chance against Stardust’s dragoons? I located a couple of the “mass vulture” wins and watched them. In fact, tanks were the core of Dragon’s army and the vultures acted as buffer. It looked like regular tank-vulture unit mix with regular tank pushes.
#2 purplewave
opening
games
wins
first
last
1rax fe
36
64%
9
83
2rax bio
7
43%
4
101
2rax mech
3
0%
19
129
bio
16
50%
3
100
dirty worker rush
3
0%
0
102
mass vulture
32
62%
20
146
siege expand
50
58%
1
128
7 openings
147
56%
Against PurpleWave, and BananaBrain below, most Dragon strategies worked about equally well. Apparently it has well-balanced play against protoss. Actually I think the explanation may be different: Once the opening is over, Dragon quickly adapts to the enemy, playing against the units it sees. If I guess right, then its goal in the opening is to survive in a good position, and after that Dragon will produce whatever units it needs, so the opening doesn’t much affect the outcome. Obviously the worker rush doesn’t leave much room for adaptation, so it is an exception.
This hypothesis explains why Dragon can do well though it records so little data about each game: The openings often don’t much matter.
#3 bananabrain
opening
games
wins
first
last
1rax fe
14
57%
35
143
2rax bio
11
45%
22
139
2rax mech
15
47%
20
149
bio
37
59%
0
137
dirty worker rush
3
0%
23
146
mass vulture
56
61%
15
144
siege expand
14
50%
1
140
7 openings
150
55%
#5 mcrave
opening
games
wins
first
last
1rax fe
90
87%
11
146
2rax bio
14
64%
48
93
2rax mech
15
67%
51
82
bio
22
68%
0
66
dirty worker rush
1
0%
47
47
mass vulture
1
0%
7
7
siege expand
4
50%
8
12
7 openings
147
78%
Fast expand works versus McRave...
#6 microwave
opening
games
wins
first
last
1rax fe
3
0%
4
144
2rax bio
98
66%
0
148
2rax mech
5
20%
7
50
bio
13
46%
2
143
dirty worker rush
11
55%
8
31
mass vulture
3
0%
1
68
siege expand
16
44%
5
47
7 openings
149
57%
2 barracks is good against Microwave...
#7 steamhammer
opening
games
wins
first
last
1rax fe
37
32%
12
149
2rax bio
6
0%
11
108
2rax mech
12
33%
1
141
bio
9
11%
6
106
dirty worker rush
39
33%
10
140
mass vulture
30
37%
7
104
siege expand
17
24%
0
116
7 openings
150
30%
... but against Steamhammer, again, most strategies look about the same. Watching games, I think Dragon converges on a diverse unit mix fairly quickly after the opening.
I checked out a “mass vulture” game against Steamhammer, and it looked different from the same strategy against Stardust. Dragon made a modest number of vultures and researched spider mines, but added tanks and wraiths and soon the unit mix looked like most Dragon-Steamhammer games.
#8 daqin
opening
games
wins
first
last
1rax fe
49
67%
14
133
2rax bio
10
30%
6
132
2rax mech
23
57%
1
148
bio
5
20%
2
77
dirty worker rush
3
0%
0
78
mass vulture
45
53%
3
137
siege expand
14
43%
7
76
7 openings
149
54%
#9 zzzkbot
opening
games
wins
first
last
1rax fe
5
20%
0
71
2rax bio
10
40%
2
83
2rax mech
35
49%
24
99
bio
13
38%
25
113
dirty worker rush
4
0%
6
102
mass vulture
26
54%
4
149
siege expand
57
53%
27
148
7 openings
150
47%
Most curious: Against ZZZKBot, factory openings predominate. Checking the game durations, most games that ZZZKBot won were short, meaning that it played its 4 pool with success. Most games that Dragon won were longer, so either ZZZKBot did not 4 pool or else Dragon was slow to counterattack after surviving.
Microwave’s history files include both pre-training games and tournament games. I removed the pre-training games, and these tables show only tournament results. I looked at it both ways and decided this way was more informative. Yesterday’s table includes both prepared data and tournament games.
The enemy strategies listed in the form “HeavyRush -> SafeExpand” are the initially predicted and the later recognized enemy play, as explained by MicroDK in a comment. When they’re the same, the prediction was correct.
#1 stardust
opening
games
wins
first
last
10Hatch9Pool9gas
3
0%
60
107
10HatchMain9Pool9Gas
1
0%
133
133
12HatchMain
2
0%
14
49
12Pool
1
0%
110
110
12PoolMain
1
0%
121
121
12PoolMuta
2
0%
46
142
2HatchMuta
7
0%
20
98
3Hatch
3
0%
17
112
3HatchExpo
2
0%
43
57
3HatchHydra
1
0%
139
139
3HatchHydra_BHG
1
0%
38
38
3HatchLingBust
9
11%
24
144
3HatchMuta
36
0%
0
143
3HatchPoolHydra
7
0%
27
147
3HatchPoolHydraExpo
1
0%
114
114
4PoolHard
1
0%
123
123
4PoolSoft
2
0%
16
70
5HatchPoolHydra
18
0%
5
149
5Pool
2
0%
8
81
6Pool
2
0%
40
41
6PoolSpeed
4
0%
28
146
7Pool
1
0%
148
148
9Hatch9Pool9Gas
1
0%
134
134
9HatchMain8Pool8Gas
1
0%
117
117
9Pool
1
0%
15
15
9PoolGasHatchSpeed7D
1
0%
132
132
9PoolGasHatchSpeed8D
1
0%
3
3
9PoolHatchGasSpeed7D
1
0%
34
34
9PoolHatchGasSpeed8D
12
0%
6
138
9PoolHydra
1
0%
118
118
9PoolLurker
1
0%
95
95
9PoolSpeed
1
0%
137
137
9PoolSpeedLing
1
0%
58
58
9PoolSunkHatch
2
0%
71
105
9PoolSunken
1
0%
140
140
OverpoolLurker
1
0%
73
73
OverpoolSpeed
1
0%
116
116
OverpoolTurtle
1
0%
104
104
ZvP_10Hatch9Pool
2
0%
77
109
ZvP_11Hatch10Pool
1
0%
80
80
ZvP_2HatchHydra
2
0%
87
129
ZvP_9Hatch9Pool
2
0%
127
145
ZvZ_Overgas11Pool
2
0%
33
61
ZvZ_Overgas9Pool
2
0%
2
128
ZvZ_Overpool11Gas
2
0%
67
82
ZvZ_Overpool9Gas
1
0%
48
48
ZvZ_OverpoolTurtle
1
0%
122
122
47 openings
150
1%
enemy
games
wins
HeavyRush -> HeavyRush
127
1%
HeavyRush -> Unknown
21
0%
SafeExpand -> HeavyRush
2
0%
3 openings
150
1%
Stardust always plays the same strategy, so it’s no wonder that Microwave was able to predict it. Not that it helped. 3HatchMuta was tried repeatedly because it scored some wins in training.
#2 purplewave
opening
games
wins
first
last
10Hatch9Pool9gas
3
0%
4
122
11HatchTurtleHydra
3
0%
72
139
11HatchTurtleLurker
1
0%
57
57
12HatchMain
1
0%
44
44
12PoolMuta
11
18%
20
121
2HatchLurkerAllIn
1
0%
47
47
3HatchHydraBust
1
0%
40
40
3HatchHydra_BHG
1
0%
16
16
3HatchMuta
9
33%
26
149
3HatchMutaExpo
1
0%
17
17
3HatchPoolHydra
1
0%
94
94
4HatchPoolHydra
1
0%
56
56
4PoolHard
8
12%
7
147
6Pool
1
0%
55
55
6PoolSpeed
10
30%
32
135
7Pool
3
0%
38
86
7PoolHydraLingRush7D
1
0%
108
108
8PoolHydraRush8D
2
0%
19
49
9Hatch9Pool9Gas
1
0%
124
124
9HatchMain8Pool8Gas
8
25%
15
128
9Pool
2
0%
9
102
9PoolGasHatchSpeed7D
28
50%
0
142
9PoolHatchGasSpeed7D
17
65%
11
141
9PoolHatchGasSpeed8D
9
56%
114
146
9PoolSpeed
4
25%
1
54
9PoolSpeedLing
2
0%
60
119
9PoolSunkHatch
1
0%
109
109
9PoolSunken
1
0%
145
145
OverpoolSpeed
7
14%
23
143
OverpoolTurtle
6
17%
14
123
ZvP_10Hatch9Pool
1
0%
66
66
ZvP_2HatchHydra
1
0%
92
92
ZvP_9Hatch9Pool
2
0%
130
148
ZvZ_Overpool9Gas
1
0%
43
43
34 openings
150
29%
enemy
games
wins
HeavyRush -> HeavyRush
103
23%
HeavyRush -> NakedExpand
2
50%
HeavyRush -> SafeExpand
2
0%
HeavyRush -> Turtle
5
40%
HeavyRush -> Unknown
16
31%
NakedExpand -> HeavyRush
2
0%
SafeExpand -> HeavyRush
1
100%
SafeExpand -> SafeExpand
3
33%
SafeExpand -> Turtle
2
50%
Turtle -> HeavyRush
3
33%
Turtle -> NakedExpand
4
100%
Turtle -> SafeExpand
3
33%
Turtle -> Turtle
4
75%
13 openings
150
29%
PurpleWave opened with 2 gate most games. Microwave was able to predict it, but as we saw in UAlbertaBot’s table, the zealots are a Microwave weakness and PurpleWave was able to exploit it. Nevertheless, Microwave was no pushover. The more successful zerg tries were zergling openings, especially variants of the Styx build (9PoolHatchGasSpeed).
#3 bananabrain
opening
games
wins
first
last
10Hatch9Pool9gas
2
0%
4
20
10HatchMain9Pool9Gas
1
0%
5
5
11HatchTurtleHydra
1
0%
83
83
12Hatch
1
0%
60
60
12PoolMain
43
51%
37
139
12PoolMuta
1
0%
68
68
1HatchMuta_Sparkle
1
0%
65
65
2HatchMuta
5
20%
30
80
3HatchHydraBust
1
0%
109
109
3HatchHydra_BHG
1
0%
122
122
3HatchLingBust
6
33%
12
130
3HatchMuta
1
0%
11
11
3HatchPoolHydraExpo
1
0%
49
49
4HatchBeforeGas
1
0%
3
3
4HatchPoolHydra
2
0%
1
27
4PoolHard
6
33%
55
145
4PoolSoft
1
0%
108
108
6Pool
1
0%
81
81
7Pool
1
0%
13
13
8Pool
1
0%
53
53
8PoolHydraRush8D
1
0%
31
31
9PoolGasHatchSpeed8D
18
67%
70
149
9PoolHatchGasSpeed7D
1
0%
34
34
9PoolHatchGasSpeed8D
32
53%
0
146
9PoolSpeed
3
0%
25
147
9PoolSpeedLing
5
20%
7
123
9PoolSunkHatch
1
0%
142
142
Overpool
1
0%
127
127
OverpoolSpeed
3
0%
79
92
ZvP_10Hatch9Pool
3
33%
29
110
ZvP_11Hatch10Pool
1
0%
121
121
ZvZ_Overgas9Pool
1
0%
106
106
ZvZ_Overpool11Gas
2
0%
21
134
33 openings
150
39%
enemy
games
wins
HeavyRush -> HeavyRush
22
32%
HeavyRush -> NakedExpand
14
86%
HeavyRush -> SafeExpand
12
0%
HeavyRush -> Turtle
6
17%
HeavyRush -> Unknown
25
32%
NakedExpand -> HeavyRush
14
43%
NakedExpand -> NakedExpand
14
79%
NakedExpand -> SafeExpand
5
0%
NakedExpand -> Turtle
2
0%
NakedExpand -> Unknown
12
33%
SafeExpand -> HeavyRush
8
25%
SafeExpand -> NakedExpand
4
75%
SafeExpand -> SafeExpand
4
25%
SafeExpand -> Turtle
2
0%
SafeExpand -> Unknown
5
40%
Turtle -> NakedExpand
1
100%
16 openings
150
39%
BananaBrain is not predictable, and Microwave could not predict its play. Again, the more successful zerg builds were zergling openings.
#4 dragon
opening
games
wins
first
last
10HatchTurtleHydra
1
0%
131
131
11HatchTurtleLurker
1
0%
76
76
12PoolMain
1
0%
141
141
2HatchMuta
68
53%
1
148
3HatchHydraExpo
3
33%
122
135
3HatchMutaExpo
38
47%
0
144
4HatchPoolHydra
8
25%
73
136
4PoolSoft
18
28%
38
147
5HatchPoolHydra
5
60%
126
149
5PoolSpeed
1
0%
118
118
7PoolHydraLingRush7D
1
0%
78
78
9PoolHatchGasSpeed8D
1
0%
128
128
9PoolSunkHatch
1
0%
115
115
Overpool
1
0%
53
53
OverpoolLurker
1
0%
107
107
OverpoolTurtle
1
0%
62
62
16 openings
150
43%
enemy
games
wins
Factory -> Factory
18
56%
Factory -> HeavyRush
13
46%
Factory -> SafeExpand
2
0%
Factory -> Unknown
14
71%
Factory -> WorkerRush
3
33%
HeavyRush -> Factory
15
27%
HeavyRush -> HeavyRush
28
54%
HeavyRush -> NakedExpand
1
0%
HeavyRush -> SafeExpand
4
0%
HeavyRush -> Turtle
2
0%
HeavyRush -> Unknown
31
26%
NakedExpand -> HeavyRush
1
100%
SafeExpand -> HeavyRush
1
100%
SafeExpand -> Unknown
2
50%
WorkerRush -> Factory
2
50%
WorkerRush -> HeavyRush
2
100%
WorkerRush -> Unknown
4
50%
WorkerRush -> WorkerRush
7
43%
18 openings
150
43%
Microwave was moderately successful in predicting Dragon’s play, because Dragon tends to stick with a successful strategy as long as it remains successful. Look at that mix of zerg openings! 4 pool, hydra builds, and mutalisk builds.
#5 mcrave
opening
games
wins
first
last
10Hatch9Pool9gas
1
0%
133
133
10HatchMain9Pool9Gas
4
25%
42
72
10HatchTurtleHydra
1
0%
83
83
11HatchTurtleLurker
1
0%
36
36
12Hatch
1
0%
15
15
12Pool
17
18%
4
147
12PoolMain
2
0%
110
139
2HatchLurker
1
0%
32
32
3Hatch
2
0%
113
137
3HatchLurker
1
0%
95
95
3HatchMuta
1
0%
148
148
3HatchMutaExpo
1
0%
106
106
3HatchPoolHydra
2
0%
92
102
3HatchPoolHydraExpo
12
25%
49
145
4HatchBeforeGas
1
0%
71
71
4PoolSoft
1
0%
38
38
5PoolSpeed
1
0%
73
73
6PoolSpeed
4
25%
128
138
7PoolHydraLingRush7D
1
0%
134
134
8Pool
1
0%
62
62
9HatchMain8Pool8Gas
1
0%
47
47
9Pool
1
0%
104
104
9PoolGasHatchSpeed8D
1
0%
17
17
9PoolSpeed
28
46%
33
146
9PoolSpeedLing
1
0%
76
76
Overpool
1
0%
79
79
OverpoolSpeed
27
22%
0
149
ZvP_2HatchHydra
2
0%
14
54
ZvP_9Hatch9Pool
21
33%
1
143
ZvZ_Overpool11Gas
6
0%
7
108
ZvZ_Overpool9Gas
5
0%
8
67
31 openings
150
23%
enemy
games
wins
FastRush -> HeavyRush
1
0%
HeavyRush -> NakedExpand
3
67%
HeavyRush -> Unknown
1
0%
NakedExpand -> FastRush
1
100%
NakedExpand -> HeavyRush
3
33%
NakedExpand -> NakedExpand
8
38%
NakedExpand -> Turtle
7
14%
NakedExpand -> Unknown
29
7%
Turtle -> FastRush
1
0%
Turtle -> HeavyRush
1
100%
Turtle -> NakedExpand
11
64%
Turtle -> Turtle
23
26%
Turtle -> Unknown
61
16%
13 openings
150
23%
Microwave tried a lot of stuff versus McRave—three hatch before pool hydralisk opening in ZvZ? And it worked sometimes? I should try to find some of those games.
#7 steamhammer
opening
games
wins
first
last
10Hatch9Pool9gas
9
44%
68
142
10HatchMain9Pool9Gas
4
25%
101
113
10HatchTurtleHydra
1
0%
39
39
11HatchTurtleMuta
1
0%
108
108
12HatchMain
1
0%
15
15
12Pool
25
20%
0
144
12PoolMain
5
20%
24
92
2HatchLurker
2
0%
54
83
3HatchHydraBust
1
0%
104
104
3HatchHydraExpo
2
0%
67
86
3HatchPoolHydra
2
0%
7
149
4HatchPoolHydra
1
0%
34
34
5Pool
4
0%
5
96
5PoolSpeed
3
33%
94
133
7Pool
1
0%
36
36
7PoolHydraLingRush7D
1
0%
89
89
9Hatch9Pool9Gas
1
0%
106
106
9HatchTurtleHydra
1
0%
127
127
9PoolGasHatchSpeed8D
1
0%
42
42
9PoolHatch
2
0%
19
29
9PoolSpeed
31
55%
9
138
9PoolSpeedLing
1
0%
117
117
9PoolSunken
7
0%
1
95
OverpoolSpeed
3
33%
47
121
ZvP_11Hatch10Pool
4
50%
135
145
ZvP_2HatchHydra
9
0%
3
84
ZvP_9Hatch9Pool
1
0%
16
16
ZvZ_Overgas11Pool
20
50%
6
147
ZvZ_Overpool11Gas
2
0%
79
93
ZvZ_Overpool9Gas
4
25%
61
148
30 openings
150
29%
enemy
games
wins
HeavyRush -> HeavyRush
2
50%
HeavyRush -> Turtle
4
0%
Turtle -> FastRush
1
100%
Turtle -> HeavyRush
14
57%
Turtle -> NakedExpand
16
38%
Turtle -> Turtle
96
23%
Turtle -> Unknown
17
29%
7 openings
150
29%
Microwave recognizes turtle builds in most games. That will be Steamhammer’s OverpoolTurtle opening, which builds as many sunkens at it can afford (2) without delaying mutalisks. It’s tough for bots to handle, because the build is safe on the ground while giving nothing away in the air. Microwave mainly preferred speed zergling openings in response, taking advantage of its superior zergling-on-zergling micro (which is not really a difference in micro as much as in engagement skills).
#8 daqin
opening
games
wins
first
last
1HatchMuta_Sparkle
62
90%
49
148
3HatchLingBust
17
65%
1
130
3HatchMuta
59
90%
0
149
3HatchMutaExpo
9
56%
12
48
3HatchPoolHydraExpo
1
0%
3
3
9Pool
1
0%
22
22
OverpoolLurker
1
0%
19
19
7 openings
150
83%
enemy
games
wins
HeavyRush -> HeavyRush
4
100%
HeavyRush -> SafeExpand
3
100%
HeavyRush -> Turtle
6
100%
HeavyRush -> Unknown
2
100%
NakedExpand -> Turtle
3
67%
SafeExpand -> NakedExpand
1
100%
SafeExpand -> SafeExpand
2
100%
SafeExpand -> Turtle
5
100%
Turtle -> HeavyRush
20
85%
Turtle -> NakedExpand
16
100%
Turtle -> Proxy
1
0%
Turtle -> SafeExpand
16
62%
Turtle -> Turtle
55
85%
Turtle -> Unknown
16
62%
14 openings
150
83%
#9 zzzkbot
opening
games
wins
first
last
OverpoolSpeed
147
95%
2
149
ZvZ_Overgas11Pool
3
0%
0
3
2 openings
150
93%
enemy
games
wins
FastRush -> FastRush
96
94%
FastRush -> Turtle
1
100%
FastRush -> Unknown
51
96%
Turtle -> FastRush
2
0%
4 openings
150
93%
It looks like ZZZKBot played its 4 pool about 2/3 of the time, and the rest of the time did something that Microwave could not recognize. But no matter, Microwave played overpool nearly all the time, fast enough to stop the rush and, in Microwave’s hands, flexible enough to counter ZZZKBot’s other builds.
#10 ualbertabot
opening
games
wins
first
last
1HatchMuta_Sparkle
2
0%
123
143
3HatchHydraExpo
1
0%
91
91
4PoolSoft
51
75%
0
147
5Pool
7
57%
44
133
5PoolSpeed
22
68%
3
146
7PoolHydraLingRush7D
1
0%
79
79
7PoolHydraRush7D
1
0%
50
50
8PoolHydraRush8D
10
50%
34
85
9PoolGasHatchSpeed8D
2
50%
27
28
9PoolSunkHatch
9
56%
113
135
OverpoolSunken
15
53%
102
148
ZvP_10Hatch9Pool
27
56%
21
120
ZvZ_Overpool11Gas
1
0%
82
82
13 openings
149
61%
enemy
games
wins
Factory -> FastRush
2
50%
Factory -> HeavyRush
2
0%
Factory -> NakedExpand
1
100%
Factory -> Unknown
2
0%
FastRush -> Factory
3
100%
FastRush -> FastRush
4
75%
FastRush -> HeavyRush
9
67%
FastRush -> NakedExpand
2
100%
FastRush -> Unknown
3
67%
HeavyRush -> Factory
2
100%
HeavyRush -> FastRush
22
64%
HeavyRush -> HeavyRush
49
41%
HeavyRush -> NakedExpand
9
100%
HeavyRush -> Unknown
22
68%
NakedExpand -> Factory
4
100%
NakedExpand -> FastRush
2
50%
NakedExpand -> HeavyRush
5
40%
NakedExpand -> NakedExpand
3
100%
NakedExpand -> Unknown
2
100%
Unknown -> HeavyRush
1
100%
20 openings
149
61%
Compare this to UAlbertaBot’s table. Microwave did not do perfectly against any UAlbertaBot race, and suffered badly against the zealot rush. Microwave had neither a universal build that works against all UAlbertaBot plays (which is how Steamhammer succeeded against UAlbertaBot), nor was it able to adapt its build well enough to counter what it saw (compare ZZZKBot above). Still, it found that 4 pool and 5 pool were not bad! Fight fire with fire.
#11 willyt
opening
games
wins
first
last
10Hatch9Pool9gas
15
73%
1
143
11HatchTurtleLurker
6
17%
26
74
11HatchTurtleMuta
4
25%
25
73
12PoolMain
3
33%
121
149
12PoolMuta
2
100%
64
80
2HatchMuta_Sparkle
1
0%
36
36
3HatchExpo
1
0%
77
77
3HatchHydra
1
0%
58
58
3HatchLurker
2
0%
57
141
3HatchMuta
4
75%
76
146
3HatchMutaExpo
8
50%
56
145
9Hatch9Pool9Gas
13
77%
123
144
9PoolExpo
40
78%
9
147
9PoolGasHatchSpeed8D
4
100%
53
142
9PoolHydra
1
0%
91
91
9PoolLurker
10
40%
5
115
9PoolSpeed
21
81%
0
148
9PoolSunkHatch
4
25%
3
43
9PoolSunken
9
78%
51
103
ZvZ_Overgas11Pool
1
0%
84
84
20 openings
150
65%
enemy
games
wins
Factory -> Factory
1
100%
Factory -> NakedExpand
4
100%
Factory -> SafeExpand
1
0%
Factory -> Unknown
4
100%
HeavyRush -> Factory
2
50%
HeavyRush -> HeavyRush
4
100%
HeavyRush -> NakedExpand
5
100%
HeavyRush -> SafeExpand
4
25%
HeavyRush -> Unknown
2
50%
NakedExpand -> Factory
8
62%
NakedExpand -> HeavyRush
10
50%
NakedExpand -> NakedExpand
43
100%
NakedExpand -> SafeExpand
13
46%
NakedExpand -> Unknown
31
23%
SafeExpand -> Factory
2
50%
SafeExpand -> NakedExpand
7
100%
SafeExpand -> SafeExpand
6
33%
SafeExpand -> Unknown
3
0%
18 openings
150
65%
#12 ecgberht
opening
games
wins
first
last
2HatchHydra
147
88%
0
149
9PoolLurker
3
67%
5
25
2 openings
150
88%
enemy
games
wins
Factory -> Factory
1
100%
Factory -> NakedExpand
8
100%
Factory -> SafeExpand
1
0%
Factory -> Unknown
6
100%
FastRush -> Factory
1
100%
FastRush -> Unknown
2
100%
HeavyRush -> Factory
4
100%
HeavyRush -> FastRush
2
50%
HeavyRush -> HeavyRush
1
100%
HeavyRush -> NakedExpand
4
100%
HeavyRush -> SafeExpand
1
100%
HeavyRush -> Unknown
1
100%
NakedExpand -> Factory
13
100%
NakedExpand -> FastRush
4
75%
NakedExpand -> HeavyRush
16
88%
NakedExpand -> NakedExpand
35
100%
NakedExpand -> SafeExpand
2
50%
NakedExpand -> Unknown
45
73%
SafeExpand -> Factory
1
100%
SafeExpand -> HeavyRush
1
100%
SafeExpand -> Unknown
1
100%
21 openings
150
88%
#13 eggbot
opening
games
wins
first
last
9Pool
150
100%
0
149
1 openings
150
100%
enemy
games
wins
Proxy -> Turtle
2
100%
Turtle -> Proxy
15
100%
Turtle -> Turtle
84
100%
Turtle -> Unknown
49
100%
4 openings
150
100%
Microwave did not understand how to recognize EggBot’s cannon play, but it knew from training how to win.
I’ll cover Microwave over two days because it writes two files for each opponent, a “results” file giving wins/losses for each strategy and a “history” file of more detailed game records. Each summary is bulky in itself, and I don’t want to pile them up. The history file has all the information in the results file and more. In fact, a quick look at Microwave’s code says that it no longer reads the results file at all, but reconstructs its contents from the history file each game. But different presentations of the data have value in themselves; this view makes it easy to read across the columns and see where a given opening was effective.
Today is the results file, the table of strategies versus each opponent. Wow, that’s a lot of opening builds! I count 73, less than half as many as Steamhammer but still too large a number to explore in a tournament of 150 rounds. I think only bots with combinatorial strategies have more. The numbers include not only games played during the tournament, but also Microwave’s prepared data for each opponent, so they add up to more than 150 games versus each opponent. You can compare the overall win rates per opponent to see which ones Microwave was more successful against in training as opposed to in the tournament—it may indicate whether the opponent was updated for the tournament and became stronger than Microwave expected. In general, for stronger opponents training data overestimated Microwave’s success, while for weaker opponents it was the opposite (that is, the training uncovered mistakes that Microwave could then avoid).
total
#1 stardust
#2 purplewave
#3 bananabrain
#4 dragon
#5 mcrave
#7 steamhammer
#8 daqin
#9 zzzkbot
#10 ualbertabot
#11 willyt
#12 ecgberht
#13 eggbot
10Hatch9Pool9gas
28-48 37%
0-4 0%
0-12 0%
3-19 14%
-
0-1 0%
4-5 44%
-
-
-
21-7 75%
-
-
10HatchMain9Pool9Gas
2-8 20%
0-1 0%
-
0-1 0%
-
1-3 25%
1-3 25%
-
-
-
-
-
-
10HatchTurtleHydra
0-3 0%
-
-
-
0-1 0%
0-1 0%
0-1 0%
-
-
-
-
-
-
11HatchTurtleHydra
0-11 0%
-
0-10 0%
0-1 0%
-
-
-
-
-
-
-
-
-
11HatchTurtleLurker
11-17 39%
-
0-1 0%
-
0-2 0%
0-1 0%
0-1 0%
-
-
-
11-12 48%
-
-
11HatchTurtleMuta
4-15 21%
-
0-7 0%
0-2 0%
-
-
0-1 0%
-
-
-
4-5 44%
-
-
12Hatch
0-3 0%
-
-
0-2 0%
-
0-1 0%
-
-
-
-
-
-
-
12HatchMain
0-4 0%
0-2 0%
0-1 0%
-
-
-
0-1 0%
-
-
-
-
-
-
12Pool
35-51 41%
0-1 0%
-
-
-
9-17 35%
26-33 44%
-
-
-
-
-
-
12PoolMain
25-34 42%
0-1 0%
-
22-21 51%
0-1 0%
0-2 0%
2-7 22%
-
-
-
1-2 33%
-
-
12PoolMuta
7-20 26%
0-2 0%
2-9 18%
0-1 0%
-
-
-
-
-
-
5-8 38%
-
-
1HatchMuta_Sparkle
56-9 86%
-
-
0-1 0%
-
-
-
56-6 90%
-
0-2 0%
-
-
-
2HatchHydra
161-24 87%
0-1 0%
0-2 0%
-
-
-
-
0-1 0%
-
-
-
161-20 89%
-
2HatchLurker
0-8 0%
0-1 0%
0-1 0%
0-2 0%
-
0-1 0%
0-2 0%
-
-
-
-
0-1 0%
-
2HatchLurkerAllIn
0-2 0%
0-1 0%
0-1 0%
-
-
-
-
-
-
-
-
-
-
2HatchMuta
74-59 56%
1-14 7%
0-1 0%
3-9 25%
60-33 65%
0-1 0%
-
-
-
-
-
-
10-1 91%
2HatchMuta_Sparkle
0-1 0%
-
-
-
-
-
-
-
-
-
0-1 0%
-
-
3Hatch
0-5 0%
0-3 0%
-
-
-
0-2 0%
-
-
-
-
-
-
-
3HatchExpo
0-3 0%
0-2 0%
-
-
-
-
-
-
-
-
0-1 0%
-
-
3HatchHydra
0-2 0%
0-1 0%
-
-
-
-
-
-
-
-
0-1 0%
-
-
3HatchHydraBust
0-14 0%
0-7 0%
0-2 0%
0-2 0%
-
0-1 0%
0-1 0%
0-1 0%
-
-
-
-
-
3HatchHydraExpo
1-5 17%
-
-
-
1-2 33%
-
0-2 0%
-
-
0-1 0%
-
-
-
3HatchHydra_BHG
0-4 0%
0-1 0%
0-1 0%
0-1 0%
-
0-1 0%
-
-
-
-
-
-
-
3HatchLingBust
36-41 47%
2-20 9%
-
2-6 25%
-
-
-
32-15 68%
-
-
-
-
-
3HatchLurker
0-4 0%
-
-
-
-
0-1 0%
-
-
-
-
0-3 0%
-
-
3HatchMuta
90-106 46%
7-58 11%
3-9 25%
3-19 14%
-
0-1 0%
-
72-14 84%
-
-
5-5 50%
-
-
3HatchMutaExpo
48-64 43%
0-1 0%
1-25 4%
0-1 0%
32-22 59%
0-1 0%
-
9-7 56%
-
-
6-7 46%
-
-
3HatchPoolHydra
1-24 4%
1-15 6%
0-2 0%
-
-
0-2 0%
0-2 0%
0-3 0%
-
-
-
-
-
3HatchPoolHydraExpo
3-12 20%
0-1 0%
-
0-1 0%
-
3-9 25%
-
0-1 0%
-
-
-
-
-
4HatchBeforeGas
0-10 0%
0-5 0%
0-1 0%
0-3 0%
-
0-1 0%
-
-
-
-
-
-
-
4HatchPoolHydra
4-25 14%
0-2 0%
0-1 0%
2-15 12%
2-6 25%
-
0-1 0%
-
-
-
-
-
-
4PoolHard
3-13 19%
0-1 0%
1-7 12%
2-4 33%
-
-
-
-
-
-
0-1 0%
-
-
4PoolSoft
61-44 58%
0-3 0%
0-2 0%
0-2 0%
7-14 33%
0-3 0%
-
-
-
54-17 76%
0-3 0%
-
-
5HatchPoolHydra
5-28 15%
2-26 7%
-
-
3-2 60%
-
-
-
-
-
-
-
-
5Pool
7-17 29%
0-2 0%
-
-
-
0-1 0%
3-10 23%
0-1 0%
-
4-3 57%
-
-
-
5PoolSpeed
29-18 62%
-
-
-
0-1 0%
0-1 0%
1-2 33%
-
-
28-14 67%
-
-
-
6Pool
0-6 0%
0-2 0%
0-1 0%
0-2 0%
-
-
0-1 0%
-
-
-
-
-
-
6PoolSpeed
4-14 22%
0-4 0%
3-7 30%
-
-
1-3 25%
-
-
-
-
-
-
-
7Pool
0-6 0%
0-1 0%
0-3 0%
0-1 0%
-
-
0-1 0%
-
-
-
-
-
-
7PoolHydraLingRush7D
0-5 0%
-
0-1 0%
-
0-1 0%
0-1 0%
0-1 0%
-
-
0-1 0%
-
-
-
7PoolHydraRush7D
0-2 0%
-
-
-
-
-
-
0-1 0%
-
0-1 0%
-
-
-
8Pool
0-2 0%
-
-
0-1 0%
-
0-1 0%
-
-
-
-
-
-
-
8PoolHydraRush8D
5-8 38%
-
0-2 0%
0-1 0%
-
-
-
-
-
5-5 50%
-
-
-
9Hatch9Pool9Gas
10-12 45%
0-1 0%
0-6 0%
0-1 0%
-
-
0-1 0%
-
-
-
10-3 77%
-
-
9HatchMain8Pool8Gas
2-8 20%
0-1 0%
2-6 25%
-
-
0-1 0%
-
-
-
-
-
-
-
9HatchTurtleHydra
0-3 0%
0-1 0%
0-1 0%
-
-
-
0-1 0%
-
-
-
-
-
-
9Pool
183-11 94%
0-4 0%
0-3 0%
-
-
0-1 0%
-
0-1 0%
-
-
0-1 0%
0-1 0%
183-0 100%
9PoolExpo
31-9 78%
-
-
-
-
-
-
-
-
-
31-9 78%
-
-
9PoolGasHatchSpeed7D
18-19 49%
0-1 0%
18-18 50%
-
-
-
-
-
-
-
-
-
-
9PoolGasHatchSpeed8D
21-29 42%
0-4 0%
-
12-6 67%
-
0-2 0%
0-1 0%
0-3 0%
-
1-1 50%
8-12 40%
-
-
9PoolHatch
0-3 0%
-
-
-
-
-
0-2 0%
-
0-1 0%
-
-
-
-
9PoolHatchGasSpeed7D
11-8 58%
0-1 0%
11-6 65%
0-1 0%
-
-
-
-
-
-
-
-
-
9PoolHatchGasSpeed8D
36-50 42%
1-16 6%
5-6 45%
30-24 56%
0-1 0%
0-2 0%
0-1 0%
-
-
-
-
-
-
9PoolHydra
0-3 0%
0-1 0%
-
-
-
-
-
0-1 0%
-
-
0-1 0%
-
-
9PoolLurker
15-14 52%
0-2 0%
-
-
-
-
-
-
-
-
6-8 43%
9-4 69%
-
9PoolSpeed
68-71 49%
0-3 0%
1-4 20%
0-4 0%
-
13-16 45%
24-21 53%
0-2 0%
-
-
30-21 59%
-
-
9PoolSpeedLing
2-22 8%
0-3 0%
0-3 0%
2-7 22%
-
0-3 0%
0-2 0%
0-3 0%
-
-
0-1 0%
-
-
9PoolSunkHatch
6-12 33%
0-2 0%
0-1 0%
0-1 0%
0-1 0%
-
-
-
-
5-4 56%
1-3 25%
-
-
9PoolSunken
9-15 38%
0-1 0%
0-1 0%
-
-
0-1 0%
2-10 17%
-
-
-
7-2 78%
-
-
Overpool
0-4 0%
0-1 0%
-
0-1 0%
0-1 0%
0-1 0%
-
-
-
-
-
-
-
OverpoolLurker
0-4 0%
0-1 0%
-
-
0-1 0%
-
-
0-1 0%
-
-
0-1 0%
-
-
OverpoolSpeed
187-60 76%
0-1 0%
1-6 14%
0-3 0%
-
27-37 42%
1-3 25%
-
158-9 95%
-
0-1 0%
-
-
OverpoolSunken
8-7 53%
-
-
-
-
-
-
-
-
8-7 53%
-
-
-
OverpoolTurtle
1-13 7%
0-1 0%
1-11 8%
-
0-1 0%
-
-
-
-
-
-
-
-
ZvP_10Hatch9Pool
17-30 36%
0-5 0%
0-8 0%
2-5 29%
-
-
-
-
-
15-12 56%
-
-
-
ZvP_11Hatch10Pool
2-12 14%
0-2 0%
0-7 0%
0-1 0%
-
-
2-2 50%
-
-
-
-
-
-
ZvP_2HatchHydra
2-28 7%
0-3 0%
0-9 0%
0-4 0%
-
0-2 0%
2-10 17%
-
-
-
-
-
-
ZvP_9Hatch9Pool
13-34 28%
0-2 0%
0-10 0%
0-1 0%
-
13-18 42%
0-1 0%
0-2 0%
-
-
-
-
-
ZvZ_Overgas11Pool
30-24 56%
0-3 0%
-
-
-
-
13-15 46%
-
17-5 77%
-
0-1 0%
-
-
ZvZ_Overgas9Pool
0-5 0%
0-2 0%
-
0-1 0%
-
-
0-2 0%
-
-
-
-
-
-
ZvZ_Overpool11Gas
5-21 19%
0-2 0%
-
0-2 0%
-
5-13 28%
0-3 0%
-
-
0-1 0%
-
-
-
ZvZ_Overpool9Gas
2-13 13%
0-2 0%
0-1 0%
-
-
1-7 12%
1-3 25%
-
-
-
-
-
-
ZvZ_OverpoolTurtle
0-1 0%
0-1 0%
-
-
-
-
-
-
-
-
-
-
-
total
- 51%
14-250 5%
49-216 18%
83-180 32%
105-90 54%
73-161 31%
82-153 35%
169-63 73%
175-15 92%
120-69 63%
146-120 55%
170-26 87%
193-1 99%
Microwave explored widely against top opponents, and concentrated efficiently on a few winning openings against weaker ones. On the other hand, although there is a flag in the configuration file named PlayGoodStrategiesFirst (turned on), Microwave seems to have little idea which strategies are most likely to work. Versus DaQin, 1 hatch mutalisk and 3 hatch mutalisk are successful, but the most natural 2 hatch muta is never tried. Of course that’s a widespread weakness among bots.
The 3 hatch muta strategies were relatively successful overall. That’s interesting.
Though UAlbertaBot has been surpassed over the years and become a low-end bot, we can still gain insight from its experience. The table summarizes the contents of its learning files. Last year this table had the bots down the left and the strategies across the top, but this year I turned it on its side—I am looking ahead to the table for Microwave, which has many strategies.
Some of the numbers here are slightly different from those in the official crosstable, because of games where UAlbertaBot did not record a result (no doubt due to crashes).
total
#1 stardust
#2 purplewave
#3 bananabrain
#4 dragon
#5 mcrave
#6 microwave
#7 steamhammer
#8 daqin
#9 zzzkbot
#11 willyt
#12 ecgberht
#13 eggbot
4RaxMarines
33-120 22%
2-18 10%
1-6 14%
0-13 0%
1-8 11%
7-12 37%
3-14 18%
0-9 0%
0-6 0%
0-10 0%
17-19 47%
2-5 29%
-
MarineRush
66-140 32%
0-10 0%
0-5 0%
1-18 5%
6-16 27%
8-12 40%
4-12 25%
4-23 15%
0-5 0%
0-10 0%
0-5 0%
6-9 40%
37-15 71%
TankPush
17-105 14%
0-10 0%
5-18 22%
0-12 0%
0-5 0%
0-3 0%
0-5 0%
0-9 0%
8-23 26%
0-9 0%
4-8 33%
0-3 0%
-
VultureRush
17-82 17%
0-10 0%
0-5 0%
0-12 0%
0-5 0%
0-3 0%
0-5 0%
0-9 0%
0-5 0%
0-9 0%
0-3 0%
17-16 52%
-
DTRush
19-119 14%
1-22 4%
0-13 0%
1-13 7%
11-26 30%
0-16 0%
-
0-14 0%
6-13 32%
-
0-2 0%
-
-
DragoonRush
13-117 10%
0-16 0%
0-13 0%
0-9 0%
0-12 0%
2-28 7%
-
1-20 5%
10-17 37%
-
0-2 0%
-
-
ZealotRush
185-170 52%
0-15 0%
2-24 8%
4-20 17%
0-12 0%
0-16 0%
37-13 74%
1-20 5%
0-5 0%
48-11 81%
25-18 58%
28-15 65%
40-1 98%
2HatchHydra
9-83 10%
0-12 0%
2-21 9%
1-6 14%
6-13 32%
0-11 0%
0-6 0%
0-8 0%
0-2 0%
0-1 0%
0-3 0%
-
-
3HatchMuta
0-63 0%
0-12 0%
0-12 0%
0-4 0%
0-4 0%
0-11 0%
0-6 0%
0-8 0%
0-2 0%
0-1 0%
0-3 0%
-
-
3HatchScourge
0-59 0%
0-11 0%
0-11 0%
0-4 0%
0-4 0%
0-10 0%
0-6 0%
0-7 0%
0-2 0%
0-1 0%
0-3 0%
-
-
ZerglingRush
195-168 54%
0-11 0%
0-11 0%
11-21 34%
5-11 31%
0-10 0%
14-23 38%
1-11 8%
22-23 49%
29-18 62%
21-17 55%
39-10 80%
53-2 96%
total
- 31%
3-147 2%
10-139 7%
18-132 12%
29-116 20%
17-132 11%
58-90 39%
7-138 5%
46-103 31%
77-70 52%
67-83 45%
92-58 61%
130-18 88%
Random UAlbertaBot starts off with its default strategies of marine rush, zealot rush, or zergling rush, and tries alternatives only if the strategy scores poorly. The table shows that the default strategies chosen years ago are still the best choices. The zealot rush even scored well against #6 Microwave. Also constant over the years is that the 3 hatch scourge build, which was designed to counter the carrier bot XIMP, has no other use; UAlbertaBot would have done better without it.
It’s curious that UAlbertaBot’s overall weakest race is terran, but that its terran scored best against many stronger opponents: Terran was UAlbertaBot’s happiest roll versus #7 Steamhammer, #5 McRave, #2 PurpleWave, and #1 Stardust. But these stronger opponents allowed few wins. #1 Stardust (2%), #7 Steamhammer (5%), and #2 PurpleWave (7%) shut down UAlbertaBot hard.
If your bot is ranked above UAlbertaBot, then pink or blue boxes suggest weaknesses that you might benefit from working on. If a weaker bot beats you this way, presumably a stronger one can too. UAlbertaBot benefits from its random race and the big differences between its strategies, so maybe something went wrong in your scouting or reactions. #6 Microwave had trouble with zealots, #5 McRave had trouble with marines, and #4 Dragon had some trouble with 4 different rushes.
Steamhammer 3.2.20 is uploaded to SSCAIT, source code to follow shortly. It has minor bug fixes and tweaks, nothing earthshaking. I turned on the DrawWorkerInfo debug flag to add fun. Here’s what’s new.
squad targeting
• A squad that is empty or otherwise cannot attack is given a default target. This “amazing” optimization may save a few hundred microseconds of computation per game, though I think it’s less. I made this change after investigating what I suspected was a serious bug that gave squads bad targets. The cause turned out to be a race between squad updating and squad targeting that went wrong a few times per game and affected a squad for only one frame, and only when the squad wasn’t able to take action anyway—the bug actually had no bad effects. This change papers over the bug without addressing the unimportant race condition.
infrastructure
• go post worker now works on frame 0. The feature worked when I originally released it, but a change I made to fix a problem for AIIDE (reordering manager calls to prevent double commanding) caused go post worker to fail when issued at the very beginning of the build order. I fixed it by removing the worker job type Default; a worker that has not yet been given a job is now Idle, as it logically should be. I like it when I can fix a bug by cutting out unnecessary parts. The effect of the bug was to break one protoss build, Proxy2Gate, that sends out a worker first thing.
• MapGrid::getLeastExplored() no longer accepts a zone argument. It’s not needed since getLeastExploredNear() was added.
construction
• The building manager correctly counts the number of workers sent to construct a building. If the first worker dies and it has to send another, the count goes to 2, and so on. It used to often miscount. This is the most important fix here, and solves the zerg macro hatch conversion bug. It should also solve misbehaviors by terran and protoss.
terran
• It was rare but possible for a terran building to be abandoned while incomplete, lost from the building queue so that it was never canceled, permanently wasting resources. Fixed.
• When going bio, get gas and academy slightly earlier.
zerg
• Assign an overlord to look over the next base that Steamhammer intends to take. That will let it spot any spider mines or other obstacles to taking the base. The overlord usually arrives well before any drone is sent. The overlord stays home if the enemy has flying overlord hunters out on the map, though.
• Adjust desired drone counts so that Steamhammer is willing to make more queens. For some reason, Steamhammer was rarely making more than 1 queen. With this change, it often makes 2 when the enemy units and queen research justify it (many tanks means more queens for broodling). It’s configured to make up to 6 queens, so 2 is still low, but the issue is not worth a close look right now.
openings
• Over10PoolHydra hydra bust added. This was inspired by a CUBOT build that I saw drive BananaBrain to its knees (CUBOT broke the protoss natural, continued its attack into the main and killed nearly all probes, then lost despite a winning advantage when already queued dragoons popped out of the gates). Steamhammer’s version is entirely different in detail and I think stronger.
Next should be Steamhammer 3.3, finally ported to BWAPI 4.4.0. Tomorrow I’ll start looking at what different bots learned from their experience in AIIDE. Meanwhile, the AIIDE unknown maps competition must be running now, and the results may be out this weekend or thereabouts. I’m eager to see what maps came up this time.
I looked in each bot’s final 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. Standard 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.
#
bot
info
1
Stardust
Nothing. Stardust relies on its great execution.
2
PurpleWave
The learning files have a sequence of PurpleWave’s strategy choices followed by a sequence of “fingerprinted” enemy strategies. (PurpleWave also has specific preparation for its opponents, but that’s in code rather than data.) There are also debug logs that show some decisions, but are probably only for the author.
3
BananaBrain
The learning files look just like last year’s: One file for each opponent in the form of brief records of results. Each record consists of date+time, map, BananaBrain’s strategy (“PvZ_9/9proxygate”), the opponent’s recognized strategy (“Z_9pool”), a floating point number which we were told last year is the game duration in minutes, and the game result. Pre-learned data for 6 opponents, with the largest file by far for Stardust. Maybe if you have pegged your opponent as having a narrow range of adaptation, you don’t have to leave room for surprises.
4
Dragon
Very simple game records with strategy and game result, like "siege expand" won.
5
McRave
Two files for each opponent, named like ZvU UAlbertaBot.txt and ZvU UAlbertaBot Info.txt. The first file is short and counts wins and losses overall and for each of McRave’s strategies. The info file (now working correctly, unlike last year) has detailed game records with aspects of the opponent’s strategy (2Gate,Main,ZealotRush), McRave’s strategy at 3 levels of abstraction (PoolHatch,Overpool,2HatchMuta), timings, and unit counts. I want to look more closely at the game records and see how they are used (maybe they are only logs for the author).
6
Microwave
Result and history files for each opponent that look similar to last year’s. The result files count wins and losses for each Microwave strategy, and no longer limit the counts to 10—apparently Microwave no longer deliberately forgets history. The history files have a one-line record of data about each game and look the same as last year. Also pre-learned history files for all 12 opponents.
Carried over from last year. Learning files straight from its parent Locutus (very similar to the old format Steamhammer files). There is no visible pre-learned data (in a quick check I also found no opponent-specific code).
9
ZZZKBot
Learning files for each opponent that look the same as last year, with detailed but hard-to-interpret information about each game.
10
UAlbertaBot
Carried over from past years. For each opponent, a file listing strategies with win and loss counts for each.
11
WillyT
A single log file with 150 lines apparently giving data for 150 games against various opponents. Each line looks like 20201009,Ecgberht,T,01,0. The items look like date, opponent, opponent race, a number 01 02 or 03, and win/loss. There were 150 rounds in the tournament, so maybe this is a log of one game per round—the dates seem to back that up, but if so, how is the single game chosen? Is it the last one played? This is either broken, or else it is doing something I can’t fathom.
12
Ecgberht
Two files for each opponent, named like Dragon_Terran.json and Dragon_Terran-History.json. The plain file counts wins and losses of each of Ecgberht’s strategies separately for each map size (number of starting locations, 2 3 or 4). (The map size breakdown is similar to AIUR’s.) There is also an overall win/loss count, plus flags named naughty and defendHarass. Of all bots in the tournament, only ZZZKBot is flagged naughty, so maybe it means the opponent likes fast rushes. defendHarass tells whether the opponent defends its workers if Ecgberht’s scouting SCV attacks them (that way it can exploit weak opponents without risking its SCV against prepared ones). The history file is a list of game records, giving opponent name, opponent race, game outcome, Ecgberht’s strategy, the map, and the opponent’s recognized strategy (which is often Unknown).
13
EggBot
Nothing. EggBot is the only entrant other than Stardust to record no data.
In recent years, nearly all top bots have relied on opening learning to adapt to their opponents. The strongest bot without learning was Iron, which came in #1 in AIIDE 2016 and slipped down the ranks until it fell to #8 in AIIDE 2019, scoring under 50%. Stardust is the only high finisher since then to get by without. Stardust plays with a restricted set of units, only zealots and dragoons with observers as needed. On the one hand, that shows the value of specializing and becoming extremely skilled at the most important aspects of the game (the opposite of Steamhammer’s development strategy). On the other hand, it points out how much headroom all bots have to improve.
I’ve found that the bland average “how well did I do on this map?” often obscures big variations in “how well did I do versus each opponent on this map?” The variations mean something about strategy execution or strategy selection. Unfortunately, with only this information it’s usually impossible to guess what the meaning is, so I don’t have many comments. In general, I think you have to look at games to see how two bots’ strategies interact on a given map. These tables can help you choose which games to look at.
First, here’s the overall table with the averages. It’s identical in content to the third table in the official results. With 1800 games per player and 10 maps, each cell represents 180 games (sometimes slightly fewer due to missing games). I also have a writeup of the maps.
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
93.22%
96%
92%
96%
93%
88%
94%
92%
94%
94%
92%
purplewave
79.44%
79%
82%
76%
80%
81%
76%
79%
82%
80%
81%
bananabrain
69.61%
65%
73%
69%
75%
71%
71%
68%
71%
65%
69%
dragon
62.38%
58%
63%
67%
63%
57%
69%
65%
59%
61%
60%
mcrave
57.22%
62%
54%
57%
59%
58%
54%
55%
61%
56%
56%
microwave
54.47%
58%
59%
47%
54%
54%
52%
52%
54%
61%
53%
steamhammer
54.00%
55%
53%
58%
52%
56%
50%
60%
53%
52%
51%
daqin
50.14%
53%
48%
51%
51%
51%
56%
51%
49%
42%
49%
zzzkbot
39.89%
35%
37%
32%
40%
39%
41%
39%
38%
53%
45%
ualbertabot
31.14%
33%
30%
35%
32%
37%
24%
28%
34%
23%
34%
willyt
29.44%
19%
26%
32%
22%
29%
35%
38%
33%
33%
28%
ecgberht
24.28%
28%
28%
27%
21%
24%
23%
21%
18%
23%
29%
eggbot
4.72%
9%
4%
4%
7%
5%
4%
2%
4%
4%
3%
Now the breakdown tables. For example, in the next table, Stardust scored 80% against PurpleWave on the map Destination. Each of these cells represents only 15 games (minus missing games), so small differences are not significant.
stardust
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
purplewave
83%
80%
80%
93%
93%
73%
100%
80%
87%
73%
73%
bananabrain
62%
87%
53%
73%
33%
47%
67%
60%
53%
87%
60%
dragon
93%
100%
80%
93%
100%
93%
87%
93%
93%
100%
87%
mcrave
98%
93%
100%
93%
100%
100%
93%
100%
100%
100%
100%
microwave
99%
100%
100%
100%
100%
93%
100%
100%
100%
100%
100%
steamhammer
98%
100%
100%
100%
100%
87%
100%
93%
100%
100%
100%
daqin
93%
87%
100%
100%
93%
87%
93%
87%
100%
87%
93%
zzzkbot
99%
100%
100%
100%
100%
100%
100%
93%
100%
100%
100%
ualbertabot
98%
100%
100%
100%
100%
80%
100%
100%
100%
100%
100%
willyt
99%
100%
100%
100%
100%
100%
100%
100%
100%
93%
100%
ecgberht
99%
100%
100%
100%
100%
100%
100%
100%
100%
93%
93%
eggbot
97%
100%
87%
100%
100%
100%
93%
100%
100%
93%
100%
overall
93.22%
96%
92%
96%
93%
88%
94%
92%
94%
94%
92%
Stardust did about equally well on every map against PurpleWave, but not so against BananaBrain. It looks as though it’s due to BananaBrain’s play—see the BananaBrain table below. Stardust thoroughly suppressed other players, so that’s as much as we can say.
purplewave
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
17%
20%
20%
7%
7%
27%
0%
20%
13%
27%
27%
bananabrain
63%
60%
87%
47%
60%
60%
73%
67%
60%
67%
47%
dragon
45%
53%
47%
47%
40%
53%
7%
27%
80%
40%
53%
mcrave
95%
100%
87%
87%
100%
100%
100%
100%
80%
93%
100%
microwave
71%
53%
67%
67%
80%
67%
73%
67%
87%
67%
80%
steamhammer
95%
93%
100%
93%
93%
100%
93%
100%
87%
93%
100%
daqin
87%
80%
87%
87%
80%
87%
93%
73%
100%
93%
93%
zzzkbot
91%
93%
93%
100%
100%
73%
87%
100%
93%
93%
73%
ualbertabot
93%
93%
93%
80%
100%
100%
93%
100%
93%
87%
93%
willyt
98%
100%
100%
93%
100%
100%
93%
100%
93%
100%
100%
ecgberht
99%
100%
100%
100%
100%
100%
93%
100%
100%
100%
100%
eggbot
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
overall
79.44%
79%
82%
76%
80%
81%
76%
79%
82%
80%
81%
bananabrain
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
38%
13%
47%
27%
67%
53%
33%
40%
47%
13%
40%
purplewave
37%
40%
13%
53%
40%
40%
27%
33%
40%
33%
53%
dragon
45%
40%
47%
40%
40%
60%
47%
27%
33%
60%
53%
mcrave
55%
47%
73%
40%
60%
53%
60%
40%
53%
60%
60%
microwave
61%
60%
87%
60%
67%
53%
53%
67%
67%
33%
67%
steamhammer
71%
60%
80%
60%
87%
53%
80%
73%
73%
67%
73%
daqin
66%
60%
67%
53%
67%
67%
53%
67%
80%
80%
67%
zzzkbot
94%
100%
100%
100%
100%
87%
100%
100%
93%
87%
73%
ualbertabot
88%
93%
80%
100%
80%
87%
100%
87%
80%
100%
73%
willyt
84%
73%
100%
93%
93%
93%
93%
80%
80%
60%
73%
ecgberht
99%
93%
93%
100%
100%
100%
100%
100%
100%
100%
100%
eggbot
98%
100%
93%
100%
100%
100%
100%
100%
100%
87%
100%
overall
69.61%
65%
73%
69%
75%
71%
71%
68%
71%
65%
69%
BananaBrain shows an irregular pattern against its strongest opposition, but seems to have more consistent map preferences against the middle ranks. I don’t know what it means, but it’s interesting.
dragon
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
7%
0%
20%
7%
0%
7%
13%
7%
7%
0%
13%
purplewave
55%
47%
53%
53%
60%
47%
93%
73%
20%
60%
47%
bananabrain
55%
60%
53%
60%
60%
40%
53%
73%
67%
40%
47%
mcrave
79%
80%
73%
93%
73%
80%
80%
73%
47%
93%
93%
microwave
57%
27%
40%
80%
53%
47%
80%
60%
60%
60%
60%
steamhammer
30%
20%
27%
33%
33%
20%
47%
20%
40%
20%
40%
daqin
53%
40%
53%
27%
33%
60%
53%
80%
53%
60%
73%
zzzkbot
47%
47%
67%
73%
67%
40%
40%
33%
67%
20%
20%
ualbertabot
80%
80%
92%
87%
80%
60%
87%
80%
71%
87%
80%
willyt
93%
100%
93%
100%
100%
93%
93%
87%
93%
93%
80%
ecgberht
94%
100%
100%
100%
100%
100%
100%
93%
80%
100%
67%
eggbot
97%
100%
93%
93%
100%
93%
93%
100%
100%
100%
100%
overall
62.38%
58%
63%
67%
63%
57%
69%
65%
59%
61%
60%
Dragon is strangely inconsistent. Does it learn strategy independently for each map? Does it do map analysis to adapt its play to the map, but there are flaws? Look at the PurpleWave row: Dragon crushed it on Circuit Breaker and fell down on Fighting Spirit.
mcrave
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
2%
7%
0%
7%
0%
0%
7%
0%
0%
0%
0%
purplewave
5%
0%
13%
13%
0%
0%
0%
0%
20%
7%
0%
bananabrain
45%
53%
27%
60%
40%
47%
40%
60%
47%
40%
40%
dragon
21%
20%
27%
7%
27%
20%
20%
27%
53%
7%
7%
microwave
77%
87%
47%
73%
80%
87%
80%
73%
93%
80%
73%
steamhammer
57%
53%
33%
60%
47%
67%
80%
60%
53%
53%
67%
daqin
65%
87%
80%
87%
87%
47%
27%
33%
60%
80%
60%
zzzkbot
83%
93%
87%
87%
87%
93%
73%
73%
87%
60%
87%
ualbertabot
89%
80%
100%
87%
93%
93%
93%
93%
87%
80%
80%
willyt
63%
80%
53%
40%
80%
67%
47%
60%
47%
73%
80%
ecgberht
80%
80%
87%
60%
73%
80%
80%
80%
87%
93%
80%
eggbot
99%
100%
100%
100%
93%
100%
100%
100%
100%
100%
100%
overall
57.22%
62%
54%
57%
59%
58%
54%
55%
61%
56%
56%
microwave
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
1%
0%
0%
0%
0%
7%
0%
0%
0%
0%
0%
purplewave
29%
47%
33%
33%
20%
33%
27%
33%
13%
33%
20%
bananabrain
39%
40%
13%
40%
33%
47%
47%
33%
33%
67%
33%
dragon
43%
73%
60%
20%
47%
53%
20%
40%
40%
40%
40%
mcrave
23%
13%
53%
27%
20%
13%
20%
27%
7%
20%
27%
steamhammer
29%
53%
47%
13%
33%
13%
33%
13%
27%
33%
20%
daqin
83%
87%
100%
73%
80%
93%
53%
87%
80%
100%
80%
zzzkbot
93%
93%
93%
100%
93%
93%
93%
100%
100%
73%
93%
ualbertabot
61%
47%
60%
50%
53%
53%
87%
60%
60%
80%
60%
willyt
65%
87%
73%
27%
73%
47%
53%
47%
87%
87%
67%
ecgberht
88%
60%
80%
80%
100%
93%
93%
80%
100%
100%
93%
eggbot
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
overall
54.47%
58%
59%
47%
54%
54%
52%
52%
54%
61%
53%
steamhammer
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
2%
0%
0%
0%
0%
13%
0%
7%
0%
0%
0%
purplewave
5%
7%
0%
7%
7%
0%
7%
0%
13%
7%
0%
bananabrain
29%
40%
20%
40%
13%
47%
20%
27%
27%
33%
27%
dragon
70%
80%
73%
67%
67%
80%
53%
80%
60%
80%
60%
mcrave
43%
47%
67%
40%
53%
33%
20%
40%
47%
47%
33%
microwave
71%
47%
53%
87%
67%
87%
67%
87%
73%
67%
80%
daqin
22%
40%
20%
20%
13%
13%
27%
40%
7%
20%
20%
zzzkbot
75%
60%
73%
93%
67%
93%
80%
93%
87%
47%
53%
ualbertabot
95%
80%
100%
93%
100%
93%
87%
100%
100%
100%
100%
willyt
55%
60%
67%
60%
60%
53%
60%
60%
40%
33%
60%
ecgberht
83%
100%
60%
87%
87%
60%
93%
93%
87%
93%
73%
eggbot
97%
100%
100%
100%
93%
100%
87%
93%
100%
100%
100%
overall
54.00%
55%
53%
58%
52%
56%
50%
60%
53%
52%
51%
daqin
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
7%
13%
0%
0%
7%
13%
7%
13%
0%
13%
7%
purplewave
13%
20%
13%
13%
20%
13%
7%
27%
0%
7%
7%
bananabrain
34%
40%
33%
47%
33%
33%
47%
33%
20%
20%
33%
dragon
47%
60%
47%
73%
67%
40%
47%
20%
47%
40%
27%
mcrave
35%
13%
20%
13%
13%
53%
73%
67%
40%
20%
40%
microwave
17%
13%
0%
27%
20%
7%
47%
13%
20%
0%
20%
steamhammer
78%
60%
80%
80%
87%
87%
73%
60%
93%
80%
80%
zzzkbot
9%
40%
7%
20%
7%
7%
0%
0%
0%
0%
13%
ualbertabot
69%
73%
87%
53%
67%
60%
73%
73%
73%
71%
60%
willyt
96%
100%
100%
93%
93%
100%
100%
100%
100%
73%
100%
ecgberht
99%
100%
93%
100%
100%
100%
100%
100%
100%
100%
100%
eggbot
97%
100%
100%
87%
100%
100%
100%
100%
100%
87%
100%
overall
50.14%
53%
48%
51%
51%
51%
56%
51%
49%
42%
49%
zzzkbot
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
1%
0%
0%
0%
0%
0%
0%
7%
0%
0%
0%
purplewave
9%
7%
7%
0%
0%
27%
13%
0%
7%
7%
27%
bananabrain
6%
0%
0%
0%
0%
13%
0%
0%
7%
13%
27%
dragon
53%
53%
33%
27%
33%
60%
60%
67%
33%
80%
80%
mcrave
17%
7%
13%
13%
13%
7%
27%
27%
13%
40%
13%
microwave
7%
7%
7%
0%
7%
7%
7%
0%
0%
27%
7%
steamhammer
25%
40%
27%
7%
33%
7%
20%
7%
13%
53%
47%
daqin
91%
60%
93%
80%
93%
93%
100%
100%
100%
100%
87%
ualbertabot
49%
33%
47%
20%
67%
33%
53%
67%
40%
87%
40%
willyt
92%
100%
100%
100%
100%
93%
80%
67%
80%
100%
100%
ecgberht
29%
13%
13%
33%
33%
27%
33%
33%
60%
33%
13%
eggbot
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
overall
39.89%
35%
37%
32%
40%
39%
41%
39%
38%
53%
45%
ualbertabot
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
2%
0%
0%
0%
0%
20%
0%
0%
0%
0%
0%
purplewave
7%
7%
7%
20%
0%
0%
7%
0%
7%
13%
7%
bananabrain
12%
7%
20%
0%
20%
13%
0%
13%
20%
0%
27%
dragon
20%
20%
8%
13%
20%
40%
13%
20%
29%
13%
20%
mcrave
11%
20%
0%
13%
7%
7%
7%
7%
13%
20%
20%
microwave
39%
53%
40%
50%
47%
47%
13%
40%
40%
20%
40%
steamhammer
5%
20%
0%
7%
0%
7%
13%
0%
0%
0%
0%
daqin
31%
27%
13%
47%
33%
40%
27%
27%
27%
29%
40%
zzzkbot
51%
67%
53%
80%
33%
67%
47%
33%
60%
13%
60%
willyt
45%
27%
73%
47%
73%
47%
27%
33%
47%
27%
47%
ecgberht
61%
60%
47%
67%
60%
60%
53%
73%
73%
47%
73%
eggbot
90%
93%
93%
80%
93%
100%
87%
87%
87%
100%
80%
overall
31.14%
33%
30%
35%
32%
37%
24%
28%
34%
23%
34%
willyt
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
1%
0%
0%
0%
0%
0%
0%
0%
0%
7%
0%
purplewave
2%
0%
0%
7%
0%
0%
7%
0%
7%
0%
0%
bananabrain
16%
27%
0%
7%
7%
7%
7%
20%
20%
40%
27%
dragon
7%
0%
7%
0%
0%
7%
7%
13%
7%
7%
20%
mcrave
37%
20%
47%
60%
20%
33%
53%
40%
53%
27%
20%
microwave
35%
13%
27%
73%
27%
53%
47%
53%
13%
13%
33%
steamhammer
45%
40%
33%
40%
40%
47%
40%
40%
60%
67%
40%
daqin
4%
0%
0%
7%
7%
0%
0%
0%
0%
27%
0%
zzzkbot
8%
0%
0%
0%
0%
7%
20%
33%
20%
0%
0%
ualbertabot
55%
73%
27%
53%
27%
53%
73%
67%
53%
73%
53%
ecgberht
74%
53%
87%
47%
80%
93%
80%
93%
87%
60%
60%
eggbot
69%
0%
80%
93%
53%
47%
87%
100%
73%
80%
80%
overall
29.44%
19%
26%
32%
22%
29%
35%
38%
33%
33%
28%
ecgberht
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
1%
0%
0%
0%
0%
0%
0%
0%
0%
7%
7%
purplewave
1%
0%
0%
0%
0%
0%
7%
0%
0%
0%
0%
bananabrain
1%
7%
7%
0%
0%
0%
0%
0%
0%
0%
0%
dragon
6%
0%
0%
0%
0%
0%
0%
7%
20%
0%
33%
mcrave
20%
20%
13%
40%
27%
20%
20%
20%
13%
7%
20%
microwave
12%
40%
20%
20%
0%
7%
7%
20%
0%
0%
7%
steamhammer
17%
0%
40%
13%
13%
40%
7%
7%
13%
7%
27%
daqin
1%
0%
7%
0%
0%
0%
0%
0%
0%
0%
0%
zzzkbot
71%
87%
87%
67%
67%
73%
67%
67%
40%
67%
87%
ualbertabot
39%
40%
53%
33%
40%
40%
47%
27%
27%
53%
27%
willyt
26%
47%
13%
53%
20%
7%
20%
7%
13%
40%
40%
eggbot
97%
93%
100%
100%
87%
100%
100%
100%
93%
100%
100%
overall
24.28%
28%
28%
27%
21%
24%
23%
21%
18%
23%
29%
eggbot
overall
Destin
Heartb
Polari
Aztec
Longin
Circui
Empire
Fighti
Python
Roadki
stardust
3%
0%
13%
0%
0%
0%
7%
0%
0%
7%
0%
purplewave
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
bananabrain
2%
0%
7%
0%
0%
0%
0%
0%
0%
13%
0%
dragon
3%
0%
7%
7%
0%
7%
7%
0%
0%
0%
0%
mcrave
1%
0%
0%
0%
7%
0%
0%
0%
0%
0%
0%
microwave
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
steamhammer
3%
0%
0%
0%
7%
0%
13%
7%
0%
0%
0%
daqin
3%
0%
0%
13%
0%
0%
0%
0%
0%
13%
0%
zzzkbot
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
ualbertabot
10%
7%
7%
20%
7%
0%
13%
13%
13%
0%
20%
willyt
31%
100%
20%
7%
47%
53%
13%
0%
27%
20%
20%
ecgberht
3%
7%
0%
0%
13%
0%
0%
0%
7%
0%
0%
overall
4.72%
9%
4%
4%
7%
5%
4%
2%
4%
4%
3%
EggBot’s wins against WillyT—the majority of all its wins—seem to have come from very specific situations.
I enjoyed lurking in the AIIDE 2020 stream last night. The top winners were easily predicted: #1 Stardust, #2 PurpleWave, #3 BananaBrain. #4 terran Dragon did well, and #5 McRave playing zerg did great to finish as well as they did in the era of protoss domination. The race pattern continues: Protoss at the top and otherwise scattered randomly down the table, terran split between strong bots near the top and weaker bots near the bottom, and zerg clumped in the middle. Of course that is only a general pattern, every bot is on its own.
I will be doing my usual results analysis, I hope more than my usual. I’m curious about how some of the specific results came about.
Here is my version of the crosstable, computed from the detailed results. It exactly matches the official crosstable, only the presentation is different. A total of 5 games went uncounted due to GAME_STATE_NOT_UPDATED_60S_BOTH_BOTS, all of them involving UAlbertaBot.
#
bot
overall
star
purp
bana
drag
mcra
micr
stea
daqi
zzzk
ualb
will
ecgb
eggb
1
stardust
93.22%
83%
62%
93%
98%
99%
98%
93%
99%
98%
99%
99%
97%
2
purplewave
79.44%
17%
63%
45%
95%
71%
95%
87%
91%
93%
98%
99%
100%
3
bananabrain
69.61%
38%
37%
45%
55%
61%
71%
66%
94%
88%
84%
99%
98%
4
dragon
62.38%
7%
55%
55%
79%
57%
30%
53%
47%
80%
93%
94%
97%
5
mcrave
57.22%
2%
5%
45%
21%
77%
57%
65%
83%
89%
63%
80%
99%
6
microwave
54.47%
1%
29%
39%
43%
23%
29%
83%
93%
61%
65%
88%
100%
7
steamhammer
54.00%
2%
5%
29%
70%
43%
71%
22%
75%
95%
55%
83%
97%
8
daqin
50.14%
7%
13%
34%
47%
35%
17%
78%
9%
69%
96%
99%
97%
9
zzzkbot
39.89%
1%
9%
6%
53%
17%
7%
25%
91%
49%
92%
29%
100%
10
ualbertabot
31.14%
2%
7%
12%
20%
11%
39%
5%
31%
51%
45%
61%
90%
11
willyt
29.44%
1%
2%
16%
7%
37%
35%
45%
4%
8%
55%
74%
69%
12
ecgberht
24.28%
1%
1%
1%
6%
20%
12%
17%
1%
71%
39%
26%
97%
13
eggbot
4.72%
3%
0%
2%
3%
1%
0%
3%
3%
0%
10%
31%
3%
It’s curious that Stardust towered over every opponent—only BananaBrain was able to put up a serious fight—but did not score 100% against any. #4 Dragon upset protoss #2 PurpleWave and #3 BananaBrain, but was upset in turn by zergs #7 Steamhammer and #9 ZZZKBot. That is typical of tscmoo authored bots: They are tuned to do well against the best, and show some weakness against the rest. I’m surprised by UAlbertaBot’s relatively high finish; I expected it to be second to last.
In my original post on the bots registered for AIIDE I separated out 3 new bots, DanDanBot, Randofoo, and Taij. I didn’t mention the other new entrant, EggBot, which hadn’t appeared on the list yet. Of the 4 new bots, only EggBot ended up playing. None of the familiar old names dropped out. Way to go EggBot! In my book it did not finish last, it finished ahead of 3 no-shows, and ahead of everyone who was afraid to sign up at all. You don’t have to have a serious chance in the competition to take the competition seriously; opportunities are to be taken. The only downside is that I can no longer say “Eggie” to mean Ecgberht.
I am of course especially interested in Steamhammer’s results. Its rival Microwave squeaked ahead with 8 extra wins out of the 1800 games. #7 Steamhammer upset #4 Dragon and #6 Microwave by about 70% each, but it was crushed by #8 DaQin, scoring only 22% (where Microwave scored 83%). In my post Steamhammer’s prepared learning data for AIIDE 2020 I said “I also didn’t prepare against DaQin because I didn’t have recent data handy; I could have tried harder, but time was short.” That one omission was my downfall!
The race balance tables are not very interesting, since protoss dominates. And of course there was only one random player, UAlbertaBot. Nevertheless, here they are. The overall race balance:
overall
vT
vP
vZ
vR
terran
39%
31%
38%
58%
protoss
59%
69%
58%
72%
zerg
51%
62%
42%
73%
random
31%
42%
28%
27%
Each bot’s results by opponent race. I think the table tells more about the opponents grouped by race than about the bots listed on the left.
The AIIDE Competition just finished up, and so I'm gonna hold a live results stream TONIGHT at 8:30PM Eastern Time to announce the results and watch some replays. Come hang out, it should be fin!
Here are my implementation thoughts about opening timing data, as mentioned yesterday. I haven’t decided whether this is what I’ll do next, still thinking. I will at least do something similar eventually.
the data
1. Record timings for all of Steamhammer’s openings, in a static data file to be read at startup. The timings should include the time when each tech or production building finishes, plus the number of workers and the army size and composition at the end of the book line (meaning the units produced; some may have been lost), and maybe a few other things. Time resolution of one second or a few seconds is probably fine. Even so, timings will vary from game to game, so maybe the timings should give low and high values, or mean and variance, or something.
Another idea is to accept that new openings will be added and reject the work of timing them before they can be played. Keep a database of opening timings and update it after each game. That’s only safe on a server which plays one game at a time; for tournaments like AIIDE the database would have to be frozen and read-only.
2. For each game against a given opponent, record the earliest time that each enemy unit type is scouted, including buildings. Steamhammer already does this, with its “unit timing” skill (implemented using the skill kit). Also record the timing and army size and composition of the enemy’s first attack, or maybe its first few attacks, or maybe all of its major attacks. I’ll see what helps.
using the data
The data about the enemy can be used to recognize enemy builds earlier and more consistently. Most bots have a small repertoire of openings. As Steamhammer plays, it can check its scouting data for the current game for the closest matches among recorded games. If the records say that the enemy followed up the same way in all of the close matches, then the enemy strategy is predicted to that extent. You can see it as a kind of case-based reasoning: Find approximately matching cases and generalize from them.
We don’t have to fully predict the enemy strategy to react to it, we only need to know constraints on it. For example, if we’re going to add static defense (whether written into the opening or in reaction to the enemy army size), then we can check records of when the enemy first attacked: Don’t build sunks too early. If a clever enemy notices the vulnerability and attacks early, too bad, but then we have a new game record and will know for next time.
The main purpose of the opening timings is to choose openings. The records of enemy games tell us the range of enemy play. When choosing an opening at the start of the game, before any scouting information is available, we can try to pick one with unit mix and timings that counter the range of enemy play. One basic adaptation is to try to always be a little greedier than the enemy, to get ahead in economy (except when the enemy is too greedy, then we can rush). That’s a principled way to choose 5 hatch before pool versus Dragon. Another is, if the enemy prefers certain units, we can pick openings that produce counter units at the right time.
Of course the data can also be used to adapt openings when our first choice was not right for the enemy’s actual play. It will be a while before Steamhammer can do that with generality.
Time for another update on my plans, since they change almost as fast as I can think up changes. After the big push for AIIDE 2020 I have been working slowly, but I’m still making progress.
I’ll release a version 3.2.20 soonish, with small bug fixes and other minor tweaks. For example, I found the cause of failed macro hatchery conversion, and I’m correcting it now. None of the fixes should make a big difference in playing strength, but I know from experience that many small improvements add up to a big improvement. Next, if I can get it to work this time, will be version 3.3 on BWAPI 4.4.0, a necessary upgrade. I expect I will be unable to resist features enabled by 4.4.0, like delaying overlord speed until after hive and tracking enemy terran scans.
Then I want to at long last make visible progress on my main objective of strategy adaptation. I’ve changed my mind repeatedly about what the next step should be, and the result is that I have nonworking partial implementations of several complex features. I don’t see it as wasted work, because all the features are necessary, but it does mean I have no progress to show off. I want to bite off a piece small enough that I can swallow it down in time for the year-end SSCAIT tournament. I think it should be either the opening timing stuff that came up yesterday (it does give useful though ambivalent hints), or else some machine learning stuff I’ve mentioned earlier, whose code has been sitting in an almost-finished state, not yet passing small-scale tests and unready to be integrated into the whole program for its big test. Whether I make it in time for SSCAIT or not, I expect my choice to be the theme of the 3.4.x series.
The latest SSCAIT weekly broadcast included a Steamhammer-Dragon game where Steamhammer went up to five hatcheries before it started its spawning pool, a crazy risky build that loses to any early attack. Dragon did not attack early and was hammered into the ground by huge macro. Sonko, narrating the game, rightly concluded that Steamhammer’s opening was the result of learning, though the opening timing idea he mentioned is still on my to-do list. Anyway, five hatches before pool is one of Steamhammer’s favorite builds versus Dragon, but it also plays others, and not always successfully. I thought I’d briefly list a few recent games to show how tricky it can be to choose openings. Even if you know the enemy’s timings, it is still tricky.
7 hatch 6 pool speed, a zergling rush that starts slower than the pool-first rushes but hits harder because of the two hatcheries and the zergling speed research. The opening leaves only 7 drones to power the two hatchery production, so it’s very much all-in. Dragon saw it coming and reacted with a bunker in its main, though for some reason it followed with an expansion CC which it lost without canceling. Even so, Dragon’s defense was better than Steamhammer’s attack, the all-in failed after vultures arrived, and Dragon was in a winning position. But (no doubt due to some bug) terran left only 1 SCV on gas and suffered a severe vespene shortage, and compensated by going mass vultures, not a strong backbone unit for a terran army. The game turned much more exciting than it should have been.
9 pool into 2 hatcheries, with early but not heavy pressure. Again Dragon made a bunker in main and defended easily. Steamhammer droned up well, keeping pace with the terran economy, but could not also make a strong army. Zerg ran into trouble.
5 hatch before pool, like the broadcast game, except this time Dragon got a vulture into the zerg base before defense was quite ready, then followed up with wraiths when defense was not even close to ready. Zerg struggled but finally stabilized, and the game was on. This is the most interesting of the games.
The first two games are fast rushes. One was all-in and the rush failed, but the opponent’s game plan was discomposed by an unforeseeable factor. The other was not all-in and looked successful at first, but did not actually keep up. Even if you recognize the enemy’s tech and attack timings, it’s tricky to choose an opening that exploits them successfully. Starcraft is complicated! The third game is a reminder that the enemy gets a vote, and can change up its timings, or can play its builds sloppily so that the timings vary. At a minimum, you have to take into account the range of timings.
Today’s ASL 10 games were excellent. Every game was exciting. There were cool and unusual events, such as turrets placed solely for deception, and 3-base zerg versus 3-base zerg. Recommended.
Meanwhile, to fill the time as I make my second attempt to upgrade Steamhammer to BWAPI 4.4.0, here is another unusual game. The pictures show a queen killing an ultralisk with broodling, something I mentioned by name in the latest change list. See the queen’s energy level and the ultralisk remains. The game is weak on both sides, but as I forecast, Steamhammer was more ready than its opponent for the rare situation.
The game was played over a week ago. If Crona is already updated to fix some of the mistakes here, that’s no surprise. Steamhammer has a related improvement.
Steamhammer has a special case reaction in the building manager to ensure that it builds enough macro hatcheries when it is contained: If a drone sent to build an expansion hatchery did not make it there, and zerg suffers from a larva shortage, then the expansion is converted to a macro hatchery instead. A drone is assigned to build the hatchery in base.
The feature seems to have bit-decayed and it is not working reliably. I’ve seen a few games where Steamhammer was contained and desperately kept sending drones to try to expand, while it had a larva shortage and its mineral bank was building up.
At the same time I see the diametrically opposite bug in Steamhammer’s terran play: When terran is contained for a long time, it starts to build “macro command centers” inside its base, which essentially act as oversize 400 mineral supply depots. It doesn’t know how to lift them off and land them elsewhere, and it doesn’t need more SCV production, so it’s pure loss.
What the what?!?
Logically, the bugs must be unrelated. The zerg special case explicitly checks that the building is a zerg hatchery. But it behaves exactly as though it had the races mixed up. If the two bugs annihilated like matter and antimatter, they would create energetic play.
Both bugs are on my list to solve soon. The terran bug is as serious as the zerg one in terms of wasted resources.