>我正在使用维基百科伪代码来反对 -
function alphabeta(node, depth, α, β, Player)
if depth = 0 or node is a terminal node
return the heuristic value of node
if Player = MaxPlayer
for each child of node
α := max(α, alphabeta(child, depth-1, α, β, not(Player) ))
if β ≤ α
break (* Beta cut-off *)
return α
else
for each child of node
β := min(β, alphabeta(child, depth-1, α, β, not(Player) ))
if β ≤ α
break (* Alpha cut-off *)
return β
这是我的 Java 实现 -
private int alphabeta(Node newNode, int depth, int alpha, int beta, boolean Player) {
Integer[] children;
if(depth == 0 || newNode.allNodesFull()){
return (newNode.blacknodes() - newNode.whitenodes());
}
if(Player == false){
children = newNode.findMovesBlack();
Arrays.sort(children);
for(Integer child: children){
nodesGenerated ++;
alpha = Math.max(alpha, alphabeta(new Node(newNode.move(child), true),
depth - 1, alpha, beta, !Player));
if(beta <= alpha)
break;
}return alpha;
}else{
children = newNode.findMovesWhite();
Arrays.sort(children);
for(Integer child: children){
nodesGenerated ++;
beta = Math.min(beta, alphabeta(new Node(newNode.move(child), false),
depth - 1, alpha, beta, !Player));
if(beta <= alpha)
break;
}return beta;
}
}
在我的代码进行一些修订后,它不再有提前返回的问题,但我确实有一个问题,alpha 和 beta 永远不会改变
我将解释会发生什么,假设它们有效
findMovesBlack() 和 findMovesWhite() 都返回 Integer[] 数组,这些数组具有任何玩家都可以移动的可能位置,无论轮到谁。对于 Reversi 的初始位置,findMovesBlack() 将返回 [19, 26, 37, 44]
allNodesFull() 返回一个布尔值,如果 findMovesBlack() 和 findMovesWhite() 的长度均为 0。
blacknodes() 和 whitenodes() 分别返回黑色或白色节点的数量。
Node.move(int coordinate) 返回一个 String[] 数组,其中包含已翻转和放置的新位置。 相信我,它工作正常。
一个节点(String[]游戏板,布尔玩家移动)只是使用我们发现的参数设置一个新位置。
我相信这就是你需要看到的。我已经解决了后端的所有问题。
答案在于 beta 和 alpha 值的实现。我不得不弄乱相对于 = 符号的位置很多。