Mzinga is my open-source AI for the board game, Hive, and I can’t believe that the last time I posted it was all the way back in Summer 2016.
So much has happened since then!
At the time, my focus was on the Mzinga Trainer, a tool for improving my board evaluation function, ie. if I look at a given board, how accurately can I answer: who is winning and by how much?
The Mzinga Trainer does this through a genetic evolution algorithm, whereby a population of AIs (each with their own evaluation function) endlessly battle one another, and the winners earn the right to “breed” new AIs (passing on a mix of both parents’ functions) while the losers get culled from the population.
So in July 2016, I was just getting AIs to battle one another. Fast forward to July 2017, and I had:
- A feature-rich Trainer with dozens of options, including support for running multiple battles concurrently on different processors
- A refactored AI, making it much easier to validate that I was implementing the algorithms properly
- Some key performance tests to evaluate changes to the core code
I had also spent several hundreds of hours of computing time in running experiments with the Trainer. Hundreds of AIs lived and died as I tweaked parameters and followed the most successful AIs (and their children). But by July 2017 I stepped away from Mzinga and started spending my spare time on other projects.
Then around December of last year, having not touched Mzinga for months, I suddenly had the inspiration for how to fix a particular performance bug I’d had, and by the start of the new year, I was back on the Mzinga bandwagon.
Since I’d spent so much time on the Trainer, from a regular user’s perspective, Mzinga hadn’t changed much since 2016. The Viewer (where you can actually play games) had seen some minor bug fixes, and while the Engine (with the core of the game and the AI), was technically faster and stronger, I doubt it was noticeable to most players. I regularly lose to people playing for the first time, and I could still beat the Mzinga AI.
I spent most of January focused on code performance – nothing AI-specific, nothing that needed any study or research, just analyzing the code and removing every little bottleneck I could find.
Then, after nearly eight years on my venerable, dual-core laptop, I finally bit the bullet and bought a new PC. A custom, fancy, rocking, eight-core beast with horsepower to spare. And wouldn’t you know, suddenly I had an interest in hitting the old chess AI sites and researching how the best chess AIs take advantage of multiple processors.
Now Mzinga’s AI is starting to get fancy:
- It spreads its search across multiple processors, via “Lazy SMP”
- It searches during your turn instead of waiting, aka “Pondering”
- When it finds the “best move”, it peeks just a little further ahead to make sure, via “Quiescence Search”
- It keeps you updated each time it finds a better move
On top of all that, everything is all nice and asynchronous, meaning I can cancel a search when I want to. I don’t have to say, “search 2 moves deep” or “search for 5 seconds” and then sit and wait for it to stop. If I want to stop it early, I can. If I want to just let it search, I can, and stop it when I’m good and ready.
Now sometimes the AI beats me.
I’ve also started addressing the Mzinga Viewer:
- It’s faster and more responsive
- It’s finally got some options, so you can tweak your experience:
- Do you like your pieces with the flat or the pointy side up?
- Do you want pieces that can’t move to be “grayed-out”?
- Do you want to see certain things highlighted, like your opponents last move or what the valid moves are?
Some of these features are new, but some already existed in the Viewer and were always on because I liked them. Now you can turn them off if you don’t.
These are just a taste of how much Mzinga has changed, and there’s still more to come! Check it out today if you haven’t and send your feedback my way!