Минимаксный алгоритм застрял в бесконечном цикле - PullRequest
0 голосов
/ 26 сентября 2019

Так что я бьюсь головой об этой проблеме некоторое время.Я пытаюсь реализовать минимаксный алгоритм, чтобы играть в игру под названием манкала.Насколько я могу судить, мой код должен работать, но по какой-то причине, когда функция вызывает себя рекурсивно, она продолжает вычислять до 0, хотя я знаю, что она достигла конечного состояния игры и возвращает некоторое значение.Я также знаю, что он равен 0, потому что начальное число maxval равно 0. Если кто-нибудь может помочь мне разобраться с этим, я буду очень благодарен.

Ниже реализован алгоритм минимакса.Пожалуйста, не обращайте внимания на параметр глубины и исходное вызванное состояние: доска содержит число от 3 до 12 и исключает 6, maxTurn true (максимум идет первым), move -1, alpha -1 и beta 37 (максимально возможный счет36)

private int[] miniMax(int[] board, boolean maxTurn, int move, int alpha, int beta, int depth){
   int[] newState = new int[board.length];

   if(endGame(board) == true){
      int[] endReturn = new int[2];
      for(int i = 0; i < 6; i++){ board[6] += board[i];}
      endReturn[0] = board[6];  System.out.println("end state value: " + board[6]);
      endReturn[1] = move;
      return endReturn;
   }
   if(maxTurn == true){
      int[] maxEval = new int[2];
      maxEval[0] = -1;
      for(int i = 0; i < 6; i++){
         newState = Arrays.copyOf(board, board.length);
         boolean goAgain = false;
         if(board[i] == 0) continue;
         int j = newState[i];
         newState[i] = 0;
         int k = i + 1;
         while(j > 0){
            if(k == 13)k = 0;
            newState[k]++;
            j--;
            k++;
         }
         if(k == 6) goAgain = true;

         if(k < 6 && newState[12 - k] > 0 && newState[k] == 1){
            newState[6] = newState[6] + newState[12 - k] + 1;
            newState[12 - k] = 0;
            newState[k] = 0;
         }

         int[] eval = new int[2];
         eval = miniMax(newState, goAgain, i, alpha, beta, depth--);

         System.out.println("eval value: " + eval[0]);
         if(eval[0] > alpha){
            alpha = eval[0];
         }
         System.out.println("alpha value: " + alpha);
         if(beta <= alpha) break;

         if(eval[0] > maxEval[0]){
            maxEval[0] = eval[0];   System.out.println("move given: " + i);
            maxEval[1] = i;
         }

      }   //System.out.println("maxEval given moveValue: " + maxEval[1]);
      return maxEval;

   }
   else{
      int[] minEval = new int[2];
      for(int i = 7; i < 13; i++){
         newState = Arrays.copyOf(board, board.length);
         boolean max = true;
         if(board[i] == 0) continue;
         int  j = newState[i];//  System.out.println("this is j: " + j);
         newState[i] = 0;
         int k = i;
         while(j > 0){
            k++;
            if(k == 6)k = 7;
            if(k == 14)k = 0;
            j--;
            newState[k]++;
         }
         if(k == 13) max = false;

         if(k > 6 && k<13 && newState[12 - k] > 0 && newState[k] == 1){
            newState[13] = newState[13] + newState[12 - k] + 1;
            newState[12 - k] = 0;
            newState[k]--;
         }
         int[] eval = new int[2];
         eval = miniMax(newState, max, i, alpha, beta, depth--);
         if(minEval[0] > eval[0]){
            minEval[0] = eval[0];
            minEval[1] = i;
         }
         if(eval[0] < beta){
            beta = eval[0]; System.out.println("beta: " + beta);
         }
         if(beta <= alpha) break;

      }//System.out.println("maxEval given moveValue: " + maxEval[1]);
      return minEval;
   }
}
...