CS303 2021Fall Project1 Reversed-Reversi
CS303《人工智能》课程的第一个大作业,反向规则黑白棋(传统黑白棋是棋子多的一方获胜,反向黑白棋是棋子少的一方获胜)。
这个仓库包含以下内容
- 黑白棋模拟器
ReversiSimulator
(用matplotlib.scatter
即可实现简易的棋盘打印功能) - Minimax搜索 +
$\alpha-\beta$ 剪枝agents/
- 评估函数的设计
agents/
(位置权重,稳定子,前沿子,行动力,时间权重(考虑得不够多)) - 遗传算法调参
evolve.py
(重头戏,一众Minimax里面获胜变成精挑参数比赛)
快速使用
*这本质是个调参项目,重点是调参而不是下棋,运行之前先pip install -r requirements.txt
python evolve.py
默认演化1000代,可以ctrl+C
打断然后去checkpoints/
里看结果
规则
- 提交一个
.py
文件,包括一个class AI
,实际操作时会依次调用双方AI的go
方法,结果放在self.candidate_list
中,取最后一个作为这一方决定的落子点。 - 每一步限制5秒,5秒后打断玩家并从
candidate_list
中去最后一个作为落子点。违规行为(如落子点不能落子,抛出未处理的异常等)会被直接判负。 - 比赛包含排位赛和循环赛两部分,排位赛不入总分,循环赛中每个玩家会与所有其他玩家分别执黑执白对战两局。
- 每个玩家只能使用一个CPU线程,可以使用的第三方包:
numpy
,timeout_decorator
,numba
(后来加入)。
前置知识
详细讲过的:Python入门,图搜索算法,Minimax搜索算法 只是提到过的:MCTS
使用方法
这个仓库原本只用来下黑白棋,不过其他模式的超参数也可以用它来调整(毕竟AI年年下棋,说不定万一用得上),你需要:
- 一个(或者多个)Agent对象,实现两个方法:
self.to_list()
把自己的参数转化为列表,self.from_list(list)
从一个列表里加载参数,就可以用GeneticAlgorithm
里的方法进行遗传变异 - 一个(或者多个)种群评估函数(
fitness
) - 编写你自己的
evolve.py
脚本,可以定义自己的评估过程和参数的上下界,遗传变异的选择参数和变异用的随机函数都可以自行决定
碎碎念
当时用的遗传算法脚本比这个要简陋得多,后来才做成这样一个“像仓库的样子”。不过用这个方法拿到了双榜前10,可能是因为大家都写MInimax算法,于是就变成调参比赛,这样的话能拿出遗传算法的思路感觉比手动调还是更有意思
评估函数设计中,整个过程共用一套棋盘位置权重参数是一个绊脚石,按道理来讲,前中后期用不同的参数效果理论上更好。如果AI还是继续以往年年下棋的作业,可以尝试一次性调更多的参数
本人没有学过OOAD,没有设计模式的概念,代码风格比较随意(