3

これは二重の質問です。Alpha-Beta 検索を実行し、最後に Quiescence 検索を実行する単純なチェス エンジンをまとめました。静止検索がパフォーマンスに影響を与えています。問題は、パフォーマンスへの影響を許容できるかどうかです。そうでない場合、この問題を解決するにはどうすればよいですか?

パフォーマンスへの影響を以下の図に示します。

これらの統計は、ゲームの途中で考慮されたことに注意してください。FEN は次のとおりです。

r3k2r/pb2qpbp/1pn1pnp1/2PpP3/2B2B2/2N2N2/PPPQ1PPP/R3K2R w KQkq - 0 1

静止なし:

  • 82,069 ミリ秒 (~82 秒) で 6 プライ
  • 5,298 ミリ秒 (~5.3 秒) で 5 プライ

静止あり:

  • 83,502 ミリ秒 (~83 秒) で 5 プライ

静止検索を使用して 6 プライの統計を行ったことはありませんが、必要に応じて計算してもかまいません。

注意すべき重要なことは、静止検索を追加することは、余分なプライを検索することと同じであるということです。これは正常ですか?

C# の Alpha-Beta および Quiescence ルーチンを以下に示します。これらは、チェス プログラミング wikiに基づいています。

    public static int AlphaBeta(Board board, int alpha, int beta, int depthLeft, int side)
    {
        if (depthLeft == 0)
        {
            return Quiescence(board, side, alpha, beta);
        }
        List<Move> moves = board.GenerateMoves(side);

        //nodesCount += moves.Count;

        BoardState state;
        int score;
        int oppositeSide = -1 * side;

        for (int i = 0; i < moves.Count; i++)
        {
            state = board.GetCurrentBoardState();
            if (!board.MakeMove(moves[i]))
            {
                continue;
            }
            score = -AlphaBeta(board, -beta, -alpha, depthLeft - 1, oppositeSide);
            board.RestoreState(state);
            if (score >= beta)
            {
                return beta; 
            }
            if (score > alpha)
            {
                alpha = score; 
            }
        }
        return alpha;
    }

静止:

    private static int Quiescence(Board board, int side, int alpha, int beta)
    {
        int standingPat = Evaluation.EvaluateFromPerspectiveOf(board, side);

        if (standingPat >= beta)
        {
            return beta;
        }

        if (alpha < standingPat)
        {
            alpha = standingPat;
        }

        int oppositeSide = -1 * side;

        List<Move> moves = board.GenerateMoves(side);
        int score;
        BoardState state;
        for (int i = 0; i < moves.Count; i++)
        {
            if (!board.IsCaptureMove(moves[i]))
            {
                continue;
            }

            //nodesCount++;

            state = board.GetCurrentBoardState();
            if (!board.MakeMove(moves[i]))
            {
                continue;
            }
            score = -Quiescence(board, oppositeSide, -beta, -alpha);
            board.RestoreState(state);

            if (score >= beta)
            {
                return beta;
            }
            if (score > alpha)
            {
                alpha = score;
            }
        }
        return alpha;
    }
4

1 に答える 1