我一直在稳步研究国际象棋程序,并且即将推出极小极大搜索,迭代深化和换位表。然而,目前,我有一个我在隔离搜索中被隔离的错误。我很沮丧,因为我直接复制了一个伪代码实现,但它似乎并不适合我。我在网上找到的其他实现给了我类似的结果。
当多个重新捕获可用时,该错误似乎错误地计算了对手“最佳”捕获,因此返回通常有利于调用搜索的一方的值。
引擎是用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;
}
}
}
我的评估函数分别返回+/-值,分别支持白色或黑色。
答案 0 :(得分:4)
在Quiet()函数循环移动列表后,它会返回错误的白移和黑移动值。如果白色正在移动,那么应该返回alpha,因为那是你跟踪白色最佳移动得分的地方。同样,如果黑色移动,则应返回测试版。