2015-11-21 1 views
1

Мне было поручено написать функцию, которая найдет лучший ход для компьютера, чтобы сделать частью алгоритма обратного отслеживания. Мое решение находит выигрышный ответ, но не лучший ответ. У меня возникли проблемы с поиском способа сохранить значение, присвоенное различным параметрам, которые не будут сброшены во время следующего рекурсивного вызова. Так что, если он пройдет через ходы 1,2,3,4 и 2 и 3, они приведут к выигрышному решению, и это займет 3, а не 2, даже если 2 будет лучшим выбором. Я вижу, почему в моем коде это происходит, но я не могу понять, как это исправить. Я пробовал с выигрышами и суммами переменных, но это, похоже, не работает. Таким образом, снова функция работает, чтобы найти выигрышный проспект, но не всегда будет выбирать лучший из выигрышных ходов. Любая помощь будет высоко ценитсяТеория игр Java Recursion получает лучший ход

Move bestMove = null; 


    int totalwins= 0; 
    public Move findbest(Game g) throws GameException { 
     int wins = 0; 

     PlayerNumber side = g.SECOND_PLAYER; 
     PlayerNumber opp = g.FIRST_PLAYER; 
     Iterator<Move> moves = g.getMoves(); 
     while(moves.hasNext()){ 

      Move m = moves.next(); 
      //System.out.println(m + " Totalwins " + totalwins); 
      Game g1 = g.copy(); 
      g1.make(m); 
      //System.out.println("Turn: " + g.whoseTurn()); 
      if(!g1.isGameOver()){ 
       bestMove = findbest(g1); 
      }else{ 
       if(g1.winner() == side){ 
        bestMove = m; 
        wins++; 
       }else if(g1.winner() == opp){ 
        wins--; 
       } 
       if(wins > totalwins){ 
        totalwins += wins; 
        bestMove = m; 
       } 
      } 
      if(bestMove == null){//saftey so it won't return a null if there is no winnable move. 
       bestMove = m; 
      } 
     } 
     //System.out.println("Totalwins = " + totalwins); 
     return bestMove; 
    } 
+0

Чтобы определить лучшее что-то, вы должны иметь систему ранжирования. Как лучше двигаться дальше? У вас должен быть четкий способ сравнения ходов. Тогда это будет зависеть от типа игры. В некоторых играх можно вычислить лучший ход по некоторому алгоритму. В других случаях вам лучше рассчитать все возможные шаги, а затем отсортировать их. Ваше дело, похоже, последнее. Чтобы вернуться к рекурсии, вы должны найти способ определить, при каждом рекурсивном вызове, какой ход лучше всего, и вернуть это. – afsantos

+0

Я надеялся придумать способ подсчета количества выигрышных состояний, которые могли бы быть достигнуты с каждого хода. Затем, который когда-либо перемещается, будут возвращены самые выигрышные состояния – Peter3

+1

Peter3, посмотрите на рекурсивные и ранговые/весовые алгоритмы, такие как A * (произносится как «A, Star», алгоритм поиска путей, общий для AI игр) , Это может дать вам (очень) полезные подсказки и/или вдохновение. Это также связано и с примером того, что сказал афсантос. Надеюсь, поможет! – XenoRo

ответ

0

Как указано в комментариях, вам нужно иметь какой-рейтинговой системы, чтобы определить, какой двигаться действительно лучший.

Затем сделайте глобальную переменную Move bestMove и вместо findBest верните «лучший ход», просто попросите его проверить, является ли текущий ход выигрышной, и если да, проверьте также, лучше, чем значение тока bestMove. Если оба этих условия истинны, то назначьте текущий ход bestMove.

+0

Вы можете отслеживать движение с наивысшим ранжированием, пока вы добавляете их, нет необходимости перебирать список –

+0

Извините, только недавно написал аналогичный алгоритм, когда я действительно должен был хранить все возвращаемые значения в 'ArrayList' и перебирать их, поэтому мой разум оказался не в том месте. Отредактировал мой ответ. – Nerdizzle

+0

У меня была глобальная переменная bestMove уже выше. Я попробовал установить вес с помощью выигрышей и totalwins переменных и назначить bestMove более высокий из двух. Я ценю помощь. Я близок к тому, чтобы закончить его на своем рабочем столе, и я опубликую, что я закончил делать – Peter3