蒙特卡洛方法:
随机的对当前局面进行后续状态模拟,根据模拟结果决定下一步行动
下面是蒙特卡洛树的实现原理:





下面是具体实现,详细讲解见注释。
一些优化:
1.中心邻域搜索:根据启发式信息,每一步棋子应当选择与对手上一步棋子周围的一步,于是可以只搜索对方上一步周围的后继状态
2.必胜状态:如果已经能一步走成必胜局面,直接走这一步,或者一个后继状态对应的对手所有后继状态都是失败的,则这步必胜。
3.判断棋盘状态:使用std::set(平衡树),也可以使用hash算法
Tips:调整select_num和sta_num可以让AI获得不同效果
#include
#include
可能的改进策略:
1.快速生成棋盘序列,以快速进行大量多次模拟
2.小范围可以使用博弈思想打表或者暴力查找必胜状态
3.使用并行计算
欢迎大佬萌帮忙改进!~