Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何显示Alpha-Beta修剪算法结果? 更新_Algorithm_Search_Artificial Intelligence_Minimax_Alpha Beta Pruning - Fatal编程技术网

Algorithm 如何显示Alpha-Beta修剪算法结果? 更新

Algorithm 如何显示Alpha-Beta修剪算法结果? 更新,algorithm,search,artificial-intelligence,minimax,alpha-beta-pruning,Algorithm,Search,Artificial Intelligence,Minimax,Alpha Beta Pruning,更新1 我尝试过(第二行):我在alphabeta函数中添加了更改节点颜色作为第一条指令。我得到: 绿色节点是被访问的节点。看起来,算法将正确地抛出节点,对吗?但是如何在节点中输出正确的值-我也需要这样做吗?最小子级值、最大子级值(不包括修剪的分支) 更新2 我试图将alpha和beta输出到树节点,但没有得到正确的结果。is代码(添加了第18行和第31行)。是代码的结果: 在图中,我展示了一些奇怪的地方: 第一个箭头:为什么7和6的最小值是5?第二个箭头:为什么4、3和2的最大值是5?奇

更新1

我尝试过(第二行):我在alphabeta函数中添加了更改节点颜色作为第一条指令。我得到:

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

更新2


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

在图中,我展示了一些奇怪的地方:

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

老问题 很久以前,我在这里提出了类似的问题。就像:“为什么我会犯这个错误?”。让我们回滚并创建一个新的。这个问题将是:“如何显示Alpha-Beta修剪算法的结果?”

我在维基上找到了这个算法的伪代码。可以找到它

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

注意:我有一个树结构(一些链接的
节点
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;
    }
}
函数alphabeta(节点、深度、alpha、beta、isMax、g){
if((深度==0)| |(node.isTerminal==true)){
返回node.value;
}
if(isMax){
log(“最大化”);
for(node.children中的变量i){
var child=node.children[i];
console.log(子级);
alpha=Math.max(alpha,alphabeta(child,depth-1,alpha,beta,false,g));

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

在评论中经过长时间的讨论后,我想我现在可以解释一下。当alpha-beta在树上运行时,它有三个值,当在给定节点上运行时,它有alpha和beta,这两个值是从其父节点传下来的,然后它有迄今为止找到的最佳值。如果它发现alpha-beta之外的值,那么在indow中,它会立即进行修剪,因为它知道该节点不是最优移动,而不管其值如何。因此,对于某些节点,alpha-beta永远不会计算出节点的“真实值”

因此,当您被要求显示alpha-beta的“结果”时,我错误地认为您指的是alpha-beta窗口,因为“真实值”永远不必计算

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


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

您到底想显示什么?是否想要树like在图片中,或者只记录允许您跟踪树的信息?是否希望在节点上添加标签,以便验证代码是否正确运行?@NathanS是的,我希望在树上添加节点,这些节点在任务中是空白的。此外,我想显示修剪,例如,通过着色。这个问题的问题是它确实存在esn看起来不像是一个需要解决的技术问题,但就像你想为你做的一些工作。如果有一个精确的技术阻塞点,请精确它是什么。我试过了。确切地说,我应该在哪里更改节点的颜色?我试过了(第二行):我在alphabeta函数中添加了更改节点颜色作为第一条指令。我得到:绿色节点是已访问的节点。看起来,算法将正确抛出节点,对吗?但是如何在节点中输出正确的值-我也需要这样做?子值的最小值,子值的最大值(不包括修剪的分支).我试图将alpha和beta输出到树节点,但没有得到正确的结果。is代码(添加了第18行和第31行).是代码的结果。在图像上我显示了一些奇怪的地方。第一个箭头:为什么7和6的最小值是5?第二个箭头:为什么4、3和2的最大值是5?奇怪。这就是为什么我认为它现在工作正常。是的,这很奇怪。第一个检查(1)您是否以足够的深度调用算法以达到树的最终级别?调用代码应为alphabeta(root,1000,-1000,+1000,true,g)。您的代码看起来正确,但您已正确识别出无意义的结果。或者,您是否可能出于某种原因未输出每个节点?在打印位置生成结果(alpha,beta),并根据调用if语句的不同颜色。我想是的,我用正确的深度调用它。我用深度5调用它,但我会按照您的建议稍后尝试1000。此外,我会尝试使用不同的颜色