java - 在 Java 中向 Negamax 添加 Alpha Beta 剪枝

标签 java artificial-intelligence chess alpha-beta-pruning negamax

我正在用 Java 制作一个国际象棋游戏,并且(我认为)已经成功为 AI 玩家实现了 Negamax。我在添加 alpha beta 修剪以改进算法时遇到了一些麻烦。我已经尝试过以下教程和示例代码,但只是无法理解它是如何工作的。

下面是我目前获得最佳 Action 的代码:

private Move getBestMove() {
    System.out.println("Getting best move");
    System.out.println("Thinking...");

    List<Move> validMoves = generateMoves(true);
    int bestResult = Integer.MIN_VALUE;
    Move bestMove = null;

    for (Move move : validMoves) {

        executeMove(move);
        System.out.println("Evaluating: " + move);

        int evaluationResult = -evaluateNegaMax(this.lookForward, "", Integer.MIN_VALUE, Integer.MAX_VALUE);
        undoMove(move);

        if (evaluationResult > bestResult) {
            bestResult = evaluationResult;
            bestMove = move;
        }
    }
    System.out.println("Done thinking! The best move is: " + bestMove);
    return bestMove;
}

这是我尝试将 aplha-beta 修剪添加到我的(工作)negamax 方法中:

public int evaluateNegaMax(int lookForward, String indent, int alpha, int beta) {

    if (lookForward <= 0
            || this.chessGame.getGameState() == ChessGame.GAME_STATE_WHITE_WON
            || this.chessGame.getGameState() == ChessGame.GAME_STATE_BLACK_WON) {

        return evaluateState();
    }

    List<Move> moves = generateMoves(false);

    for (Move currentMove : moves) {

        System.out.println(indent + "Handling move: " + currentMove + " : " + alpha);
        if (currentMove == null) {
            continue;
        }

        executeMove(currentMove);

        alpha = Math.max(alpha, -evaluateNegaMax(lookForward-1, "    ", -beta, -alpha));

        if (alpha > beta) {
            break;
        }

        undoMove(currentMove);
    }
    return alpha;
}

最后控制台是什么样的

Starting game flow
Looking 2 moves aheadExecuted: E/2 -> E/4
Tested 0 moves
Getting best move
Thinking...
Evaluating: B/8 -> A/6
Handling move: B/1 -> A/3 : -2147483648
    Handling move: A/8 -> B/8 : -2147483647
Handling move: B/1 -> C/3 : 2
    Handling move: B/8 -> A/8 : -2147483647
    Handling move: A/6 -> B/4 : -3
    Handling move: A/6 -> C/5 : -3
    Handling move: G/8 -> F/6 : -2
Handling move: D/1 -> E/2 : 2
    Handling move: B/8 -> A/8 : -2147483647
Handling move: D/1 -> F/3 : 2
    Handling move: A/8 -> B/8 : -2147483647
    Handling move: A/8 -> B/8 : -2147483647
    Handling move: F/6 -> E/4 : -32
    Handling move: F/6 -> G/4 : -17
    Handling move: F/6 -> D/5 : -17
Handling move: G/1 -> E/2 : 2
    Handling move: B/1 -> A/3 : -2147483647
    Handling move: B/1 -> C/3 : -29
    Handling move: E/1 -> F/1 : -28
    Handling move: E/2 -> G/1 : -19
    Handling move: E/2 -> C/3 : -19
    Handling move: E/2 -> G/3 : -19
    Handling move: E/2 -> D/4 : -19
Handling move: G/1 -> F/3 : 19
    Handling move: A/8 -> B/8 : -2147483647
Handling move: G/1 -> H/3 : 19
    Handling move: B/8 -> B/2 : -2147483647
Exception in thread "Thread-2" java.lang.NullPointerException
    at Chess.logic.ChessGame.movePiece(ChessGame.java:166)
    at Chess.ai.AiPlayerHandler.executeMove(AiPlayerHandler.java:158)
    at Chess.ai.AiPlayerHandler.evaluateNegaMax(AiPlayerHandler.java:84)
    at Chess.ai.AiPlayerHandler.getBestMove(AiPlayerHandler.java:47)
    at Chess.ai.AiPlayerHandler.getMove(AiPlayerHandler.java:31)
    at Chess.logic.ChessGame.waitForMove(ChessGame.java:125)
    at Chess.logic.ChessGame.startGame(ChessGame.java:95)
    at Chess.logic.ChessGame.run(ChessGame.java:338)
    at java.lang.Thread.run(Thread.java:745)

任何帮助将不胜感激。预先感谢您。

最佳答案

我想我已经可以工作了。如果有人关注此问题正在等待回复,则代码如下:

    public int evaluateNegaMax(int depth, String indent, int alpha, int beta) {
    if (depth <= 0
            || this.chessGame.getGameState() == ChessGame.GAME_STATE_WHITE_WON
            || this.chessGame.getGameState() == ChessGame.GAME_STATE_BLACK_WON) {

        return evaluateState();
    }

    List<Move> moves = generateMoves(false);
    int bestValue = Integer.MIN_VALUE;

    for (Move currentMove : moves) {

        executeMove(currentMove);
        int value = -evaluateNegaMax(depth - 1, indent + "    ", -beta, -alpha);
        System.out.println(indent + "Handling move: " + currentMove + " : " + value);
        undoMove(currentMove);
        counter++;

        if (value > bestValue) {
            bestValue = value;
        }

        if (bestValue > alpha) {
            alpha = bestValue;
        }

        if (bestValue >= beta) {
            break;
        }
    }
    System.out.println(indent + "max: " + alpha);
    return alpha;
}

关于java - 在 Java 中向 Negamax 添加 Alpha Beta 剪枝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36547077/

相关文章:

java - 整数中第一个和最后一个数字的和

java - 如何实现二维链表​​数组

java - 我怎样才能返回正确的值?

策略游戏的算法

algorithm - 如何随机生成一条窄路径?

ios - Stockfish Chess Engine 与 Swift 中的 iOS 项目集成

Java Web 服务证书检查

numbers - 遗传编程中的实数(常数)

C 语言下的国际象棋 : Negamax implementation works but sometimes doesn't spot mates in 1

java - 为国际象棋游戏创建棋盘演示