Как построить минимаксное дерево позиций в JavaScript

Для игры Connect4 мне нужно преобразовать этот алгоритм AlphaBeta в алгоритм AlphaBetaWithMemory, описанный Aske Plaat в его алгоритме MTD(f): https://people.csail.mit.edu/plaat/mtdf.html#abmem

Поэтому мне нужны некоторые подсказки о том, как я могу построить минимаксное положение доски дерева возможных ходов, чтобы иметь возможность перебирать его дочерние узлы так же, как AlphaBetaWithMemory.

Я очень надеюсь, что вы, ребята, можете дать мне несколько советов, пожалуйста.

Спасибо.

Game.prototype.alphabeta = function( board, depth, alpha, beta, maximizingPlayer ) {

    // Call score of our board
    var score = board.score();

    // Break
    if (board.isFinished(depth, score)) return [null, score];

    if( maximizingPlayer )
    {
        // Column, Score
        var max = [null, -99999];

        // POSSIBLE MOVES
        for (var column = 0; column < that.columns; column++) 
        {
            var new_board = board.copy(); // Create new board

            if (new_board.place(column)) {

                that.iterations++; // Debug

                var next_move = that.alphabeta( new_board, depth-1, alpha, beta, false ); // Recursive calling

                // Evaluate new move
                if (max[0] == null || next_move[1] > max[1]) {
                    max[0] = column;
                    max[1] = next_move[1];
                    alpha = next_move[1];
                }

                if (alpha >= beta) return max;
            }
        }

        return max; 
    }
    else
    {
        // Column, score
        var min = [null, 99999];

        // POSSIBLE MOVES
        for (var column = 0; column < that.columns; column++) {
            var new_board = board.copy();

            if (new_board.place(column)) {

                that.iterations++;

                var next_move = that.alphabeta(new_board, depth-1, alpha, beta, true );

                if (min[0] == null || next_move[1] < min[1]) {
                    min[0] = column;
                    min[1] = next_move[1];
                    beta = next_move[1];
                }

                if (alpha >= beta) return min;
            }
        }
        return min;
    }
}

person metad00r    schedule 11.01.2017    source источник


Ответы (1)


Алгоритм AlphaBetaWithMemory — это стандартный альфа-бета-алгоритм, использующий Таблица транспозиций.

Итак, если ваш альфа-бета-алгоритм работает, вам нужно только добавить таблицу транспонирования для хранения информации из предыдущих поисков. Без таблицы транспонирования МПД(f) по-прежнему будет правильным, но не очень эффективным.

person Philipp Claßen    schedule 21.01.2017