私はチェスプログラムに着実に取り組んでおり、ミニマックス検索、反復的な深化、および転置テーブルが間もなく登場します。ただし、現時点では、静止検索で特定したバグがあります。疑似コードの実装を直接コピーしたのに、うまくいかないようで、イライラしています。オンラインで見つけた他の実装でも同様の結果が得られました。
このバグは、複数の奪還が可能な場合に対戦相手の「最良の」捕獲を誤って計算するようであり、その結果、通常は検索を呼び出す側に有利な値が返されます。
エンジンは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;
}
}
}
私の評価関数は、それぞれ白または黒を支持する +/- 値を返します。