2

我一直在稳定地开发一个国际象棋程序,并且很快就会有一个极小极大搜索、迭代深化和转置表。然而,目前,我有一个错误,我已将其隔离在我的静止搜索中。我很沮丧,因为我直接复制了一个伪代码实现,但它似乎对我不起作用。我在网上找到的其他实现给了我类似的结果。

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

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

我的评估函数分别返回有利于白色或黑色的 +/- 值。

4

1 回答 1

4

在 Quiet() 函数循环遍历移动列表后,它会返回错误的黑白移动值。如果白棋在移动,则应返回 alpha,因为这是您跟踪白棋最佳棋步得分的地方。同样,如果黑色正在移动,则应返回 beta。

于 2013-01-18T16:14:26.630 回答