Artificial intelligence alpha-beta搜索中意外的路径依赖?

Artificial intelligence alpha-beta搜索中意外的路径依赖?,artificial-intelligence,alpha-beta-pruning,Artificial Intelligence,Alpha Beta Pruning,我正在为古老的挪威tafl棋盘游戏家族写一篇人工智能(,)。它们与国际象棋有着广泛的联系,因此国际象棋人工智能的知识可以在这里应用。(问题的变体是在一个7x7的板上,它具有一个径向对称的起始位置,白色从中间开始,黑色从边缘开始。)我遇到了一个奇怪的问题,我是如何实现阿尔法β搜索:搜索到一个固定深度的结果,除了alphaβ修剪之外没有优化。根据节点的浏览顺序进行更改 在讨论的文件中,重要的方法是“explore”、“exploreChildren”、“handleEvaluationResults

我正在为古老的挪威tafl棋盘游戏家族写一篇人工智能(,)。它们与国际象棋有着广泛的联系,因此国际象棋人工智能的知识可以在这里应用。(问题的变体是在一个7x7的板上,它具有一个径向对称的起始位置,白色从中间开始,黑色从边缘开始。)我遇到了一个奇怪的问题,我是如何实现阿尔法β搜索:搜索到一个固定深度的结果,除了alphaβ修剪之外没有优化。根据节点的浏览顺序进行更改

在讨论的文件中,重要的方法是“explore”、“exploreChildren”、“handleEvaluationResults”和“generateSuccessorMoves”explore'检查是否有转置表命中(在本测试的其他地方禁用),评估状态是否为胜利节点或叶节点,或者调用exploreChildren。exploreChildren在子节点上执行递归搜索。generateSuccessorMoves生成(并可选地排序)退出当前状态的移动。handleEvaluationResults确定子级评估是否导致中断

因此,我编写了一个最小的测试用例:generateSuccessorMoves首先不进行任何排序,然后简单地洗牌移动列表,而不是对其排序。搜索结果在结果、考虑对称性的结果和值方面都不相等:

MAIN SEARCH
# cutoffs/avg. to 1st a/b a/b
Depth 0: 0/0 0/0
Depth 1: 0/22 0/1
Depth 2: 42/0 3/0
Finding best state...
Best move: d3-g3 with path...
    d3-g3
    e1-f1
    e4-e1xf1
End of best path scored -477
Observed/effective branching factor: 23.00/9.63
Thought for: 72msec. Tree sizes: main search 893 nodes, continuation search: 0 nodes, horizon search: 0 nodes
Overall speed: 12402.77777777778 nodes/sec
Transposition table stats: Table hits/queries: 0/0 Table inserts/attempts: 0/0
1. move: d3-g3 value: -477
Using 5000msec, desired 9223372036854775807
Depth 3 explored 1093 states in 0.037 sec at 29540.54/sec
MAIN SEARCH
# cutoffs/avg. to 1st a/b a/b
Depth 0: 0/0 0/0
Depth 1: 0/21 0/2
Depth 2: 104/0 2/0
Finding best state...
Best move: d3-f3 with path...
    d3-f3
    d2-c2
    d5-f5xf4
End of best path scored -521
Observed/effective branching factor: 23.00/10.30
Thought for: 37msec. Tree sizes: main search 1093 nodes, continuation search: 0 nodes, horizon search: 0 nodes
Overall speed: 29540.540540540544 nodes/sec
Transposition table stats: Table hits/queries: 0/0 Table inserts/attempts: 0/0
7. move: d3-f3 value: -521
显然,这是一个极端的情况,但我的理解是,在这种情况下,alpha-beta(即,除了“alpha-beta修剪”之外,没有任何功能)应该是稳定的,无论搜索顺序如何,至少它应该返回相同值的节点。我错了吗?我做错什么了吗

第一次编辑:虽然我认为从对这个问题的描述中可以明显看出,但事实证明在我的alpha-beta实现中存在一些未知的bug。进一步的测试表明,它不能提供与纯极小极大相同的结果

第二次编辑:这是在上面链接的文件中实现的alpha-beta搜索的伪代码版本

explore(depth, maxDepth, alpha, beta)
    // some tafl variants feature rules where one player moves more than once in a turn
    // each game tree node knows whether it's maximizing or minimizing
    var isMaximizing = this.isMaximizing()
    var value = NO_VALUE

    if(isTerminal(depth, maxDepth))
        value = eval()
    else
        for(move in successorMoves)
            if(cutoff) break

            nodeValue = nextNode(move).explore(depth + 1, maxDepth, alpha, beta)
            if(value == NO_VALUE) value = nodeValue

            if(isMaximizing)
                value = max(value, nodeValue)
                alpha = max(alpha, value)
                if(beta <= alpha) break
            else
                value = min(value, nodeValue)
                beta = min(beta, value)
                if(beta <= alpha) break


rootNode.explore(0, 5, -infinity, infinity)
explore(深度、最大深度、alpha、beta)
//一些tafl变体的特点是一个玩家在回合中移动不止一次
//每个博弈树节点都知道它是最大化还是最小化
var isMaximizing=this.isMaximizing()
var值=无值
if(最小(深度,最大深度))
value=eval()
其他的
对于(移入成功者移动)
如果(切断)中断
nodeValue=nextNode(移动)。探索(深度+1,最大深度,alpha,beta)
如果(值==无值)值=节点值
if(最大化)
值=最大值(值,节点值)
alpha=最大值(alpha,值)

如果(beta结果是我的错。我有一些代码递归地重新评估某个节点上方的节点,用于扩展搜索,但我在错误的位置调用了它(在探索了任何节点的所有子节点之后)。早期反向传播导致了错误的alpha和beta值,因此导致了早期中断。

我扫描了链接的代码。我没有看到递归(explore)中的深度(currentMaxDepth、McCurrentMaxDepth、overallMaxDepth)增加。您能解释一下吗?迭代深化发生在AiWorkspace中。explore()当状态进行递归调用时,GameTreeEstate.exploreChildren()中给定深化步骤中的搜索深度将增加。