我試圖實現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