我正在使用带有Alpha Beta修剪的MiniMax为奥赛罗游戏实现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
答案 0 :(得分:0)
如果您只想知道根位置的最佳移动,则足以记住根位置中哪个移动得分最高。为此,只需返回分数即可。不需要修改伪代码。
当您询问关键节点的路径时,我想您正在询问重建principal variation的方法,该方法可以深入了解搜索所期望的一系列移动。
理论上,您只需返回递归调用的值和主要变体即可。这允许您重建路径。 Triangular PV-Tables是为此目的而优化的数据结构。
如果您的搜索使用transposition table,更简单的方法就是启动根位置并在转置表中查找最佳移动。然后进行移动并重复(查找最佳移动,进行最佳移动,再次查找等),直到游戏结束或未找到任何条目。最后,所做的动作是主要的变化。
转置表方法不像显式跟踪主要变化那样精确,但实现起来很简单,并且在搜索过程中不会增加任何开销。