量子位 宣布 | 公众号 QbitAI
在编程之前,我们先理解一些基本的观点,来帮助我们创建一个大略的象棋AI机器人:移动天生、棋局评估、最大最小搜索和α-β剪枝搜索过程这四个观点。
在每个步骤中,我们将会在已有的程序上加入上述经典的象棋编程优化技能,来进行改进我们的象棋机器人。同时我会向大家演示各种优化参数是怎么影响算法的下棋风格和打算速率的。
作者Lauri Hartikka提到:“我已经无法降服我创造出来的象棋机器人。我以为导致这个结果的缘故原由不是由于我下棋技能太烂,便是算法已经足够精良。”
我们将利用chess.js库实现移动生成功能,并利用chessboard.js来可视化棋局。chess.js库基本上实现了象棋的所有规则。基于这个运用库,我们可以在给定某个棋局状态下打算出所有合法操作。
图1:对移动生成功能进行可视化:起始位置作为输入,输出是该棋局的所有可能移动.
利用这些库将有助于我们专注于最核心的任务:创建找到最佳走法的算法。接下来先创建一个函数,该函数能从棋局中所有可能的移动中返回一个随机移动的结果。
虽然加入这个函数的机器人还不是一个高超的象棋玩家,但这是一个很好的开始,由于我们已经可以与其进行对战。
图2:玄色点代表下一步所有的合法移动
步骤2:位置评估现在我们来试试看一下在确定位置上双方的哪个棋子具有更高的评估强度。实现这一点的最大略的方法是利用下表来打算棋局中的相对强度。
通过这个评估表,我们可以创建一个算法,能够让棋子选择具有最高评估分数的移动方向。
目前已经有了不错的进展,由于我们的算法现在已经可以尽可能吃掉对方的棋子。
图3:借助大略的评估功能,双方进行游戏
步骤3:利用Minimax搜索树接下来,我们要利用Minimax(极大极小)搜索树算法,它可以从多种选择中确定最佳方法。
在该算法中,能将递归树的所有可能移动探索到给定深度,并且在递归树的子节点处评估该位置的好坏。
之后,我们将子节点的最小值或最大值返回给父节点,父节点通过下步将移动白棋还是黑棋来选择得当值。也便是说,我们试图尽可能地减少或最大限度地提高每一级的评估值。
图4:在人为选择位置时,可视化极大极小算法。白棋的最佳走法是b2-c3,此时能够达到评估为-50的位置
通过加入极大极小算法,我们的算法理解象棋的基本策略。
图5:深度级别为2的极大极小算法
评估极大极小算法的有效性,在很大程度上取决于打算性能可以实现的搜索深度。我们接下来的事情是通过优化算法来加大搜索深度。
步骤4:α-β剪枝搜索α-β剪枝搜索是极小极大算法的一种优化方法,许可我们忽略搜索树中的一些分支,这有助于我们在利用相同的打算资源时更深入地评估极大极小搜索树。
α-β剪枝搜索的事理是是如果我们找到比已经创造的动作更糟糕的情形,那我们可以停滞评估搜索树那一部分的情形。
α-β剪枝搜索不会影响极大极小算法的结果,而是大大加速其打算过程。
如果我们恰巧刚开始就得到了产生最优操作的路径,那么α-β剪枝算法也更有效。
图6:我们不须要关注利用α-β剪枝搜索所删去的分支,以及是否按照规定顺序访问搜索树
利用α-β剪枝搜索,我们可以显著提升极大极小算法的打算速率,如下例所示:
图7:如果我们要实行深度为4的Minmax算法,利用α-β剪枝的优化算法和正常算法所须要评估的位置数
步骤5:改进评估功能初始的评估功能非常大略,由于我们只能打算在棋局上创造的信息。为了改进这一点,我们将棋子的位置也作为评估的一个成分。在实际情形中,棋盘中央的棋子比棋盘边缘的棋子更好,由于它有更多的选择,显得更加生动。
我们将利用在维基象棋编程中提出的一种棋子代价表。
图8:对棋子代价表进行可视化,我们可以根据棋子的位置减少或增加评估值。
通过如上改进,我们已经得到了象棋机器人,至少已经能够与业余玩家进行对战了。
图9:加上评估方法和α-β剪枝优化的极大极小算法表现,设置搜索深度为3。
结论对付一个大略的象棋机器人,它的优点是不会产生屈曲的缺点操作。但是它仍旧缺少工具棋的计策性理解。
通过上面先容的方法,我们能够创建一个象棋机器人,可以和你一起玩象棋。终极的实当代码只有200行,这意味着这个算法的基本观点实现起来非常大略,你可以在GitHub上查看象棋机器人的终极版本。
我们还可以对这个算法进行深入的改进,例如移动排序、更快的移动天生和对残局的详细评估等。如果您想理解更多关于象棋机器人的信息,请查看维基上象棋项目程序,去探索更多关于搜索算法的优化程序。
本日AI界还有哪些事值得关注?
在量子位(QbitAI)公众年夜众号会话界面回答“本日”,看我们全网包罗的AI行业和研究动态。笔芯❤~
其余,欢迎加量子位小助手的微信:qbitbot,如果你研究或者从事AI领域,小助手会把你带入量子位的互换群里。