我试图实现negamax算法,这是我怎么想它应该是:这是实现negamax算法正确
public Move getBestMove(Board board){
List<Move> possibleMoves = board.getPossibleMoves();
Move optimalMove;
int maxScore;
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
int score = negamax(newBoard, DEPTH, Integer.MAX, Integer.MIN, 1);
if (score > maxScore){
optimalMove = move;
maxScore = score;
}
}
}
和相应的negamax功能
public int negamax(Board board, int depth, int alpha, int beta, int sign){
if(depth == null || board.getPossibleMovesNumber(colour) == 0){
return calculateBoardFunction(board);
}
else{
List<Move> possibleMoves = board.getPossibleMoves();
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
alpha = Math.max(alpha, -negamax(newBoard, depth-1, -beta, -alpha, -sign);
if(alpha >= beta){
break;
}
}
return alpha;
}
是的,我知道这不是编译,但我只是想伪代码。
编辑
的calculateBoardFunction(板对板)将始终评估董事会的最好举措对计算出的颜色。
另外,我试图使它通用的,所以它的工作原理相同,每场比赛(棋,黑白棋,去)等...(但是这不是问题的一部分)
而且我用以维基百科的negamax伪代码为例。但使用该代码,我>>认为< <我可以很好地创建游戏树,并具有正确的启发式值。但我有getBestMove
函数中的代码的原因是要弄清楚什么样的举动实际上是最好的。
但我不知道如果我能做到这一点。
启发式评估函数计算游戏树顶部颜色的值。根据wikipedia的说法:“初学者可能会感到困惑的是当前节点的启发式值是如何计算的,在这种实现中,由于颜色参数,总是从运行算法的播放器的角度计算该值。” – 2011-05-20 11:00:54
其实,我不确定现在维基百科的引用是什么意思。它说“它总是从运行该算法的播放的角度来计算”,所以如果游戏树的顶部节点是白色的,它将计算白色播放器的颜色。然而,引用还说“因为颜色参数”,我不明白这一点。 – 2011-05-20 11:02:09
Heheh是的。但是我仍然不确定你的意思:p – 2011-05-20 11:04:00