我目前正在开发我的第一个关于C ++的项目,并选择使用基于 Minimax 的AI编写Connect Four(aka Score 4),更具体地说,使用Alpha Beta Pruning方法编写。
到目前为止,我知道AB修剪包含一个递归算法,该算法将参数设置为alpha和beta,这些算法是"限制"在你的游戏树中你不会找到它。此外,我们定义了一个最大化和最小化的玩家,前者是第一个开始玩游戏的玩家。最后,有一个"深度"我理解为"难度级别"对于游戏来说,随着AI越深入,它就越能预测到这些动作;因此,计算机赢得比赛的机会就越大。
但是,我的问题如下。假设在某些时候计算机注意到它的对手(人类玩家)有一个3条纹并且远离获胜。因此,我的启发式函数应该返回-infinity,以使AI理解即将来临的危险"并使其发挥作用以防止人类玩家获胜:因此递归停止。
但问题在于:当递归停止时,算法会回到游戏的前几层("浅层深度"),其中第一个玩家将会读到{{1} }和第二个玩家max(alpha, alphabeta(depth - 1))
。这意味着-infinity得分必然会在某个时刻丢失,因此AI可能永远不会理解游戏丢失。
有人可以向我解释一下我在理解这个算法时出错了吗?可以在Wikipedia上找到伪代码的版本。
非常感谢!
答案 0 :(得分:0)
这意味着-infinity得分必然会在某些时候丢失
-infinity不会因为交替的最小,最大截止函数而“丢失”:如果您的算法检测到丢失情况,它将推断出上部节点是一个失败的移动(通过将其归因于 - 无效值感谢min函数),所以这个分支将从祖父节点修剪(通过max函数选择另一个具有更高分数的分支)。
由于选择了另一个分支,ai玩家不会采取“坏”分支,因此避免了失败的移动和失败的情况。