静默搜索中的错误

时间:2013-01-18 00:56:41

标签: c# search chess minimax

我一直在稳步研究国际象棋程序,并且即将推出极小极大搜索,迭代深化和换位表。然而,目前,我有一个我在隔离搜索中被隔离的错误。我很沮丧,因为我直接复制了一个伪代码实现,但它似乎并不适合我。我在网上找到的其他实现给了我类似的结果。

当多个重新捕获可用时,该错误似乎错误地计算了对手“最佳”捕获,因此返回通常有利于调用搜索的一方的值。

引擎是用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;
            }
        }
    }

我的评估函数分别返回+/-值,分别支持白色或黑色。

1 个答案:

答案 0 :(得分:4)

在Quiet()函数循环移动列表后,它会返回错误的白移和黑移动值。如果白色正在移动,那么应该返回alpha,因为那是你跟踪白色最佳移动得分的地方。同样,如果黑色移动,则应返回测试版。