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()関数が移動のリストをループした後、白と黒の移動に対して間違った値を返します。白が動いている場合は、白の最高の動きのスコアを追跡しているので、アルファを返す必要があります。同様に、黒が動いている場合はベータを返す必要があります。

于 2013-01-18T16:14:26.630 に答える