Minmax 算法与 Alpha-Beta 剪枝小教学

要理解 Minmax 算法和 Alpha-Beta 剪枝算法,我们可以从"两人零和博弈"场景入手(比如棋类游戏、石头剪刀布)。这类场景的核心是:你和对手轮流决策,你的目标是最大化自己的收益,对手则会最小化你的收益

一、Minmax 算法:最简单的博弈决策

1. 核心思想

想象你在玩一个简单的游戏:你和对手轮流选数,最终的得分由你们的选择共同决定。

  • 你(Max 方):每次选择都想让最终得分尽可能高(最大化收益)。
  • 对手(Min 方):每次选择都想让最终得分尽可能低(最小化你的收益)。

Minmax 算法通过"游戏树"模拟所有可能的决策路径,计算每个路径的最终得分,帮你找到最优决策。

2. 用"游戏树"直观理解

我们用一个简化的"数字游戏"举例:

  • 游戏规则:你(Max)先选左/右,对手(Min)再选左/右,最终得分由最后一层的数字决定。
  • 目标:你要找到能让自己得分最高的初始选择。

游戏树如下(每层节点代表一个决策步骤,叶子节点是最终得分):

复制代码
          (你:Max)
         /        \
        /          \
  (对手:Min)   (对手:Min)
   /    \         /    \
  3      5       2      7
(终局)(终局) (终局) (终局)
3. Minmax 计算步骤

步骤1:从"终局"倒推,计算每个节点的"最优得分"

  • 叶子节点:就是终局得分(3、5、2、7)。
  • Min 节点(对手) :选子节点中最小的得分(对手会尽量压低你的收益)。
    • 左 Min 节点:从 3 和 5 中选最小 → 3。
    • 右 Min 节点:从 2 和 7 中选最小 → 2。
  • Max 节点(你) :选子节点中最大的得分(你会尽量抬高自己的收益)。
    • 根节点:从左 Min(3)和右 Min(2)中选最大 → 3。

结论:你应该选择"左分支",最终得分至少为 3(如果选右分支,对手会让你只能得 2)。

4. 总结 Minmax
  • 本质:通过"假设对手最优"倒推自己的最优决策。
  • 缺点:如果游戏树很深(比如围棋),需要计算的节点太多,效率极低。

二、Alpha-Beta 剪枝:Minmax 的"效率优化"

Alpha-Beta 剪枝的核心是:去掉"明显不会被选择"的分支计算,减少工作量,结果和 Minmax 完全一致。

1. 关键概念
  • Alpha(α):当前 Max 节点"能保证的最低得分"(低于这个分,Max 绝不会接受)。
  • Beta(β):当前 Min 节点"能接受的最高得分"(高于这个分,Min 绝不会接受)。
  • 剪枝条件:当 α ≥ β 时,说明当前分支已经没有意义(Max 不接受,Min 也不接受),可以停止计算。
2. 用同一个游戏树演示剪枝过程

还是上面的数字游戏,我们一步步计算并剪枝:

复制代码
          (你:Max)
         /        \
        /          \
  (对手:Min)   (对手:Min)
   /    \         /    \
  3      5       2      7
(终局)(终局) (终局) (终局)

步骤1:计算左分支的 Min 节点

  • 左 Min 节点的第一个子节点得分是 3 → 暂时记录 β=3(Min 最多接受 3)。
  • 再看左 Min 节点的第二个子节点得分是 5 → Min 会选更小的 3,所以左 Min 节点最终得分是 3。
  • 此时,根节点(Max)的 α 更新为 3(Max 至少能得 3)。

步骤2:计算右分支的 Min 节点

  • 右 Min 节点的第一个子节点得分是 2 → 暂时记录 β=2(Min 最多接受 2)。
  • 此时,根节点的 α=3,右 Min 节点的 β=2 → 因为 3 ≥ 2(α ≥ β),说明右 Min 节点的其他子节点(比如 7)再大也没用了(Min 不会选 7,因为 2 更小)。
  • 剪枝! 右 Min 节点的第二个子节点(7)不需要计算了。

最终,右 Min 节点的得分是 2,根节点 Max 选左分支(3),结果和 Minmax 一致,但少算了一个节点。

3. 剪枝效果对比
  • Minmax:需要计算所有 4 个叶子节点。
  • Alpha-Beta:只需要计算 3 个叶子节点(剪掉了 7)。

游戏树越深、分支越多,剪枝效果越明显(比如国际象棋,剪枝后计算量可能减少 90% 以上)。

三、对比总结

算法 核心逻辑 优势 图示简化(游戏树)
Minmax Max 求最大,Min 求最小,倒推最优决策 逻辑简单,结果最优 全树计算,无剪枝
Alpha-Beta 用 α(Max 底线)和 β(Min 上限)剪枝 效率极高,结果不变 剪掉 α ≥ β 的分支,减少计算量

四、举一个例子

  • Minmax:你和对手玩石头剪刀布,你要考虑"对手出什么会让你输得最惨",然后避开这个选择。
  • Alpha-Beta 剪枝:当你发现"无论对手怎么出,你选石头都至少能打平",就没必要再想"选剪刀或布"的情况了,直接选石头即可。

通过这种方式,算法能在复杂的博弈中快速找到最优解~

相关推荐
DAWN_T1719 分钟前
Python编译器(Pycharm Jupyter)
python·机器学习·jupyter·pycharm
九章云极AladdinEdu25 分钟前
冷冻电镜重构的GPU加速破局:从Relion到CryoSPARC的并行重构算法
人工智能·pytorch·深度学习·机器学习·自然语言处理·架构·gpu算力
闪电麦坤951 小时前
数据结构:数组:合并数组(Merging Arrays)
数据结构·算法
C++ 老炮儿的技术栈1 小时前
tinyxml2 开源库与 VS2010 结合使用
c语言·数据结构·c++·算法·机器人
平平无奇我要摘星星1 小时前
leetcode1_455.分发饼干
算法·leetcode
Joern-Lee2 小时前
机器学习算法:支持向量机SVM
算法·机器学习·支持向量机
秋说2 小时前
【PTA数据结构 | C语言版】计算1~n与1~m每一项相互乘积的和
c语言·数据结构·算法
秋说2 小时前
【PTA数据结构 | C语言版】计算1~n平方的和加上1~n的和
c语言·数据结构·算法
C++ 老炮儿的技术栈2 小时前
Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示
服务器·c语言·数据库·c++·ide·算法·visual studio
水果里面有苹果2 小时前
18-C#改变形参内容
java·数据结构·算法