如何调整国际象棋各种难度的评价函数?

时间:2018-03-16 21:20:05

标签: java chess minimax alpha-beta-pruning

我很好奇我可以在国际象棋比赛中对我的评价功能进行哪些调整以解决不同的困难。假设玩家是普通玩家,如果我说,简单,中等和难度,我会评估什么?目前我只是检查材料,方块表和移动性,我无法击败它。是否存在评估功能的某些方面(我在讨论此页面上的基本评估功能:https://www.chessprogramming.org/Evaluation),这些功能对于保留是必不可少的,而且我可以实现的某些功能比其他功能更有效。< / p>

我的搜索算法(带alpha-beta的minimax):

public int miniMaxAlphaBeta(int depth, boolean maximisingPlayer, int alpha, int beta) {
    if(maximisingPlayer) {
        if(depth == 0) return evaluate();
        int best = -9999;
        m: for(Piece piece : getWhitePieces()) for(Move move : piece.getMoves()) {
            movePiece(piece, move.x, move.y);
            if(piece.isFriendlyKingInCheck()) { undoMove(); continue; }
            int score = miniMaxAlphaBeta(depth-1, !maximisingPlayer, alpha, beta);
            undoMove();
            if(score > best) {
                best = score;
                //here I'll record the piece and move to make
            }
            alpha = Math.max(alpha, best);
            if(beta<=alpha) break m;
        }
        return best;
    } else {
        if(depth == 0) return -evaluate();
        int best = 9999;
        m: for(Piece piece : getBlackPieces()) for(Move move : piece.getMoves()) {
            MovePiece(piece, move.x, (move.y);
            if(piece.isFriendlyKingInCheck) { undoMove(); continue; }
            int score = miniMaxAlphaBeta(depth-1, !maximisingPlayer, alpha, beta);
            undoMove();
            if(score < best) {
                best = score;
                //here I'll record the piece and move to make
            }
            beta = Math.min(beta, best);
            if(beta<=alpha) break m;
        }
        return best;
    }
}

我的评价功能:

public int evaluate() {
    int whiteMaterial = 0;
    int blackMaterial = 0;
    int positionalValue = 0;
    int mobility = 0;
    for(Piece piece : getAllPieces()) {
        if (piece.isBlackPiece()) blackMaterial += getPieceValue(piece); //returns relative piece value of piece
        else if (p.isWhitePiece()) whiteMaterial += getPieceValue(piece);
        positionalValue += getPieceSquareTableValue(piece); //adds whichever value it is on it's piece-square table at it's current position
        mobility += getMobility(piece); //adds 15 for every move this piece can make
    }
    return (whiteMaterial-blackMaterial) + positionalValue + mobility;
}

1 个答案:

答案 0 :(得分:0)

困难-使用您拥有的一切: -搜索最大深度 -计件 -计算流动性 -数一数国王的安全 -董事会的控制中心 -使用静态搜索,检查范围

中等和简单-适当降低搜索深度,并跳过其中一些功能。