CS303 2021Fall Project1 Reversed-Reversi

CS303《人工智能》课程的第一个大作业,反向规则黑白棋(传统黑白棋是棋子多的一方获胜,反向黑白棋是棋子少的一方获胜)。

这个仓库包含以下内容

  1. 黑白棋模拟器 ReversiSimulator(用matplotlib.scatter即可实现简易的棋盘打印功能)
  2. Minimax搜索 + $\alpha-\beta$剪枝 agents/
  3. 评估函数的设计 agents/ (位置权重,稳定子,前沿子,行动力,时间权重(考虑得不够多))
  4. 遗传算法调参 evolve.py(重头戏,一众Minimax里面获胜变成精挑参数比赛)

快速使用

*这本质是个调参项目,重点是调参而不是下棋,运行之前先pip install -r requirements.txt

python evolve.py

默认演化1000代,可以ctrl+C打断然后去checkpoints/里看结果

规则

  1. 提交一个.py文件,包括一个class AI,实际操作时会依次调用双方AI的go方法,结果放在self.candidate_list中,取最后一个作为这一方决定的落子点。
  2. 每一步限制5秒,5秒后打断玩家并从candidate_list中去最后一个作为落子点。违规行为(如落子点不能落子,抛出未处理的异常等)会被直接判负。
  3. 比赛包含排位赛和循环赛两部分,排位赛不入总分,循环赛中每个玩家会与所有其他玩家分别执黑执白对战两局。
  4. 每个玩家只能使用一个CPU线程,可以使用的第三方包:numpytimeout_decoratornumba(后来加入)。

前置知识

详细讲过的:Python入门,图搜索算法,Minimax搜索算法
只是提到过的:MCTS

使用方法

这个仓库原本只用来下黑白棋,不过其他模式的超参数也可以用它来调整(毕竟AI年年下棋,说不定万一用得上),你需要:

  1. 一个(或者多个)Agent对象,实现两个方法:self.to_list()把自己的参数转化为列表,self.from_list(list)从一个列表里加载参数,就可以用GeneticAlgorithm里的方法进行遗传变异
  2. 一个(或者多个)种群评估函数(fitness
  3. 编写你自己的evolve.py脚本,可以定义自己的评估过程和参数的上下界,遗传变异的选择参数和变异用的随机函数都可以自行决定

碎碎念

当时用的遗传算法脚本比这个要简陋得多,后来才做成这样一个“像仓库的样子”。不过用这个方法拿到了双榜前10,可能是因为大家都写MInimax算法,于是就变成调参比赛,这样的话能拿出遗传算法的思路感觉比手动调还是更有意思

评估函数设计中,整个过程共用一套棋盘位置权重参数是一个绊脚石,按道理来讲,前中后期用不同的参数效果理论上更好。如果AI还是继续以往年年下棋的作业,可以尝试一次性调更多的参数

本人没有学过OOAD,没有设计模式的概念,代码风格比较随意(

GitHub

View Github