更新
更新 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;
}
}