【问题标题】:Why is this prune being done by my program?为什么我的程序要进行修剪?
【发布时间】:2014-06-09 14:58:45
【问题描述】:

我创建了在图表上执行 alpha beta 算法的程序。

(图片可点击查看大图)

我有这张图:

算法结果:

此图显示了问题区域:

为什么要修剪这两个节点?组的第一个节点是5,前一个顶点的父节点是2,所以我们比较5和2。5不小于2,但是程序做了截断。为什么?只有当节点值小于 2 时才必须这样做,但在我们的情况下不是。

我是否误解了 alpha-beta 修剪理论中的某些内容,所以我比较了错误的值?还是我实现的问题?之前所有其他分支都运行良好,那么为什么问题只出现在这里?另一方面,看看这张图片:

程序必须修剪,修剪完成。当第一个子顶点为 5 或 1 时,为什么要剪枝?


我的 alpha beta 函数 (on GitHub):

function alphabeta_blank(node, depth, alpha, beta, isMax, g) {
    g.nodes[node.name].shape.items['0'].attr('fill', 'green');

    if((depth == 0) || (node.isTerminal == true)) {
        return node.value;
    }
    if(isMax) {
        for (var i in node.children) {
            var child = node.children[i];
            alpha = Math.max(alpha, alphabeta_blank(child, depth-1, alpha, beta, false, g));
            if(beta <= alpha) {
                break;
            }
        }
        return alpha;
    } else {
        for (var i in node.children) {
            var child = node.children[i];
            beta = Math.min(beta, alphabeta_blank(child, depth-1, alpha, beta, true, g));
            if (beta <= alpha) {
                break;
            }
        }
        return beta;
    }
}

此函数是将the pseudocode on Wikipedia 转换为 JavaScript。

注意:如果你打开完整的源代码,你会注意到我在这里展示了alpha_beta_blank 函数——这个函数是维基百科伪代码的翻译。实际上,我在我的程序中使用了另一个函数,但两者都不能正常工作,如上所述。

关于调试。您可以查看this function(带有所有调试语句的原始函数)并看到我正在打印调试消息。调试跟踪中的这部分属于问题顶点:

minimizing (min312)
getting value from terminal node node31 (value is 5)
beta value is set to 5
alpha cut-off (5<=5), others children of max31 wouldn't be visited
min312 — minimum of childs of min312 is 5
min312 — childs of node min312: [5]
returning beta, minimal node is 5, node min312 value is set as 5
going back to node max31

带有名称的图表的一部分(以便您可以理解日志):

             max31
            /       \
      min311         min312
     ........     /    |     \
                 /     |      \
child:          5      4       5

Full repository on GitHub.

【问题讨论】:

    标签: algorithm minimax alpha-beta-pruning


    【解决方案1】:

    通过探索第一个子树(从根开始),我们发现我们可以保证得到 5 的结果,所以当我们去那个“麻烦的”节点并得到 5 的值时,我们可以修剪,因为没有办法min 节点将采用更高的值,当然我们不想尝试获得更低的值,因为我们总是可以转到第一个子树并获得 5 的结果(当它为 1 时,这同样适用于您的其他示例,因为5 优于 1)。虽然如果它是 6,那么它就不会修剪。

    那个地方的 alpha 值不是 2,而是 5,因为它是从第一个子树结转的,作为保证的最大值。这就是为什么你的书面比较 2&lt;5 不正确,应该是 5&lt;=5 这是真的。

    【讨论】:

    • 我明白你说的,但是......我在纸上做同样的事情,老师说,我们应该将这个值与 2 进行比较(2 是前一组最佳值 - this value)。所以他错了,我误解了 alpha-beta-pruning 应该如何工作?当我在纸上做同样的事情时,我不会在每一步都保存 alpha 和 beta。他解释说,我只应该关注之前的小组最佳价值(正如我之前解释的那样)。错了吗?
    • 其实我也在考虑。 youtube 上没有视频,它像他一样解释了 alpha-beta。到处都有人解释说,有 alpha 和 beta,他们改变了他们的值 throw 算法。
    • @SharikovVladislav 使用您的教师方法可能效果很好。它似乎是“真实” alpha-beta 算法的更简单版本。但是,正如您在示例中看到的那样,它不会像“正确”的 alpha-beta 那样修剪。在大树中,影响可能会非常严重。所以我看不出使用那个方法有什么意义,你可以向你的老师展示另一种方法,也许他/她会学到新的东西:P
    • 嘿嘿等等。如果使用比较 2 和 5 不正确,它如何能正常工作? :(
    • @SharikovVladislav 因为与之前的最佳组相比,您有点忽略了已知的最佳整体结果。但是,您仍然会找到根节点的最佳值,但正如我之前所说,这样做需要更多时间。如您所见,您的“教师算法”不会在该节点处修剪(在示例中给出),但“正确”的 alpha-beta 算法会做到这一点(正如您所知,它确实做到了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2012-09-09
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多