Как получить лучший ход от Minimax с альфа-бета-обрезкой в ​​С#?

Я знаю, что об этом уже спрашивали, но я не смог понять этот вопрос.

У меня есть доска 7x7 для игры с подключением 4.

Я определил этот метод, чтобы реализовать сокращение 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;
    }


}

person nmdias    schedule 02.06.2013    source источник


Ответы (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;
}
person Henk Holterman    schedule 02.06.2013