为什么我的alpha-beta修剪实现不起作用?

时间:2012-04-19 13:58:07

标签: java artificial-intelligence reversi

我正在使用wikipedia伪代码来反对 -

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 []数组,这些数组具有任何一个玩家可以移动的位置,而不管它是什么。 对于黑白棋的初始位置,findMovesBlack()将返回[19,26,37,44]

如果findMovesBlack()和findMovesWhite()的长度都为0,则allNodesFull()返回一个布尔值。

blacknodes()和whitenodes()分别返回黑色或白色节点的数量。

Node.move(int coordinate)返回一个String []数组,其中包含已翻转和放置的新位置。相信我,它运作正常。

Node(String [] gameboard,boolean player-to-move)只是用我们找到的参数设置一个新位置。

我相信你需要看到的一切。我已经解决了后端的所有问题。

1 个答案:

答案 0 :(得分:0)

答案在于beta和alpha值的实现。我不得不混淆相对于=符号的位置。