2011-05-20 176 views
0

我試圖實現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函數中的代碼的原因是要弄清楚什麼樣的舉動實際上是最好的。

但我不知道如果我能做到這一點。

+0

啓發式評估函數計算遊戲樹頂部顏色的值。根據wikipedia的說法:「初學者可能會感到困惑的是當前節點的啓發式值是如何計算的,在這種實現中,由於顏色參數,總是從運行算法的播放器的角度計算該值。」 – 2011-05-20 11:00:54

+0

其實,我不確定現在維基百科的引用是什麼意思。它說「它總是從運行該算法的播放的角度來計算」,所以如果遊戲樹的頂部節點是白色的,它將計算白色播放器的顏色。然而,引用還說「因爲顏色參數」,我不明白這一點。 – 2011-05-20 11:02:09

+0

Heheh是的。但是我仍然不確定你的意思:p – 2011-05-20 11:04:00

回答

1

這看起來或多或少是正確的。有一個印刷錯誤(-sign而不是-colour),並且您需要每次通過循環克隆板(或者使用unmakeMove,但是您首先不需要克隆)。但除此之外,邏輯看起來是正確的。
在現實世界中,您會想要在嘗試之前以某種方式對動作進行排序。這可能會導致所有beta測試的臨界值都大幅提升。

+0

啊非常感謝。實際的代碼稍微複雜一點,所以我調整了一下。因此,錯誤('-sign' - >'-colour'參數。和循環外部的'clone')。我發現這很難調試,所以我不確定我是否正確地做對了。 – 2011-05-20 11:08:28