2011-05-20 129 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