0

所以我为我的基于国际象棋的益智游戏实现了一个极小极大搜索。在这种情况下,搜索确定下一步的 AI 棋子。

它自己的极小极大工作正常,它返回预期的移动,但是当我实现 alpha beta 修剪时,极小极大每回合返回相同的两个值。例如,当前位于 (0,0) 的 AI Rook 在从极小极大移动时可能会收到 (1,0),而下次它向极小极大询问它的移动时,它将收到 (0,0)。无论我在评估函数中进行什么更改,都会发生此循环。

游戏状态由用户的位置、棋子的位置和代表棋盘本身的瓷砖阵列组成。我在这里使用我自己的节点类(实际上应该称为 Pair),以便将每个 Tile 与评估函数给出的相应值一起存储。

我如何实现我的 alpha beta 修剪有问题吗?任何意见是极大的赞赏。如果需要更多信息,请询问,我会提供我所能提供的。

//Here is my call to the minimax
Min(depth, user, piece, new Node((int) (Double.NEGATIVE_INFINITY)), new Node((int) Double.POSITIVE_INFINITY), tiles));

Node Max(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
    if(depth <= 0||gameOver(piece))
    {
        return new Node(evaluation(user,piece,tiles));
    }
    LinkedList<Tile> moves = user.getMoves(tiles,1);
    for(Tile t:moves)
    {
        Tile temp= new Tile(user);
        tiles= user.changePos(t,tiles);
        Node val = Min(depth - 1, user, piece, alpha, beta, tiles);
        val.addTile(t);
        tiles= user.changePos(temp,tiles);
        if(val.getValue()>=beta.getValue())
            return beta;
        if(val.getValue() >= alpha.getValue())
        {
            if(alpha.getTile()==null)
                alpha = val;
            else if(val.getValue()==alpha.getValue()){
                if(r.nextInt(2)==1)//adds an element of randomness 
                    alpha=val;
            }
            else
                alpha=val;
        }
    }
    return alpha;
}
Node Min(int depth, Piece user, Piece piece, Node alpha, Node beta, Tile[][] tiles)
{
    updateGoal(user);
    if(depth <= 0||gameOver(piece))
    {
        return new Node(evaluation(user,piece,tiles));
    }
    LinkedList<Tile> moves = piece.getMoves(tiles,1);
    for(Tile t:moves)
    {

        Tile temp= new Tile(piece);
        tiles= piece.changePos(t,tiles);
        Node val = Max(depth - 1, user, piece, alpha, beta,tiles);
        val.addTile(t);
        tiles= piece.changePos(temp,tiles);
        if(val.getValue() <= alpha.getValue())
            return alpha;
        if(val.getValue() <= beta.getValue())
        {
            if(beta.getTile()==null)
                beta = val;
            else if(val.getValue()==beta.getValue()){
                if(r.nextInt(2)==1)
                    beta=val;
            }
            else
                beta=val;
        }
    }
    return beta;
}
4

0 回答 0