【问题标题】:Beating a minimax opponent击败极小极大对手
【发布时间】:2013-03-29 04:42:16
【问题描述】:

我必须创建一个必须与其他 AI 竞争的 AI。

两个 AI 将在相同的硬件上运行,具有相同的处理时间和内存。我知道对手 AI 会使用带有 alpha beta pruning 的 minimax 算法。

现在我的问题是 - 有哪些方法可以击败这样的对手?如果我自己使用极小极大——那么两个 AI 都可以完美地预测彼此的动作,并且游戏会根据游戏的固有属性(先手获胜等)来解决。

显而易见的解决方案是以某种方式进一步了解可能的动作,这将允许更好的评估 - 因为处理器时间相同,我无法评估更深入(假设相反的 AI 代码同样优化) .我可以使用预先计算的树来获得额外的优势,但如果没有超级计算机,我肯定无法“解决”任何不平凡的游戏。

故意选择一个非最佳节点(例如 alpha beta 会修剪的节点)是否有价值?这可能会对对手造成 CPU 时间损失,因为他们必须返回并重新评估树。这会给我带来惩罚,而且我必须评估 minimax 树 + alpha beta 以查看 alpha beta 会修剪哪些节点而不会获得任何直接收益。

还有哪些其他策略可以针对这样的对手进行优化?

【问题讨论】:

  • 我们在说什么游戏?
  • 特别是奥赛罗,但我也对解决此类问题的更通用方法感兴趣。

标签: artificial-intelligence minimax alpha-beta-pruning


【解决方案1】:

首先,选择非最佳打法没有任何价值。假设你的对手会玩得最优化(这是极小极大搜索的一个基本假设),你的对手会利用这个错误采取行动。一个好的游戏引擎会有一个散列的反驳表条目,其中包含你的错误的反击,所以你不会通过疯狂的举动获得时间。做出错误的动作可以让计算机对手更快找到好动作。

像奥赛罗这样的游戏要实现的关键是,直到游戏后期,您才能确定最佳移动方式。那是因为搜索树几乎总是太大而无法详尽地搜索所有赢或输的位置,因此极小极大不能确定地告诉您哪些动作会导致胜利或失败。您只能启发式地决定在哪里停止搜索,任意将这些节点称为“终端”,然后运行一个评估函数来猜测一个位置的赢/输潜力。

评估函数的工作是评估位置的价值,通常使用无需进一步搜索博弈树即可计算的静态指标。棋子计数、位置特征、残局表库,甚至对手心理都可以在这里发挥作用。您在评估功能中投入的智能越多,通常您的引擎就会发挥得越好。但是静态评估的重点是替换过于昂贵的搜索。如果您的评估函数做得太多或效率太低,它可能会比获取相同信息所需的博弈树搜索慢。了解在评估函数中添加什么以及何时使用静态评估而不是搜索是编写优秀游戏引擎的艺术的重要组成部分。

【讨论】:

    【解决方案2】:

    有很多方法可以通过 AB 剪枝来改进标准极小值。例如,我们研究了改进顺序移动的杀手级启发式尝试,因为 AB 的效率在有序移动时会更好。

    可以在chessprogramming.wikispaces.com 找到关于 AB 的不同搜索增强和变体的大量信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多