我看到以前有人问过这个问题,但我仍然卡住了。我已经使用了另一个答案中建议的包装类,但是每次算法找到“更好”的节点时,即使它不是最大移动而是最小移动,移动都会被覆盖。
private int alphaBetaSearch(Node currentNode, int depth,int alpha,int beta, boolean maxPlayer){
if (depth == 0){
return bestValue = currentNode.getValue();
}
if(maxPlayer){
bestValue = Integer.MIN_VALUE;
for(Node child:currentNode.getChildren()){
bestValue = Integer.max(bestValue, alphaBetaSearch(child, depth-1, alpha, beta, false));
currentNode.setValue(bestValue);
alpha = Integer.max(alpha, bestValue);
if(beta<= alpha)
break;
}
return bestValue;
}
else{
bestValue = Integer.MAX_VALUE;
for(Node child:currentNode.getChildren()){
bestValue = Integer.min(bestValue, alphaBetaSearch(child, depth-1, alpha, beta, true));
currentNode.setValue(bestValue);
beta = Integer.min(beta, bestValue);
if (beta<=alpha)
break;
}
return bestValue;
}
}
任何优化或更正也将不胜感激。谢谢!也很抱歉 genSuccessors() 函数。我知道布尔参数没有意义,但相信我它有效。