Мне было поручено написать функцию, которая найдет лучший ход для компьютера, чтобы сделать частью алгоритма обратного отслеживания. Мое решение находит выигрышный ответ, но не лучший ответ. У меня возникли проблемы с поиском способа сохранить значение, присвоенное различным параметрам, которые не будут сброшены во время следующего рекурсивного вызова. Так что, если он пройдет через ходы 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;
}
Чтобы определить лучшее что-то, вы должны иметь систему ранжирования. Как лучше двигаться дальше? У вас должен быть четкий способ сравнения ходов. Тогда это будет зависеть от типа игры. В некоторых играх можно вычислить лучший ход по некоторому алгоритму. В других случаях вам лучше рассчитать все возможные шаги, а затем отсортировать их. Ваше дело, похоже, последнее. Чтобы вернуться к рекурсии, вы должны найти способ определить, при каждом рекурсивном вызове, какой ход лучше всего, и вернуть это. – afsantos
Я надеялся придумать способ подсчета количества выигрышных состояний, которые могли бы быть достигнуты с каждого хода. Затем, который когда-либо перемещается, будут возвращены самые выигрышные состояния – Peter3
Peter3, посмотрите на рекурсивные и ранговые/весовые алгоритмы, такие как A * (произносится как «A, Star», алгоритм поиска путей, общий для AI игр) , Это может дать вам (очень) полезные подсказки и/или вдохновение. Это также связано и с примером того, что сказал афсантос. Надеюсь, поможет! – XenoRo