机器之心今天,我们来教AI下国际象棋( 二 )
代码实现方式:
第二步 , 计算总的棋子数 , 并把棋子总数传递给 material 函数 。
第三步 , 计算得分 。 material 函数得分的计算方法是:用各种棋子的权重乘以该棋子黑白两方个数之差 , 然后求这些结果之和 。 而每种棋子的得分计算方法是:该棋子在该游戏实例中所处位置的 piece-square 值的总和 。
【机器之心今天,我们来教AI下国际象棋】第四步 , 计算评价函数 , 此时将会返回白棋的 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:
推荐阅读
- 食物|今天是世界讨厌香菜日!全球每100人有15个不喜欢香菜
- 机器人|机器人也要面子!北京街头两辆无人售卖车运营时吵架
- 结婚|今天是20220222!被网友称扎堆领证日:有人凌晨披棉被排队
- 网友热议|今天是20220222正月二十二星期二 新人扎堆领证:商标已被注册
- 结婚|今天是20220222正月二十二星期二:全国多地“史上最二”的日子扎堆领证
- 情侣|今天是20220222正月二十二星期二 “2”最多日子来了!网友直言最有爱一天
- OPPO|OPPO Find X5系列全球首发五轴悬浮防抖 刘作虎:只有专业相机才有
- 快充|快充王者!realme史上最快闪充宣布
- 天猫|最后实现“一户一墩”的机会来了!天猫今天上架100万只冰墩墩
- 冠军|苏翊鸣和教练吃饭坐小孩那桌 视频逗笑网友:今天迎自己18岁生日
