sg-first / DL-Military-chess-AI

Military chess AI using neural network for situation evaluation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

基于神经估值网络进行博弈树搜索的军旗AI算法

摘要

目前的军棋博弈程序大多是采用基于人类经验的局面评估模型,这种模型存在不确定性高、主观因素大、调整参数困难等多方面问题。我们研究了一种针对不完全局面的三层决策模型,该模型基于规则进行暗棋推理和局面特征提取,联合神经网络局面评估模型进行博弈树搜索,通过棋谱和自我对弈方式来训练。

暗棋推理

待完善

局面特征提取

博弈树中节点估值由局面评估算法决定。因此正确提取局面特征是搜索算法能正常工作的基础。根据不同种类的棋类游戏规则的不同,对于军棋的局面特征提取,我们参考了文献[6]的方案并对其进行了改进。提取下列几种特征:

棋子的固定价值

军棋中从排长到司令的8种类型棋子的价值按照棋子的大小关系从小到大递增。

棋子所在位置的增加价值

  • 在军棋棋盘中有5种类型的棋位,每种不同的棋位上棋子的移动能力不同。移动能力越强则在该位置增加的价值越多。在公路上与在铁路上棋子的移动能力有所不同,在公路上棋子每次只能移动1格,而铁路线上的棋子可以移动到铁路线上其他任意位置上。所以铁路线上的棋子增加的价值就更多。
  • 行营中的棋子不可以被攻击,而且敌方行营距离敌方大本营更近,所以敌方行营的价值更高一些。

相邻棋子间的影响

相邻棋子之间存在相互影响,并且这些影响分为积极影响和消极影响。若某一棋子相邻己方棋子如果比该棋子更大,那么对该棋子有保护作用,产生积极的影响,会增加该棋子的价值。相邻地方棋子如果通过概率推断得出其比我方棋子大,则相邻敌方棋子会产生负面作用,减小该棋子的价值。对相邻的棋子,我们考虑两个因素影响棋子的价值,它们是:

  • 该棋子附近本方棋子中大于该棋子价值的棋子的价值大小
  • 该棋子附近敌方棋子中最大的价值大小

对己方军旗的保护和对敌方军旗的进攻

对于军旗的保护,我们考虑后三排,包括6个公路线上的棋位,7个铁路线上的棋位、两个大本营和两个行营。其中对两个行营,特别是对军旗附近的那个行营控制十分重要,该营可控制附近8个位置的棋位,其中一个棋位到军旗只有一步,二个棋位到军棋只有两步,一旦让对手控制该棋位后,对方可防可守。本方只有调集大量的兵力回防,使用于攻击的兵力下降。

基于上述原因,我们规定后三排军旗保护的原则为:

  • 计算该位置到军旗的最少步数,靠军旗所在的棋位越近,棋子价值增加15/最少步数。
  • 若我方棋子临近敌方军旗,则此时的最佳策略是直接吃掉敌方的军旗。基于这种原则,吃掉军棋的奖励值应该是无穷大,所以这里设定吃掉对方军棋的策略会对整个局面的评分增加1000,以鼓励我方棋子吃掉敌方军旗。

博弈树极大极小搜索

极大极小搜索先将博弈树展开到指定层数l,从展开的第一层到第l层,奇数层为我方行动,偶数层为对手行动。对l层的各个局面节点使用局面评估函数进行估值。这样可以在l-1层节点n的子节点中选择最大/最小的节点评分作为的节点n评分(如果局面估值大表示利于我方,那么我方行动的层选择最大值,对手行动的层选择最小值),这样可以获得层所有节点评分,再对层递归实行此过程,直至获得第一层所有局面的评分,选择评分最大的节点即为最优决策。

如果局面评估函数完全准确,那么直接对第一层使用局面评估函数进行估值就可以得到最优结果。但由于局面评估函数总存在偏差,一般来讲,距离终局越近局面评估越准确,因此要尽可能搜索更多层。

极大极小搜索需要对博弈树进行层的充分展开,尽管可以使用Alpha-Beta剪枝减小搜索空间,但对于状态空间较大的游戏,这种详细的搜索在计算上并不可行。因此使用神经估值网络进行改进。

神经估值网路

输入数据包括:

  • 目前棋盘
  • 概率矩阵的每一行对应棋盘坐标
  • 目前回合数
  • 我方棋子数
  • 对手棋子数
  • 局面特征

为了更好的对概率矩阵和棋盘提取特征,首先将棋盘与概率矩阵拼接为21×21的矩阵,空余位置使用零填充。其后的网络结构参照了棋盘大小相近的小型五子棋神经网络模型AlphaGomoku[10],该模型为AlphaZero[11]一个小型化有效实现。我们最终设计的结构可参见value_net.py

模型对于棋盘和概率矩阵两个二维张量采取使用卷积层先扩大、后缩小的方法,得到一个较小的特征图,将其Flatten后与其它一维特征共同参与全连接层运算。该做法使得这两个输入并不会在最后的全连接层运算中占据过多“席位”,强调了其对基于规则提取的特征的辅助作用。最终,通过Sigmoid层得到结果,作为对输入局面胜率的估计。

对局训练

未训练过的模型与全国机器博弈大赛中其它所有AI程序均对局一次,每次对局都会自动保存棋谱并标注胜负。所有对局结束后,统计整体胜率,将棋谱拆分为局面,按所属的对局胜负对所有局面进行标注(标签为胜负两类)。这样就得到了可用于训练的数据。使用训练得到的新模型继续与其它AI程序进行对局,每次获得新数据后,将新数据加入原先数据中进行训练,这样做是为了避免特殊对局造成模型效果反复。每次训练都基于历史胜率最高的模型进行[12],当胜率到达一个阈值后,开始进行随机自对局混合训练,即每次对局随机选择对手(其它AI程序或历史模型)。使用这种增量训练可以增强模型对不同类型对手的应对能力,使其能够全方位成长。

解决数据不平衡问题

待完善

研究人员

  • zmk负责了整个算法的设计与大部分模块的实现,编写了棋谱复盘工具。也负责了训练工作
  • 艾德润负责了蒙特卡洛搜索模块的实现(当前未使用)、编写了对局工具。也负责了训练工作
  • 马一民负责了训练数据格式转换模块的实现。也负责了训练工作。

成果发表

  • 论文An Evolutionary Game Tree Search Algorithm of Military Chess Game Based on Neural Value Network发表于2020年的**控制与决策会议(CCDC2020)

引用

  • [6] 张红明. 四国军棋人机博弈系统及有约束推理的研究和实现[D].南京航空航天大学,2010.
  • [10] Xie, Zheng, Fu, XingYu, Yu, JinYuan. AlphaGomoku: An AlphaGo-based Gomoku Artificial Intelligence using Curriculum Learning[J].
  • [11] Silver D , Hubert T , Schrittwieser J , et al. Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm[J]. 2017.
  • [12] Zhu F , Guan S . Ordered incremental training with genetic algorithms[J]. International Journal of Intelligent Systems, 2010, 19(12):1239-1256.

程序目录

About

Military chess AI using neural network for situation evaluation


Languages

Language:Python 100.0%