minimax搜索(对抗搜索)
qwq莫名在做博弈论时就被卢神推荐来做这个了
常见形式
两人轮流走棋,两人目标相背
- A希望B输,B希望A输
- A使得分最多,B使得分最少。
双方智商均在线且极高
实现
dfs搜博弈树
思想
把走法看成一棵树
圆形代表 $A$,正方形代表 $B$ ,节点的每个孩子节点代表一个候选方案。
注:圆圈中的数字为 $A$ 的利益值,越大对A越有利
假设 $A$ 选择第一种方案(即走第一个子节点)
那么 $B$ 将有两种选择,一种使 $A$ 的值为 $7$,一种使 $A$ 的值为 $3$,那么显然 $B$ 会选择 $3$
假设 $A$ 选择第二种方案
那么 $B$ 只有一种选择
同理得第三种情况
又因为 $A$ 需要最佳方案
于是有
$alpha-beta$剪枝优化
为便于理解,将 $A$ 走的节点命名为 $max$ 节点,$B$ 走到节点命名为 $min$ 节点
$alpha-beta$ 剪枝的基本思想:
是对于每个 $max$ 结点设置一个目前已知下界 $alpha$ ,每个 $min$ 节点设置一个目前已知上界 $beta$ 。$alpha$ 代表 $A$ 可以搜索到的最好值,$beta$ 代表了 $B$ 可以接受的最坏值。
如果某个行动的结果 $\leq alpha$ ,那么它就是很差的行动,$A$ 可以选择更好的行动(即当前 $alpha$ 值的行动)。
反之,如果某个行动的结果 $\geq beta$,那么整个节点就作废了,因为对手不希望走到这个局面,而它有一定有别的行动(即走当前 $beta$ 值的行动)可以避免到达这个局面。
那么发生下面两种情况时可以剪枝,即停止搜索该节点的其余子节点:
不用该点走:当计算一个 $min$ 结点时,如果它的 $beta$ 值小于等于其父结点的 $alpha$ 值,则可以立即停止此结点的计算( $alpha$ 剪枝)。
走多了:当计算一个 $max$ 结点时,如果它的 $alpha$ 结点大于等于其父结点的 $beta$ 值,也可以立即停止此结点的计算( $beta$ 剪枝)。
基本格式:
1 | int dfs(Status s,int Alpha,int Beta,int Which) |
例题
ICPC Asia Nanning 2017 I. Rake It In
P4576 [CQOI2013]棋盘游戏
World Finals 2009 LA4451 House of Cards UVA1085
/*刘汝佳的毒瘤题*/
UVA10838 The Pawn Chess