8

私は先月 C# で単純なチェス エンジンを作成しており、いくつかの素晴らしい進歩を遂げました。単純なアルファ ベータ アルゴリズムを使用しています。

Horizo​​n-Effect を修正するために、Quiescence Search を実装しようとしました (機能するまでに数回失敗しました)。エンジンの力強さはそれで少し静かになったようですが、ものすごい遅い!

以前は、約 160 秒 (ゲーム中の状態のどこか) で 6 層の深さまで探索できましたが、静止探索では、コンピューターが探索深度 3 で移動するのに約 80 秒かかりました!

ブルート フォース ノード カウンターは深さ 3 で約 20000 ノードですが、静止ノード カウンターは最大 2000 万です!

これは私の最初のチェス エンジンなので、これらの数値が正常なのか、それとも静止アルゴリズムでミスを犯したのか、よくわかりません。より経験豊富な方が、BF ノードと静止ノードの通常の比率を教えていただければ幸いです。

ところで、ちょっと見てみましょう: (このメソッドは、searchdepth が 0 のときはいつでも BF ツリーによって呼び出されます)

public static int QuiescentValue(chessBoard Board, int Alpha, int Beta)
    {
        QuiescentNodes++;

        int MinMax = Board.WhoseMove; // 1 = maximierend, -1 = minimierend
        int Counter = 0;
        int maxCount;


        int tempValue = 0;
        int currentAlpha = Alpha;
        int currentBeta = Beta;
        int QuietWorth = chEvaluation.Evaluate(Board);

        if(MinMax == 1) //Max
        {
            if (QuietWorth >= currentBeta)
                return currentBeta;
            if (QuietWorth > currentAlpha)
                currentAlpha = QuietWorth;
        }

        else            //Min
        {
            if (QuietWorth <= currentAlpha)
                return currentAlpha;
            if (QuietWorth < currentBeta)
                currentBeta = QuietWorth;
        }




        List<chMove> HitMoves = GetAllHitMoves(Board);
        maxCount = HitMoves.Count;

        if(maxCount == 0)
            return chEvaluation.Evaluate(Board);


        chessBoard tempBoard;

        while (Counter < maxCount)
        {
            tempBoard = new chessBoard(Board);
            tempBoard.Move(HitMoves[Counter]);
            tempValue = QuiescentValue(tempBoard, currentAlpha, currentBeta);

            if (MinMax == 1) //maximierend
            {
                if (tempValue >= currentBeta)
                {
                    return currentBeta;
                }

                if (tempValue > currentAlpha)
                {
                    currentAlpha = tempValue;
                }

            }

            else            //minimierend
            {
                if (tempValue <= currentAlpha)
                {
                    return currentAlpha;
                }
                if (tempValue < currentBeta)
                {
                    currentBeta = tempValue;
                }
            }

            Counter++;
        }

        if (MinMax == 1)
            return currentAlpha;
        else
            return currentBeta;

    }
4

1 に答える 1