Thank you so much to all of you who chose to submit an agent to the CSC384 Othello Competition this year.
Initially, each agent competed with every other agent on board-dimension of 6 with a timeout of 10 seconds. Agents played each opponent 2x, one as the "light" player and one as the "dark" player. Games where an agent timed out were discarded as were games resulting in draws.
Results from Round One (Regular Season)
Then, the 9 top ranking players played one another on board-dimension of 8 (which is a standard Othello board size) and a timeout of 10 seconds. Agents again played each opponent 2x, one as the "light" player and one as the "dark" player.
Results from Round Two (Finals)
Finally, the 3 top ranking players played one another on board-dimension of 8 (which is a standard Othello board size) and a timeout of 10 seconds. The results:
The final round demonstrated Weecyco AI (agent_1003947045) to be the winning AI; Shadowboxer (agent_goatcher) and Iago (agent_zouzhuoz) tied for second place.
Some "tips" from those with strong performances are below. Thank again to eveyone who chose to play with us!!
agent_dangbran"I decided to concentrate purely on improving the utility function because I felt that it would have a greater impact on performance then, for example, implementing an iterative deepening system (I wanted to concentrate on one thing only). The main thing that I did to improve the utility function was to add "bonus points" whenever a move resulted in my AI having stable pieces that the opponent can not flip. The more stable pieces that result from a move, the more bonus points are awarded. However ... it was very [computationally] expensive to check whether or not a piece was able to be flipped. As a result, the timer sometimes timed out, which meant that this method had to be abandoned.
"... I thought that it was possible to get a rough estimate using a much cheaper algorithm. I played multiple games against the AI and I realized that edge and corner spaces are preferable. I then added bonus points, one for each friendly piece on any of the four edges. This is because although having a piece on the edge is not always stable, it is often much more likely to be stable and harder for the opponent to flip, then, say, a piece somewhere in the middle of the board. Furthermore, I noticed that having a piece on the edges gives many opportunities to flip the opponent pieces in the middle, making edge pieces even more valuable. A corner is even more valuable real estate then an edge. Corner pieces can not be flipped, and they sometimes give some of the rare opportunities to flip edge pieces. I realized that whenever I won a game, I always had at least 3 of the corners under my control. Therefore, I gave 3 bonus points to each corner piece the player owns. Finally, since corner pieces are so valuable, it stands to reason that one should not give an opportunity for the opponent to put a piece on the corners. Each corner directly touches two squares on the board. Having a piece of your colour at either of those squares is the only way for the opponent to acquire the corner, so one should avoid putting their pieces at those locations. I therefore gave penalty points if there is a friendly piece bordering any of the corners. All of this was only in O(n), much cheaper than my initial idea. "
agent_weiszben"In Othello there are certain positions which are more stable than others; in fact there are some that when captured can't be recaptured by an opponent.
The four corners of the Othello board are such positions. When someone places a tile in on of the corners, that position cannot be recaptured because the next player cannot place stones outside of the board. Once a player has captured a corner, they can abuse the stone to keep recapturing any enemy stones between the corner and their newly place stone. This gives the agent an advantage. On top of this, the agent should avoid placing stones in the three positions surrounding each of the corners. If the agent where to place a stone here, the next agent can likely abuse the opportunity and place the stone in the corner. The reason why the idea of capturing corners is a good idea is because the agent will typically only look until a certain depth, but in general the corners might lead to some advantageous state for our agent beyond the depth it can look. So just knowing that these positions are good helps the agent plan better for the future.
Beyond this, the agent's heuristic is a carefully weighted sum of the two heuristics above and the one provided. This was just done through some trial and error, although I can say that I weighted the corner positions as more advantageous than not placing in the closeby squares. Note: The corners add to the value of the position, while the nearby squares remove value from the position."
agent_niyihan
"I don't think I have any secret recipe except that I implemented an extraction strategy, that the agent keeps track of a global timer and immediately return to its root once the timer passes 9.8 seconds. Then the agent decides the best move based on current information. This strategy essentially exploits nearly full time every round to decide for a best move."