Steamhammer is getting auto gas stealing
I’ve just finished implementing AutoGasSteal
, which means that Steamhammer can make its own decisions about when to steal gas. I also added random gas stealing, just because it’s easy. As I wrote in November, my main purpose is to stop the gas steal code from bitrotting like it did before; regular gas stealing in regular games will be my test suite. I doubt that stealing gas will make much difference in Steamhammer’s strength, but it’s easy to imagine that a few opponents may find themselves confounded.
There are now 4 ways to order a gas steal:
- Write it into the build order with
"go steal gas"
. If Steamhammer hasn’t started scouting yet, this also sends out the worker scout to find the enemy base. - Write your own C++ code to order a gas steal (it amounts to setting a flag). For example,
StrategyManager
could decide based on scouting information. - New: Configure a value for
RandomGasStealRate
, a probability from 0 to 1. Steamhammer will randomly choose to steal gas in that proportion of games. - New: Configure
AutoGasSteal
astrue
. Steamhammer will decide based on the opponent model whether to steal gas.
If any of these methods orders a gas steal, Steamhammer will go steal the opponent’s gas if it can. For now, the scouting worker that will steal gas heads out at the usual time (whenever "go scout"
or one of its variations comes up in the build order). I added some data so that later Steamhammer can decide based on experience when to send the gas steal worker. I would like the bot to decide gas steal timing and scout timing on its own. I’m not sure whether I’ll get to that in this version.
For the first pass, I implemented auto gas stealing in a simple way, with the UCB1 algorithm that many bots use for opening learning. It keeps data for each opponent to remember how often it has tried stealing gas and how often it has won with and without, and chooses one or the other based on the UCB values. A small amount of fictitious data whispers the lie in its ear that it has tried stealing gas a couple times and lost. That makes it reluctant to pay the cost of stealing gas unless it sees a benefit. In a later version I may switch it to a contextual bandit algorithm so it can take more information into account—the opponent model has plenty more information available.
It works for all races. Just turn it on in the configuration file. I did find one new bug in the gas steal, a rare bug when emergency reactions interfere with starting the refinery building, but that will be fixed before long.
Now I need to go run a lot of tests!
Comments