Реализация Minimax не работает умноJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Реализация Minimax не работает умно

Сообщение Anonymous »

Моя минимаксная реализация в Dart для реализации шашек работает не оптимально. Даже на глубине 4 делает неоптимальные ходы, иногда даже разыгрывает фигуры противника.
Информация о методах:
botActionG(): это основная функция, с помощью которой бот выбирает свой ход. Он перебирает список отсортированных ходов, временно применяет каждый ход, вызывает функцию minimax() для оценки хода, а затем отменяет ход.
minimax(): Это ядро ​​ИИ, реализующее минимаксный алгоритм с обрезкой альфа-бета. Он рекурсивно исследует дерево игры, оценивая конечные узлы на основе разницы в количестве частей.
bot()
: эта функция отвечает за генерацию и сортировку возможных движется для ИИ. Он учитывает такие факторы, как захват фигур противника, уменьшение возможностей взятия противника и достижение множественных взятий.
// Save initial board state
List savePosNew = List.from(piecesPos);
playerCheck = 2; //Checking Ai's piece.

// Add all sorted moves to a single array for easy checking
List allSortedMoves = [
...List.from(supremeMoves),
...List.from(superMoves),
...List.from(excellentMoves),
...List.from(bestMoves),
...List.from(betterMoves),
...List.from(goodMoves),
...List.from(poorMoves)
];

// Perform minimax with alpha-beta pruning and depth 3
int bestMoveIndex = -1;
int bestMoveValue = -9999;
int depthLimit = 2;
int alpha = -9999;
int beta = 9999;

for (int i = 0; i < allSortedMoves.length; i++) {
String movement = allSortedMoves;
List numbers = movement.split(",");
int prevTap = int.parse(numbers[0]);
int index = int.parse(numbers[1]);

// Apply move
onPieceTapAction(prevTap);
movePiece(index);
findForMultipleTake(index);
botMultipleCapture(index);
showIconToPiecesWithTakes();
showIconToPiecesWithTakes_OPP();

// Call minimax with alpha-beta pruning
int moveValue = minimaxx(
depth: 1,
isMaximizing: false,
alpha: alpha,
beta: beta,
depthLimit: depthLimit
);

// Undo move
piecesPos = List.from(savePosNew);
countTotalPieces();

// Update best move if necessary
if (moveValue > bestMoveValue) {
bestMoveValue = moveValue;
bestMoveIndex = i;
}

// Update alpha
alpha = alpha > bestMoveValue ? alpha : bestMoveValue;
}

if (bestMoveIndex != -1) {
// Play the selected best move
String movement = allSortedMoves[bestMoveIndex];
List numbers = movement.split(",");
prevTap = int.parse(numbers[0]);
int index = int.parse(numbers[1]);
onPieceTapAction(prevTap);
movePiece(index);
findForMultipleTake(index);
botMultipleCapture(index);
resetMovesArray();
showIconToPiecesWithTakes();
showIconToPiecesWithTakes_OPP();
myTurn = false;
changeTurn();
}
}

Это минимаксный метод
int minimaxx({
required int depth,
required bool isMaximizing,
required int alpha,
required int beta,
required int depthLimit
}) {
if (depth == depthLimit) {
// Evaluation function: difference in piece count
countTotalPieces();
return totalMyPiece - totalOppPiece;
}

playerCheck = 1; //Checking Ai's opponent piece.
//swapping to avoid getting Ai's sorted moves
performingMiniMax = true;
root_Nodes = [];
bot(); //responsible for getting sorted moves e.g supremeMoves,superMoves etc
performingMiniMax = false;

List allSortedMoves = [
...List.from(supremeMoves),
...List.from(superMoves),
...List.from(excellentMoves),
...List.from(bestMoves),
...List.from(betterMoves),
...List.from(goodMoves),
...List.from(poorMoves)
];

List savePosCurrent = List.from(piecesPos);
int bestValue = isMaximizing ? -9999 : 9999;

for (String movement in allSortedMoves) {
List numbers = movement.split(",");
int prevTap = int.parse(numbers[0]);
int index = int.parse(numbers[1]);

// Apply move
onPieceTapAction(prevTap);
movePiece(index);
findForMultipleTake(index);
botMultipleCapture(index);
showIconToPiecesWithTakes();
showIconToPiecesWithTakes_OPP();

// Recursive call with next depth and alpha-beta pruning
int currentValue = minimaxx(
depth: depth + 1,
isMaximizing: !isMaximizing,
alpha: alpha,
beta: beta,
depthLimit: depthLimit
);

// Undo move
piecesPos = List.from(savePosCurrent);
countTotalPieces();

if (isMaximizing) {
bestValue = bestValue > currentValue ? bestValue : currentValue;
alpha = alpha > bestValue ? alpha : bestValue;
} else {
bestValue = bestValue < currentValue ? bestValue : currentValue;
beta = beta < bestValue ? beta : bestValue;
}

// Alpha-beta pruning
if (beta

Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-smartly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»