博弈树与α-β剪枝

极小化极大算法是一个深度优先搜索算法。我们这里先规定搜索深度为3(实际情况中由于算力的原因必须限制搜索深度)。

虽然α-β剪枝在上文中一直没有提到,但是看了下面的图解你自然明白。

  1. 从根节点开始一直搜索到第一个叶节点

  2. 此时我们的搜索深度已经达到了3,所以此时需要调用评估函数,返回局面分,回溯一层。

  3. 仔细思考,如果我们继续获得其子节点的局面分,为一个比3要大的值,假设为5,那么当前的父节点必然不会采纳5这个值,因为对手希望我们的收益最低。也即得到第一个子节点局面分为3之后,我们就能知道父节点的取值范围为(-∞, 3]。也就是说,我们的子节点其实是在更新父节点的上界值(越低越好)。这里就是α-β剪枝的一部分了,但是并不是剪枝,而是更新了β的值,也就是上界值。

  4. 鉴于这个父节点的所有子节点都已经被搜索完,我们也就确定了它的收益就是3了,这时候就能修改它的下界为3。

  5. 我们继续搜索,此时回溯一层,回溯到了根节点。根节点的原本的局面分取值范围是(-∞, +∞),而现在我们找到了它的一个子节点局面分是3。根节点与其子节点不同,是极大层节点,是我们的回合,我们总希望收益越大越好,所以这里子节点会更新极大层节点的下界,也即α值。

  6. 继续进行深度优先搜索,这时我们搜索到根节点第二分支的第一个子节点,注意我们带着根节点的范围进行搜索,根节点的范围被传递给他的第二个子节点。此时搜索深度达到了3,我们调用局面评估算法,假设返回值是2。

  7. 注意,剪枝部分来了。我们知道,当前节点的父节点是一个极小层节点,所以子节点会更新父节点的上界,也就是父节点的局面分取值范围变成了矛盾区间[3, 2]。这是个明显矛盾的结论,所以这整个分支我们都可以抛弃,不必继续搜索了。

这样我们的搜索就结束了,可以确定我们应该选择左侧局面,并且预期最低收益为3。

总之,只要局面分的取值区间变成了矛盾的,就说明该分支不可能变成最优决策,应当抛弃。

通过维护一个局面分的最佳区间,在搜索过程中对于造成区间矛盾(不可能取到更优值)的情况下剪枝,就是所谓的α-β剪枝。


 
posted @ 2021-09-26 20:01  嵌入式流才是最屌的  阅读(578)  评论(0编辑  收藏  举报