为什么这个修剪是由我的程序完成的?

时间:2014-06-09 14:58:46

标签: algorithm minimax alpha-beta-pruning

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

(图片可点击查看大图)

我有这张图:

my graph

算法结果:

result

此图像显示问题区域:

为什么修剪这两个节点?组的第一个节点是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函数 - 此函数是Wikipedia伪代码的翻译。实际上,我在我的程序中使用了另一个函数,但 都没有正常工作,如上所述。

关于调试。您可以查看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

1 个答案:

答案 0 :(得分:2)

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

那个地方的alpha值不是2,但它是5,因为它从第一个子树继承作为保证的最大值。这就是为什么您的书面比较2<5不正确,应该是5<=5这是真的。