今天,我们来教AI下国际象棋

人工智能 2021-06-01 11:11www.robotxin.com人工智能专业
选自medium

作者Ansh Gaikad

机器之心编译

编辑陈萍

国际象棋是一种在棋盘上玩的双人战略棋盘游戏,棋盘格式为 64 格,排列在 8×8 网格中。有人无聊的时候会找电脑下国际象棋,但也有人无聊了会教电脑下棋。

国际象棋可以说是最棒的棋盘游戏之一,它是战略战术和纯技术的完美融合。每位玩家开局时各有 16 枚棋子一王、一后、两车、两马、两象和八兵,各具不同功能与走法。真人对弈可以凭借玩家的经验,步步为营。那么,对于一个机器计算机,你该如何教会它下棋?近日,有人在 medium 上发表了一篇文章,详细解释了如何教计算机玩国际象棋。

本文将从 5 个方面进行介绍

Board 表示;

Board 评估;

移动选择;

测试 AI;

接口测试。

在开始之前,你只需要提前安装 Python3。

Board 表示

,你需要对棋子背后的逻辑进行编码,即为每个棋子分配每一次可能的合法移动。

python-chess 库为我们提供了棋子的移动生成和验证,简化了工作,安装方式如下

python-chess 库安装好后,导入 chess 模块并进行初始化

在 notebook 中的输出如下所示

board 对象是一个完整的 board 表示,该对象为我们提供了一些重要的函数,例如,board.is_checkmate() 函数检查是否存在将杀(checkmate),board.push() 函数附加一个移动,board.pop() 函数撤销一次移动等。阅读完整的文档请参阅https://python-chess.readthedocs.io/en/latest/

Board 评估

为了对 board 进行初步评估,必须考虑一位大师在各自比赛中的想法。

我们应该想到的一些要点是

避免用一个小棋子换三个兵;

象总是成对出现;

避免用两个小棋子换一辆车和一个兵。

将上述要点以方程形式进行表达

象 > 3 个兵 & 马 > 3 个兵;

象 > 马;

象 + 马 > 车 + 兵。

通过化简上述方程,可以得到象 > 马 > 3 个兵。同样,第三个方程可以改写成象 + 马 = 车 + 1.5 个兵,因为两个小棋子相当于一个车和两个兵。

使用 piece square table 来评估棋子,在 8x8 的矩阵中设置值,例如在国际象棋中,在有利的位置设置较高的值,在不利的位置设置较低的值。

例如,白色国王越过中线的概率将小于 20%,我们将在该矩阵中将数值设置为负值。

再举一个例子,假设皇后希望自己被放在中间位置,因为这样可以控制更多的位置,我们将在中心设置更高的值,其他棋子也一样,因为国际象棋都是为了保卫国王和控制中心。

理论就讲这些,现在我们来初始化 piece square table

通过以下四种方法得到评估函数

第一步检查游戏是否还在继续。

这个阶段的背后编码逻辑是如果它在 checkmate 时返回 true,程序将会检查轮到哪方移动。如果当前轮到白方移动,返回值为 - 9999,即上次一定是黑方移动,黑色获胜;否则返回值为 + 9999,表示白色获胜。对于僵局或比赛材料不足,返回值为 0 以表示平局。

代码实现方式

第二步,计算总的棋子数,并把棋子总数传递给 material 函数。

第三步,计算得分。material 函数得分的计算方法是用各种棋子的权重乘以该棋子黑白两方个数之差,然后求这些结果之和。而每种棋子的得分计算方法是该棋子在该游戏实例中所处位置的 piece-square 值的总和。

第四步,计算评价函数,此时将会返回白棋的 material 得分和各棋子单独得分之和。

评价函数流程图

移动选择

算法的一步是用 Minimax 算法中的 Negamax 实现进行移动选择,Minimax 算法是双人游戏(如跳棋等)中的常用算法。之后使用 Alpha-Beta 剪枝进行优化,这样可以减少执行的时间。

现在让我们深入研究一下 minimax 算法。该算法被广泛应用在棋类游戏中,用来找出失败的最大可能性中的最小值。该算法广泛应用于人工智能、决策论、博弈论、统计和哲学,力图在最坏的情况下将损失降到最低。简单来说,在游戏的每一步,假设玩家 A 试图最大化获胜几率,而在下一步中,玩家 B 试图最小化玩家 A 获胜的几率。

为了更好地理解 minimax 算法,请看下图

维基百科中 minimax 树举例

为了得到更好的结果,使用 minimax 变体 negamax,因为我们只需要一个最大化两位玩家效用的函数。不同点在于,一个玩家的损失等于另一个玩家的收获,反之亦然。

就游戏而言,给第一个玩家的位置值和给第二个玩家的位置值符号是相反的。

negamax 示例

,我们将 alpha 设为负无穷大,beta 设为正无穷大,这样两位玩家都能以尽可能差的分数开始比赛,代码如下

下面让我们以流程图的方式来解释

search 函数的流程图

下一步是进行 alpha-beta 的剪枝来优化执行速度。

来自维基百科的 alpha-beta 剪枝说明

代码如下

现在,让我们用下面给出的流程图来调整 alphabeta 函数

现在是静态搜索,这种搜索旨在仅评估静态位置,即不存在致胜战术移动的位置。该搜索需要避免由搜索算法的深度限制所引起的水平线效应(horizon effect)。

代码如下

简单一下 quiesce 函数

quiesce 函数流程图。

测试 AI

开始测试前,需要导入一些库

测试有 3 项

AI 对弈人类;

AI 对弈 AI;

AI 对弈 Stockfish。

1. AI 对弈人类

AI 选择从 g1 到 f3,这是一个很明智的选择。

2. AI 对弈 AI

3. AI 对弈 Stockfish

可以得出AI 还不够智能,不足以打败 stockfish 12,但仍然坚持走了 20 步。

接口测试

上述测试方式看起来代码很多,你也可以写一个接口测试 AI。

然后执行

最终输出

Java深度学习框架DJL综述以及推理应用

DJL是亚马逊推出的开源的深度学习开发包,它是在现有深度学习框架基础上使用原生Java概念构建的开发库。DJL目前提供了MXNet,、PyTorch和TensorFlo的实现。Java开发者可以立即开始将深度学习的SOTA成果集成到Java应用当中。

10月29日20:00,兰青(AWS算法工程师)将带来线上分享,介绍DJL以及推理应用,并通过在线demo帮助开发者更好了解DJL是如何将Java和深度学习有机结合起来的。

Copyright © 2016-2025 www.robotxin.com 人工智能机器人网 版权所有 Power by