Проблема с ИИ с обрезкой альфа-бета - Java
Я беру урок искусственного интеллекта, где нам нужно создать ИИ, который будет играть в крестики-нолики.
Инструктор указал использовать альфа-бета-обрезку для процесса принятия решения ИИ при размещении следующего хода. Проблема, с которой я сталкиваюсь в данный момент, заключается в количестве времени, которое требуется ИИ для создания дерева решений и его движения. Нормальный 3х3 - это хорошо, 3х4 и 4х3 занимают немного времени, но 4х4 занимает несколько минут на первый ход, и я не получил результатов от игровых досок большего размера.
Исходный код, который я использовал:
/** Get next best move for computer. Return int[2] of {row, >col} */
@Override
int[] move() {
int[] result = minimax(2, mySeed, Integer.MIN_VALUE, >Integer.MAX_VALUE);
// depth, max-turn, alpha, beta
return new int[] {result[1], result[2]}; // row, col
}
/** Minimax (recursive) at level of depth for maximizing or >minimizing player
with alpha-beta cut-off. Return int[3] of {score, row, col} >*/
private int[] minimax(int depth, Seed player, int alpha, int >beta) {
// Generate possible next moves in a list of int[2] of {row, >col}.
List<int[]> nextMoves = generateMoves();
// mySeed is maximizing; while oppSeed is minimizing
int score;
int bestRow = -1;
int bestCol = -1;
if (nextMoves.isEmpty() || depth == 0) {
// Gameover or depth reached, evaluate score
score = evaluate();
return new int[] {score, bestRow, bestCol};
} else {
for (int[] move : nextMoves) {
// try this move for the current "player"
cells[move[0]][move[1]].content = player;
if (player == mySeed) { // mySeed (computer) is >maximizing player
score = minimax(depth - 1, oppSeed, alpha, beta)[0];
if (score > alpha) {
alpha = score;
bestRow = move[0];
bestCol = move[1];
}
} else { // oppSeed is minimizing player
score = minimax(depth - 1, mySeed, alpha, beta)[0];
if (score < beta) {
beta = score;
bestRow = move[0];
bestCol = move[1];
}
}
// undo move
cells[move[0]][move[1]].content = Seed.EMPTY;
// cut-off
if (alpha >= beta) break;
}
return new int[] {(player == mySeed) ? alpha : beta, >bestRow, bestCol};
}
}
Ссылка на источник, если это необходимо
Преподаватель также предложил использовать итеративный углубленный поиск, но я тупица, который не знает как.