Finished 349/5237 around top 300 in the Gold League.
This is my best result in a contest, so far and it marks my 3rd contest finishing in the Gold League. I know it’s hardly impressive, but it is for me, I see progress, indeed very small and rather slow, but I feel improvement in myself.
I always have very hard time managing my time for contests and I usually end up with most of the time spend on the proper simulation of the game state and I always complain that games are very hard to simulate, because we have to take into account physics, vectors, randomness and so on. But when I saw this task, I instantly realized that it would be friendly for simulation and with low branching factor, I said to myself that this is my time to shine
So what I did:
I was very busy during the contest we had releases at work, I had to teach several lectures at a university course, 2 family vacations, … But I somehow managed to code for the contest at least 3 hours a day, mostly during the night, unfortunately.
Wood 2 league
I output the action, which gives the farthest position on the hurdle track, without a stun for my player.
Wood 1 league
Things started to get tricky. Tried several “if/esle” strategies, nothing worked. At the end I’ve evaluated each move and summed up the positions of my players, choosing the move with the best sum
Bronze/Silver leagues
Quickly realized that “if/esle” strategies won’t work. Decided to make the simulation of the game state right away, as excepted this time a decent simulation was done in a couple of hours, referencing the official referee.
Afterwards I’ve tried to evaluate the moves, but didn’t like the approach. For first time I’ve decided to implement early(before the silver league was opened) a search algorithm for the game and I was pretty sure that a Genetic Algorithm would do very well. I’ve considered the task as an optimization one, try to improve my score as much as possible, that’s mainly why I chose GA. I’ve managed to implement it relatively quickly using almost the same approach and code that I’ve described in my CG blog post.
The most important thing in a Genetic Algorithm is the evaluation function. My idea was to simulate the mini games until the first Game Over and evaluate each separately:
HURDLE: closer to the finish, better
ARCHERY: closer the center, better
SKATING: more distance traveled, better
DIVING: bigger score, better
For each mini game evaluation I also include bonuses for gold and silver medals. If I do not have medals in a mini game I divide the evaluation by 2.
And this actually worked pretty well when the Silver and Gold leagues were opened I was directly promoted in them automatically. I couldn’t believe the results ![]()
Gold league
Since my GA played well so far I thought that it’s the right choice and I could reached the Legend league using it. I’ve tried improving the simulation, the evaluation function, the initial population to start with the perfect moves for all mini games, tweaking the GA parameters… but unfortunately nothing worked and for days I didn’t improve my rank.
I’ve consulted the discord server and saw that there were other players using GA with better ranks than me. But the main topic was that majority of players are using MCTS. I had implement MCTS on CG before but only for sequential games. In one simultaneous game I’ve managed to use MCTS. I’ve tried to port it for this game, but only a couple of days were left and I couldn’t.
Wins
I’m very happy that I’ve managed to implement a search algorithm early in the contest.
I’ve tried to improve my approach based on my remarks from the previous constest.
Mistakes
Considering the task as an optimization one was wrong. I didn’t include the opponent score in the final evaluations of the state.
I’ve ignored MCTS until the end of the contest.
Overall I liked the contest, I even gоt a little obsessed with it and afterwards I had a very big desire to reach the Legend league and I’m happy to report that I’ve managed ![]()
Reaching top 100 in a bot contest is still on the list of my dreams ![]()