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