棋AI MiniMax算法不起作用

我在我的国际象棋AI中实现了minimax算法,我知道它不能正常工作,因为它只是一遍又一遍地来回移动。

getPieces(true)返回当前板状态下的所有白色块

getPieces(false)返回当前板状态下的所有黑块

ChessPiece.getAllPotentialMoves()非常自我解释,为特定的片断获取所有可能的移动

PieceMovements.move()将块(p)移动到位置(m - >表示移动)

PieceMovements.undo()解除了以前的移动

searchDepth是首次调用miniMax时作为深度值传递的变量,换句话说,它是您想要搜索的距离。 的原因...

if(depth == searchDepth) {
    piece = p;
    move = m;
}

...是要记录片断并移动。 我将这个值记录在搜索树的顶层。 块和移动代表实际的块运动算法认为是最有效的。

当调用miniMax时,它看起来像这样:miniMax(searchDepth,false)。 因为AI是黑色的,所以是最小的。

这是我的方法

public int miniMax(int depth, boolean maxi) {

    if(maxi) {
        if(depth == 0) return evaluateBoard();
        int max = -9999; //negative infinity
        for(ChessPiece p : getPieces(maxi)) for(Vector2 m : p.getAllPotentialMoves()) {
                PieceMovements.move(board, p, (int)m.x, (int)m.y);
                max = Math.max(max, miniMax(depth-1, !maxi));
                PieceMovements.undo();
                if(depth == searchDepth) {
                    piece = p;
                    move = m;
                }
            }
        return max;
    } else {
        if(depth == 0) return -evaluateBoard();
        int min = 9999; //positive infinity
        for(ChessPiece p : getPieces(maxi)) for(Vector2 m : p.getAllPotentialMoves()) {
                PieceMovements.move(board, p, (int)m.x, (int)m.y);
                min = Math.min(min, miniMax(depth-1, !maxi));
                PieceMovements.undo();
                if(depth == searchDepth) {
                    piece = p;
                    move = m;
                }
            }
        return min;
    }
}

还有我的评价功能,它目前只是将每件作品的相关部分值加起来:

public int evaluateBoard() {
    int total = 0;
    for(ChessPiece[] row : board)
        for(ChessPiece piece : row)
            if(piece != null)
                switch(piece.getPiece()) {
                    case WPAWN:
                    case BPAWN:
                        total += RelativePieceValues.PAWN;
                        //a pawn about to be promoted takes on more value
                        if(piece.getPosition().y == 1 || piece.getPosition().y == 6)
                            total += 50; //50 + 10 = 60
                        break;
                    case WKNIGHT:
                    case BKNIGHT:
                        total += RelativePieceValues.KNIGHT;
                        break;
                    case WBISHOP:
                    case BBISHOP:
                        total += RelativePieceValues.BISHOP;
                        break;
                    case WROOK:
                    case BROOK:
                        total += RelativePieceValues.ROOK;
                        break;
                    case WQUEEN:
                    case BQUEEN:
                        total += RelativePieceValues.QUEEN;
                        break;
                    case WKING:
                    case BKING:
                        total += RelativePieceValues.KING;
                        break;
                }

    return total;
}

和RelativePieceValues类:

public class RelativePieceValues{

//piece value constants
public static final int PAWN = 10;
public static final int KNIGHT = 30;
public static final int BISHOP = 30;
public static final int ROOK = 50;
public static final int QUEEN = 90;
public static final int KING = 900;
}

如果您有任何疑问,请询问。 谢谢任何回应,我一直坚持这一点。 我想知道是否实际上我的迷你最大算法或评估函数有问题,或者在我的程序中可能出现了其他问题,您不能看到。 谢谢。

链接地址: http://www.djcxy.com/p/84683.html

上一篇: Chess AI MiniMax algorithm not working

下一篇: How to parallelize a negamax algorithm?