在Java中为Negamax添加Alpha Beta剪枝

我在Java中开发一个国际象棋游戏,(我认为)已经成功为AI玩家实现了Negamax算法。但我在尝试添加alpha beta剪枝以改进算法时遇到了些许困难。我尝试按照教程和示例代码进行操作,但就是无法理解它的工作原理。

以下是我目前用于获取最佳移动的代码:

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;}

这是我尝试在(正常工作的)negamax方法中添加alpha-beta剪枝的代码:

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 flowLooking 2 moves aheadExecuted: E/2 -> E/4Tested 0 movesGetting best moveThinking...Evaluating: B/8 -> A/6Handling move: B/1 -> A/3 : -2147483648    Handling move: A/8 -> B/8 : -2147483647Handling 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 : -2Handling move: D/1 -> E/2 : 2    Handling move: B/8 -> A/8 : -2147483647Handling 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 : -17Handling 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 : -19Handling move: G/1 -> F/3 : 19    Handling move: A/8 -> B/8 : -2147483647Handling move: G/1 -> H/3 : 19    Handling move: B/8 -> B/2 : -2147483647Exception 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;}

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注