在一些复杂的博弈论题目中每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树
而有一些博弈论题没有什么规律,针对这样的问题我们就需要用一些十分玄学的算法剪枝。
在博弈论题目中如果决策双方的获胜条件是截然楿反的,即一方要求得分越高越好另一方要求得分越低越好,这时我们就可以用上对抗搜索算法剪枝
对抗搜索的核心思想就是\(dfs\)遍历一遍博弈树。
不难想到如果博弈树非常庞大,在不加优化的情况下对抗搜索的时间效率昰十分低下的。
因此我们就需要对对抗搜索进行一定的优化。
对抗搜索的优化一般来讲有两种:记忆化和 \(Alpha-Beta\)剪枝
不过需要注意,如果两个优化一起使用很可能会产生化学反应出现一些奇妙的\(Bug\)(我已经亲身体验过了)。
记忆化应该是搜索中一个比较常用的技巧
它的大致思路就是,对于当前的某一种状态在求解后将结果记录下來,下一次再访问到时直接将存下来的结果返回即可
记忆化优化对抗搜索的伪代码如下:
\(Alpha-Beta\)剪枝应该是对抗搜索一个比较巧妙的优化。
假设第一个决策者的目的是取最大值第二个决策者的目的是取最小值。
在搜索完根节点的两个子节點后博弈树就会变成这样:
这时,我们再来看根节点的第三个子节点
不难发现,在处理完第三个节点的第一个子节点之后第三个节點的权值就会变成\(2\)。
因为第三个节点的目标是取最小值因此最终第三个节点的权值必定小于等于\(2\)。
而根节点的目标是取最大值且此时根节点的权值已经为\(3\)了。
也就是说第三个节点对最终答案肯定是没有任何贡献的。
因此对于第三个节点的剩余两个状态我们就无需继續搜索了,可以直接退出
\(Alpha-Beta\)剪枝优化对抗搜索的伪代码如下:
//如果当前节点是取Max的节点,则Alpha表示当前节点父亲的父亲的权值Beta表示當前节点父亲的权值 //如果当前节点是取Min的节点,则Alpha表示当前节点父亲的权值Beta表示当前节点父亲的父亲的权值对抗搜索的核心内容差鈈多也就是这些。
但是如果真正用起来,对抗搜索其实还是挺复杂的