Python中的Minimax算法

2025年1月5日 | 阅读6分钟

Minimax 算法是一种决策规则,应用于人工智能、决策理论、博弈论、统计学和哲学等不同领域。它的设计目的是在最坏情况下(最大损失)最小化潜在损失。

Minimax 算法是一种递归算法,用于在博弈论中做出决策并确定玩家的最佳走法,假设其对手也以最优方式进行博弈。它通常仅用于两人游戏,如井字棋、国际象棋、孔明棋、双陆棋等。

Minimax Algorithm in Python

Minimax 算法的属性

  • 可以在有限的游戏树中找到解决方案。
  • 如果双方都做出最佳可能走法,则结果是最优的。
  • Minimax 算法由于在游戏树上进行深度优先搜索 (DFS),因此时间复杂度为 O(),其中 b 表示分支因子,m 表示树的最大深度。
  • Minimax 算法的空间复杂度为 O(bm),与深度优先搜索相同。
  • Minimax 算法创建一个游戏可能走法的树。树的每个层级代表一次最大化玩家或最小化玩家的回合。树的叶节点使用评估函数进行评估。该算法选择能为最大化玩家带来最佳结果的走法。
  • Minimax 算法是一种回溯算法。它从树的顶部开始,一直向下到终端节点。一旦到达终端节点,它就会像递归一样回溯树。

博弈论

在博弈论的 Minimax 算法中,有两个参与者:最大化者和最小化者。最大化者旨在获得尽可能高的分数,而最小化者则希望获得最低的分数。每个棋盘状态都有一个相应的值。如果最大化者在特定情况下占优,棋盘分数通常为正。相反,如果最小化者占优,棋盘分数通常为负。

游戏树是两人、顺序、确定性、完美信息游戏中所有可能走法和状态的层次表示。树中的每个节点代表一个游戏状态,从节点发出的分支代表可以从该状态进行的可能走法。

Minimax 算法是一种回溯算法。它从树的顶部开始,一直向下到终端节点。一旦到达终端节点,它就会像递归一样回溯树。

minmax 算法的主要策略是最小化最大可能损失,因此 minmax 算法首先构建一个包含所有可能走法及其结果的树。

示例

让我们考虑游戏树

想象一个包含 4 个最终状态的游戏。要达到这些最终状态,您必须沿着从完美二叉树的根到 4 个叶节点的路径行进。作为最大化玩家,您将首先有机会移动,从树的根开始,而您的对手将在下一个级别。

Minimax 算法递归地评估当前玩家和对手玩家的所有可能走法。该算法在每个树级别交替最大化和最小化节点的值。

  1. 从根节点 (20) 开始,这是 MAX 玩家的回合。
  2. 生成所有可能的走法(选择子节点,即 10 和 30)。
  3. 计算每个子节点的 Minimax 值
  4. 对于左子节点 (10)
    • 现在是 MIN 玩家的回合。
    • 为 MIN 玩家生成所有可能的走法(5 和 15)。
  5. 计算 MIN 玩家每次走法的 Minimax 值
    • 对于 5:值为 5(叶节点)。
    • 对于 15:值为 15(叶节点)。
    • MIN 玩家希望最小化,因此 10 的值成为两个子节点值的最小值,即 5。
  6. 对于右子节点 (30)
    • 现在是 MIN 玩家的回合。
    • 为 MIN 玩家生成所有可能的走法(25 和 35)。
  7. 计算 MIN 玩家每次走法的 Minimax 值
    • 对于 25:值为 25(叶节点)。
    • 对于 35:值为 35(叶节点)。
    • MIN 玩家希望最小化,因此 30 的值成为两个子节点值的最小值,即 25。
  8. 现在,轮到 MAX 玩家了。计算根节点 (20) 的 Minimax 值
    • 对于 10:值为 5。
    • 对于 30:值为 25。
    • MAX 玩家希望最大化,因此 20 的值成为两个子节点值的最大值,即 25。

最终得分

试图最大化其分数的玩家的最终得分为 25。这是因为 minimax 算法在树的每个级别都选择了导致最大化玩家最高分数的走法。因此,MAX 玩家的最优走法是选择值为 30 的右子节点。

Alpha-beta 剪枝

Alpha-beta 剪枝通过减少评估的节点数量来优化 minimax 算法。它通过消除不能为当前玩家带来更好结果的游戏树分支来实现此目的;这使得算法更有效,尤其是在处理大型游戏树时。

伪代码

在此伪代码中

  • 术语“节点”是指游戏的当前状态。
  • Depth 代表游戏树中的当前深度。您可以设置最大深度来限制搜索。
  • MaximizingPlayer 是一个布尔值,指示当前玩家是试图最大化其分数 (True) 还是最小化其对手的分数 (False)。
  • 该算法通过考虑所有可能的走法及其结果来递归地探索游戏树。
  • 它为最大化玩家选择具有最高值的子节点。
  • 对于最小化玩家,它选择具有最低值的子节点(对手的最佳走法)。
  • 基本情况发生在深度为 0 或当前节点为终端节点时,例如赢、输或平局。在这些情况下,会为节点返回一个启发式值。

您应该使用初始游戏状态调用 minimax 函数,并将 maximizingPlayer 设置为 True,以便轮到最大化其分数的玩家。该函数返回该玩家的最佳走法。

优点

Minimax 算法的优点如下:

  • 它是一种完整的算法,这意味着只要存在解决方案,它总能找到解决方案。
  • 在对手也以最优方式进行博弈的假设下,该算法是最优的。
  • 该算法易于理解和实现。
  • 它已被用于为国际象棋、跳棋、围棋等创建强大的 AI 玩家。
  • 虽然最初是为两人零和游戏设计的,但 Minimax 算法可以改编和扩展以解决许多决策问题。

局限性

Minimax 算法最显著的缺点是它在玩国际象棋或围棋等复杂游戏时会显著减慢速度。由于存在许多可能的走法,Minimax 算法变得非常慢。这些游戏有很多分支,玩家有很多选择。然而,使用 alpha-beta 剪枝可以解决这个缺点。

应用

  • 游戏对弈:Minimax 算法通常用于国际象棋、跳棋和围棋等两人游戏,以确定玩家的最优走法,假设对手也以最优方式进行博弈。
  • 决策制定:Minimax 算法不仅限于博弈论。它还可以应用于金融、经济和军事战略。它是确定最佳投资策略、为商品和服务设定最优价格以及制定能将损失最小化的军事战略的有用工具。
  • AI 研究:Minimax 算法是人工智能研究的基础工具。它用于开发新的 AI 算法和测试现有算法的性能。
  • 股票交易:Minimax 算法可以创建最小化损失并最大化利润的交易策略。
  • 自动驾驶汽车:自动驾驶汽车利用 Minimax 算法来确定最佳路线,同时考虑障碍物和交通状况。

结论

Minimax 算法是一种强大的两人零和博弈决策工具。它已被证明是开发国际象棋、跳棋和围棋等游戏中智能 AI 玩家的非常有效的工具。它还在非游戏场景中找到了应用,例如决策制定、机器学习和自动驾驶汽车。该算法的多功能性和准确性使其在各种应用中都很受欢迎。

尽管 Minimax 算法存在局限性,例如计算成本高和无法处理不确定性,但它在各种应用中仍然有用。