国际象棋静止搜索太广泛了

时间:2015-06-30 18:24:03

标签: c# algorithm chess alpha-beta-pruning

上个月我在c#中创建了一个简单的国际象棋引擎,并取得了一些不错的进展。它使用简单的Alpha-Beta算法。

为了纠正Horizo​​n-Effect,我试图实现静止搜索(并在它工作之前多次失败)。发动机的强度似乎有点改善了安静,但速度非常慢!

之前,我可以在大约160秒(在游戏中期的某个地方)搜索6层深度,通过静态搜索,计算机需要大约80秒才能在搜索深度3上移动!

蛮力节点计数器在深度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;

    }

1 个答案:

答案 0 :(得分:2)

我不熟悉英语术语 - HitMove这是一个从棋盘上移走一块的动作吗?

在这种情况下,在我看来,您使用GetAllHitMoves来获取&#34;嘈杂&#34;的列表移动以进行静止搜索,然后比通常的3或6层进行评估。这是递归调用的,所以只要有可能的HitMoves剩余,你就会反复评估它。限制您的静止搜索应该可以解决您的性能问题。

至于选择静止搜索的限制 - 维基状态:

  

现代国际象棋引擎可能会搜索某些比最小值更深2到3倍的动作。