Alpha Beta Pruning Root Method

I am writing a simple game engine that can play games like Chess and Checkers and I'm not sure if I'm implementing the root method of alpha beta function correctly. This is the regular function:

double AlphaBeta(GameState gameState, int depth, double a, double b)
    {
        if (depth == 0 || gameState.IsOver)
            return Evaluate(gameState);

        var moves = gameState.GetMoves();
        var bestValue = double.MinValue;
        foreach (Move move in moves)
        {
            double value = -AlphaBeta(gameState.MakeMove(move), depth - 1, -b, -a);
            bestValue = Math.Max(value, bestValue);
            a = Math.Max(value, a);
            if (a >= b)
                break;
        }
        return bestValue;
    }

Здесь метод Evaluate всегда возвращает значение с точки зрения игрока, у которого есть ход, а MakeMove возвращает копию исходного состояния игры с выполненным ходом. Но я не уверен, что делать с корневой функцией. Вот что у меня сейчас:

Move AlphaBetaRoot(GameState gameState, int depth)
    {
        var moves = gameState.GetMoves();
        moves = moves.OrderBy(o => AlphaBeta(gameState.MakeMove(o), depth - 1, double.MinValue, double.MaxValue)).ToList();
        return moves[0];
    }

Кажется, до сих пор это прекрасно работало (я тестировал это с 3х3 Tic Tac Toe), но это не делает никакого сокращения для корневого узла. Поэтому я подумал, может быть, это должно быть больше так:

Move AlphaBetaRoot2(GameState gameState, int depth)
    {
        double a = double.MinValue;
        double b = double.MaxValue;

        var moves = gameState.GetMoves();
        Move bestMove = null;

        foreach (Move move in moves)
        {
            var value = -AlphaBeta(gameState.MakeMove(move), depth - 1, -b, -a);
            if (value >= a)
            {
                a = Math.Max(value, a);
                bestMove = move;
            }
            if (a >= b)
                break;
        }
        return bestMove;
    }

Но я просто не могу заставить это работать, и я не знаю, что делать. Что бы я ни изменил, я получаю что-то непонятное или проигрышное.

Хотя в Интернете много литературы и вопросов об альфа-бета-обрезке, я ничего не нашел о том, как реализовать корневой метод. Так что я буду признателен за любую помощь.

0 ответов

Другие вопросы по тегам