【问题标题】:How to select a node using Alpha Beta如何使用 Alpha Beta 选择节点
【发布时间】:2016-12-31 16:10:28
【问题描述】:

我正在使用 MiniMax 和 Alpha Beta 修剪为黑白棋游戏实现 AI。我已经实现了一个 Alpha Beta 算法,它告诉我可以获得的值,但不告诉我应该选择哪个节点?所以我的问题是如何使用 Alpha-Beta 来告诉我应该选择哪个节点,而不是结果值是什么。这是我的 Alpha-Beta 算法的伪代码。

01 function alphabeta(node, depth, α, β, maximizingPlayer)
02      if depth = 0 or node is a terminal node
03          return the heuristic value of node
04      if maximizingPlayer
05          v := -∞
06          for each child of node
07              v := max(v, alphabeta(child, depth – 1, α, β, FALSE))
08              α := max(α, v)
09              if β ≤ α
10                  break (* β cut-off *)
11          return v
12      else
13          v := ∞
14          for each child of node
15              v := min(v, alphabeta(child, depth – 1, α, β, TRUE))
16              β := min(β, v)
17              if β ≤ α
18                  break (* α cut-off *)
19          return v

【问题讨论】:

  • 不是结果值 - 但你也需要它。您需要退回 2 件东西。确切的答案取决于您的 node 、编程语言等的定义。
  • @HenkHolterman 为什么我需要返回结果值?例如,如果我的树是二叉搜索树,我只需要知道要选择 2 个节点中的哪一个,而不是值是什么?当然,虽然我需要该值来确定选择哪个节点
  • 您刚刚回答了自己:“确定哪个...”
  • 我认为你不明白我的问题。该算法确定采取哪条路径并获得应获得的正确结果。我只需要回溯以找出它选择的初始节点,但由于我只有最终结果,我如何知道具有该值的节点的路径?

标签: tree artificial-intelligence evaluation minimax pruning


【解决方案1】:

如果你只想知道根位置的最佳移动,记住根位置的哪个移动得分最高就足够了。为此,只需返回分数就足够了。无需更改伪代码。

当您询问到关键节点的路径时,我猜您是在询问一种重构 principal variation 的方法,它提供了有关搜索预期的一系列移动的见解。

理论上,您可以只返回递归调用的值和主要变化。这使您可以重建路径。 Triangular PV-Tables 是为此目的优化的数据结构。

如果您的搜索使用transposition table,更简单的方法是从根位置开始并在转置表中查找最佳移动。然后进行该动作并重复(查找最佳动作,做出最佳动作,再次查找等),直到游戏结束或找不到条目。最后,所采取的行动是主要的变化。

转置表方法不像显式跟踪主要变化那样精确,但它易于实现并且在搜索期间不会增加开销。

【讨论】:

  • 澄清一下,转置表会增加大量开销(如果使用 Zobrist 散列,则更少)。但是,这个成本通常远远超过搜索树大小的减小。
  • @NathanS。真的。 “无开销”假设搜索已经使用了转置表,但到目前为止,我还没有看到没有转置表的优化 Alpha Beta 搜索。至少在国际象棋中,每个引擎都使用它,主要是为了改进移动顺序。我认为其他类似游戏(例如黑白棋)也是如此。
  • @PhillipClaßen 非常正确 - 唯一不会使用换位表的游戏是换位很少的游戏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2021-11-25
相关资源
最近更新 更多