1

これは以前に尋ねられたことは知っていますが、これを理解することができませんでした。

コネクト 4 っぽいゲーム用に 7x7 のボードを持っています。

Minimax の Alpha Beta プルーニングを実装するために、このメソッドを定義しました。

それは私にヒューリスティックを返し、最善の動きを設定する必要があります。しかし、ボード上で利用可能な最後の手として、私は常に最善の手を得ています....

私が見逃しているかもしれない何かがここにありますか?

ありがとうございました!

private int alphaBeta(Node node, int depth, int alpha, int beta, bool max)
{

    if (depth == 0 || node.getBoard().noMorePlays())
    {
        return node.getBoard().heuristic(max ? 1 : 2);
    }

    if (max)
    {

        foreach (Node child in node.Children( (max ? 1 : 2)) )
        {

            alpha = Math.Max(alpha, alphaBeta(child, depth - 1, alpha, beta, !max));

            this.bestNode = child;
            if (beta <= alpha)
            {
                break;
            }

        }


        return alpha;
    }
    else
    {
        foreach (Node child in node.Children((max ? 1 : 2)))
        {

            beta = Math.Min(beta, alphaBeta(child, depth - 1, alpha, beta, !max));

            if (beta <= alpha)
            {
                break;
            }

        }

        return beta;
    }


}
4

1 に答える 1

1

の周りthis.bestNode = child;には条件がないため、常にリストの最後が選択されます。

ロジックが逆になっている可能性がありますが、次のようになります。

//alpha = Math.Max(alpha, alphaBeta(child, depth - 1, alpha, beta, !max));
int temp = alphaBeta(child, depth - 1, alpha, beta, !max);
if (temp > alpha)
{
    this.bestNode = child;
    alpha = temp;
}
于 2013-06-02T12:51:15.593 に答える