8

更新

更新 1

我试过这个(第 2 行):我添加了更改节点颜色作为字母函数中的第一条指令。我得到这个结果

结果

绿色节点是访问节点。看起来,算法会正确抛出节点,对吧?但是如何在节点中输出正确的值——我也需要这样做?子值的最小值,子值的最大值(不包括修剪的分支)。

更新 2

我试图将 alpha 和 beta 输出到树节点,但没有得到正确的结果。是代码(添加了第 18 行和第 31 行)。是代码的结果:

输出

这张图片上,我展示了奇怪的地方:

输出错误

第一个箭头:为什么 7 和 6 的最小值是 5?第二个箭头:为什么 4、3 和 2 的最大值是 5?奇怪的。这就是为什么我认为它现在工作正常。

老问题

曾几何时,我在这里创建了类似的问题。就像:“为什么我会收到这个错误?”。让我们回滚并创建一个新的。这个问题将是:“如何显示 Alpha Beta Pruning 算法结果?”

我在 wiki 上找到了这个算法的伪代码。可以在这里找到。

我的实现如下(它是在 JavaScript 上,但我不认为要回答这个问题你必须了解 JS 或 Java 或 C++ 等)。问题是如何在图(树结构)上输出该算法的结果?一开始我有这个树结构:

任务,我的结构

注意:我有树结构(一些链接node的 s),我将在其上使用 alpha beta 修剪算法,并且我有另一个树结构(为了显示结果,我们称之为“图”)。我用来显示图形的树的节点与我用来查找算法结果的节点相连。

因此,alpha beta 剪枝算法的代码如下。你能澄清一下我必须输出什么以及在哪里正确显示算法的过程/结果吗?

我的假设是输出 alpha 和 beta,但我认为,这是错误的。我试过了,但它不起作用。

我想显示修剪并用正确的值填充树中的所有节点。

这是我对带有 alpha beta 剪枝的 minimax 的实现:

function alphabeta(node, depth, alpha, beta, isMax, g) {
    if((depth == 0) || (node.isTerminal == true)) {
        return node.value;
    }
    if(isMax) {
        console.log('maximizing');
        for (var i in node.children) {
            var child = node.children[i];
            console.log(child);
            alpha = Math.max(alpha, alphabeta(child, depth-1, alpha, beta, false, g));
            if(beta <= alpha) {
                console.log('beta '+beta+' alpha '+alpha);
                break;
            }
        }

        return alpha;
    } else {
        console.log('minimizing');
        for (var i in node.children) {
            console.log('1 child');
            var child = node.children[i];
            console.log(child);
            beta = Math.min(beta, alphabeta(child, depth-1, alpha, beta, true, g));
            if (beta <= alpha) {
                console.log('beta '+beta+' alpha '+alpha);
                break;
            }
        }

        return beta;
    }
}
4

1 回答 1

4

为什么不只存储实际访问的节点,并将这些节点涂成红色。然后,您将看到与整个树相比评估了哪些节点。例如

在此处输入图像描述

经过评论中的长时间讨论,我想我现在可以阐明这一点。当 alpha beta 绕过树时,它具有三个值,当在给定节点上操作时,它具有从其父节点向下传递给它的 alpha 和 beta,然后它具有迄今为止找到的最佳值. 如果它在 alpha-beta 窗口之外找到一个值,它会立即修剪,因为它知道这个节点不是最佳移动,无论它的值如何。因此,对于某些节点,alpha beta 永远不会计算出节点的“真实值”。

因此,当您被要求显示 alpha beta 的“结果”时,我错误地认为您的意思是 alpha-beta 窗口,因为从来没有必要评估“真实值”。

您需要编写单独的代码来打印“真实节点值”。我认为极小极大算法会为您做到这一点。

另外,在手动比较时请注意,如果您使用的是节点的“集合”,则列表迭代器不能保证以可预测的顺序返回节点,因此如果在节点内部您使用的是集合而不是列表,您可能发现它很难手动跟随。列表迭代器按插入顺序返回。集合迭代器没有可预测的迭代器。

于 2014-05-28T09:35:55.117 回答