记一个五子棋AI
在几年前的某个下午,我和她下五子棋,非常惨地,不记得是多少局了,只记得我全输了。于是,我就想写一个五子棋AI,从另一个角度去战胜她。
最智障的AI
这一版本的,简单来说就是,堵“活三”、“死四”,在能一子多用的点位落子。很快,我就发现了它与五子棋小白相比,唯一的优势就是不会看漏,仅此而已,对于“双活三”等杀棋毫无防备。
MinMax算法与Alpha-Beta剪枝
在B站上搜索,看有无关于Python和五子棋的视频,于是就找到了这个:从零开始,编程制作一个五子棋游戏!【Python】
很可惜的是,我这个小菜鸡没能学会,并且这个UP主实现的Python版太慢了。
DQN
浅浅地学习了深度学习和强化学习后,觉得DQN似乎可以完成这个任务。先是在3×3的井字棋上进行尝试,并没有成功。后续对深度学习继续学习后,更换了神经网络后,依旧没有成功。
当时的我告诉了她,那次和她下棋惨败后,一直想做一个五子棋AI去战胜她,还向她展示了这个失败的井字棋AI。
MCTS+策略价值网络
已不记得是怎么的,在Github上搜索了Gomoku,看到了这个项目:AlphaZero-Gomoku
当时的我想的只是替换该项目的神经网络,并不关注MCTS(不过作者也没怎么介绍MCTS)。自己去训练了15×15棋盘上的五子棋,训练了差不多两天,前几手下的还像那么回事,后面就不太行了。这个训练起来太慢了,有很多时间都花在了MCTS模拟上。而且没有GPU的话,推理的时候也很慢。
MCTS
又一次在Github上搜索了Gomoku,看到了这一个项目:gomoku_mcts,结合这一个视频:AI如何下棋?直观了解蒙特卡洛树搜索MCTS!!!,学会了MCTS,很快也看明白了那个MCTS+策略价值网络的项目。
因为Python的程序太慢,就写了C#版的。不得不说,ChatGPT真是太好用了,让ChatGPT把Python代码自己转为C#代码,基本上没有错误,复制下来基本上就能用了。在C#版上继续进行了许多优化,如:扩展子节点时,根据空白位附近棋子分布对该位置进行评分,取评分最高的前k个;roll out时,也不再纯随机,而是对评分进行softmax运算后,按概率进行roll out。
至此已经实现了一个对战普通人有不俗胜率的五子棋AI了。
不过我不知道这个五子棋AI能否战胜她,因为她已经不在我的身边了。。。
将来
目前的版本,后手能力依旧较弱,后手对弈JS+MinMax的AI,在同等时间内,还无法取胜。
等我有了自己的GPU,也许会去完成MCTS+策略价值网络的。不过,如前面所说,她已经不在我的身边了,做出了一个强大的AI,似乎也没什么意义了。