【问题标题】:How to display Alpha Beta Pruning algorithm result?如何显示 Alpha Beta Pruning 算法结果?
【发布时间】:2014-05-20 13:13:49
【问题描述】:

更新

更新 1

我试过this(第二行):我添加了更改节点颜色作为alphabet函数中的第一条指令。我收到this result:

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

更新 2

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

this 图像上显示奇怪的地方:

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

老问题

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

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

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

注意:我有树结构(一些链接的nodes),我将在其上使用 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;
    }
}

【问题讨论】:

  • 您到底想显示什么?您想要图片中的树,还是只记录允许您跟随树的信息?您是否需要在节点上添加标签,以便验证您的代码是否正确运行?
  • @NathanS 是的,我想要树上的节点,这些节点在要填充的任务中是空白的。另外,我想显示修剪,例如按颜色
  • 这个问题的问题在于,它看起来不像是要解决的技术问题,而是像一些你想为你完成的工作。如果有确切的技术障碍点,请准确说明它是什么。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我试过了。我应该在哪里改变节点的颜色?我试过this(第二行):我在alphabet函数中添加了更改节点颜色作为第一条指令。我收到this result:绿色节点是访问节点。看起来,算法会正确抛出节点,对吧?但是如何在节点中输出正确的值——我也需要这样做?子值的最小值,子值的最大值(不包括修剪的分支)。
  • 我尝试将 alpha 和 beta 输出到树节点,但没有得到正确的结果。 This 是代码(添加了第 18 行和第 31 行)。 This 是代码的结果。在this 图像上,我显示了奇怪的地方。第一个箭头:为什么 7 和 6 的最小值是 5?第二个箭头:为什么 4、3 和 2 的最大值是 5?奇怪的。这就是为什么我认为它现在工作正常。
  • 是的,这很奇怪。首先检查(1)您是否调用具有足够深度的算法以达到树的最终级别?调用代码应该是例如alphabeta(root, 1000, -1000, +1000, true, g) 您的代码看起来正确,但您已正确识别出无意义的结果。或者,您是否可能出于某种原因不输出每个节点?根据调用的 if 语句创建一个打印结果(alpha、beta)和不同的颜色。
  • 我想是的,我用正确的深度称呼它。我用深度五来做,但我会在稍后尝试 1000,正如你所建议的。另外,我会尝试用不同的颜色为不同的节点着色,但稍后,在晚上,但我认为很难理解新的彩色图像,因为这个函数是递归的,颜色会被覆盖几次(只是我的假设,我想,我试过了,只有第一个(左)节点变成了绿色)。无论如何,我会再试一次。谢谢。
  • 关于颜色,作为它的递归,每个节点调用一次alphabet,所以如果你把着色语句放在每个return语句之前,你知道每个节点如果被访问就会被着色一次.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多