Внедрить минимакс без рекурсии - PullRequest
1 голос
/ 14 ноября 2011

Я строю робота для решения проблем с пальцами ног. Для практики я написал игру Tic Tac Toe, используя минимаксный алгоритм, который работал очень хорошо. Когда я захотел перенести свой код на контроллер, я обнаружил, что ни один из компиляторов C / C ++ для этого контроллера не поддерживает рекурсивные функции. Поэтому мне нужна помощь в преобразовании этой рекурсивной минимаксной функции в функцию, использующую итерацию или внутренний стек:

int miniMax (char board[BOARD_DIM][BOARD_DIM], _Bool minNode, int *xBest, int *yBest)
{
    int possibleMoves[NSQUARES][2];
    int nPossibleMoves = generateMoves(board, possibleMoves);
    char boardChild [BOARD_DIM][BOARD_DIM];
    int ind, x_ind, y_ind;
    int minScore, maxScore;
    if (gameOver(board))
        return evaluateState(board);
    else if (minNode)
    {
        minScore = +INFINITY;
        for (ind = 0 ; ind < nPossibleMoves; ind++) 
        {
            duplicateBoard(board, boardChild);
            x_ind = possibleMoves[ind][0];
            y_ind = possibleMoves[ind][1];
            updateboard(boardChild, x_ind, y_ind, cPlayer);
            int score = miniMax(boardChild,!minNode ,&x_ind ,&y_ind);
            if (minScore > score)
                minScore = score;
        }
        return minScore;
    }
    else if (!minNode)
    {
        maxScore = -INFINITY;
        for (ind = 0 ; ind < nPossibleMoves; ind++) 
        {
            duplicateBoard(board, boardChild);
            x_ind = possibleMoves[ind][0];
            y_ind = possibleMoves[ind][1];
            updateboard(boardChild, x_ind, y_ind, cComputer);
            int score = miniMax(boardChild,!minNode ,&x_ind ,&y_ind);
            if (maxScore < score)
            {
                maxScore = score;
                *xBest = x_ind;
                *yBest = y_ind;
            }
        }
        return maxScore;
    }

Я полностью потерян, как это сделать. Я ценю любую помощь:)

1 Ответ

6 голосов
/ 14 ноября 2011

Если бы это было для встроенного, я бы

  • кодировать позиции в двоичном формате (битовые матрицы вместо 2-битных байтовых массивов)
  • закодировать полную карту решения, так что все является только Lookup (линейный поиск подойдет для этой сложности)

enter image description here

...