我一直在稳定地开发一个国际象棋程序,并且很快就会有一个极小极大搜索、迭代深化和转置表。然而,目前,我有一个错误,我已将其隔离在我的静止搜索中。我很沮丧,因为我直接复制了一个伪代码实现,但它似乎对我不起作用。我在网上找到的其他实现给了我类似的结果。
当多次重新捕获可用时,该错误似乎错误地计算了对手的“最佳”捕获,因此返回一个通常有利于调用搜索的一方的值。
引擎是用 C# 编写的
public static double Quiet(Game game, double alpha, double beta, int depth)
{
double eval = Evaluation.evaluate(game);
if(depth == 0)
{
return eval;
}
// Pseudo-legal sorted moves (Captures first)
List<SerializedMove> moves = MoveGenerator.ListAllMoves(game, false);
foreach(SerializedMove move in moves)
{
// If the move is not a capture
if(move.taken_type == SerializedMove.NONE)
{
// Because of move ordering break if not a capture (Captures are first)
break;
}
// Make move and alternate side to move
game.MakeMove(move);
if(game.whiteMoves)
{
double score = Quiet(game, alpha, beta, depth - 1);
if(score > alpha)
{
alpha = score;
}
}
else
{
double score = Quiet(game, alpha, beta, depth - 1);
if(score < beta)
{
beta = score;
}
}
game.UnmakeMove(move);
if(beta <= alpha)
{
break;
}
}
if(game.whiteMoves)
{
if(beta == Evaluation.KING)
{
return eval;
}
else
{
return beta;
}
}
else
{
if(alpha == -Evaluation.KING)
{
return eval;
}
else
{
return alpha;
}
}
}
我的评估函数分别返回有利于白色或黑色的 +/- 值。