我有一个棋盘游戏,目前使用 Negamax 实现 AI 来搜索位置。开始新搜索时,我将棋盘对象传递给类并复制它。副本是类中的私有变量。我这样做是因为 java 不通过引用传递对象(正如我最近了解到的那样)。
在搜索类中,我有 2 个功能:
NegamaxRoot 这是根。我得到初始移动,移动,调用递归 negamax 函数 (2),然后撤消移动。
NegamaxRecur 这个函数是主要的递归函数。在这里,我得到(同一个棋盘副本的)移动,移动,递归调用自身,然后撤消移动。
这个过程基本上不起作用,因为在单步调试器中,我注意到在执行移动/撤消时对象变量不同步。
撤消是否也需要在递归函数中调用?
这是 negamax 类:
public class Negamax
{
private IBoard board;
public Negamax() {}
public Move NegamaxRoot(IBoard board, int depth)
{
this.board = board.copy();
int alpha = -999999999, beta = 999999999;
int val = 0;
//The move that will be returned
Move bestMove = null;
List<Move> moves = this.board.getMoves();
for (Move move : moves)
{
//IBoard newBoard = board.copy();
//Make the move
this.board.make(move, true);
val = -negamaxRecur(depth - 1, -beta, -alpha);
//Undo the move
this.board.undo(move);
//Keep best move
if (val > alpha)
{
alpha = val;
bestMove = move;
}
}
//Return the move
return bestMove;
}
private int negamaxRecur(int depth, int alpha, int beta)
{
if (depth == 0 || this.board.getWon() != 0)
return this.board.getScore();
int val;
List<Move> moves = this.board.getMoves();
for (Move move : moves)
{
//Make the move
this.board.make(move, true);
val = -negamaxRecur(depth - 1, -beta, -alpha);
this.board.undo(move);
//Alpha-Beta pruning
if (val > alpha)
alpha = val;
if (alpha >= beta)
return alpha;
}
return alpha;
}
}