Моя минимаксная реализация в 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
Реализация Minimax не работает умно ⇐ JAVA
Программисты JAVA общаются здесь
1736802591
Anonymous
Моя минимаксная реализация в Dart для реализации шашек работает не оптимально. Даже на глубине 4 делает неоптимальные ходы, иногда даже разыгрывает фигуры противника.
Информация о методах:
[b]botActionG()[/b]: это основная функция, с помощью которой бот выбирает свой ход. Он перебирает список отсортированных ходов, временно применяет каждый ход, вызывает функцию minimax() для оценки хода, а затем отменяет ход.
[b]minimax(): Это ядро ИИ, реализующее минимаксный алгоритм с обрезкой альфа-бета. Он рекурсивно исследует дерево игры, оценивая конечные узлы на основе разницы в количестве частей.
bot()[/b]: эта функция отвечает за генерацию и сортировку возможных движется для ИИ. Он учитывает такие факторы, как захват фигур противника, уменьшение возможностей взятия противника и достижение множественных взятий.
// 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[i];
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79353440/minimax-implementation-not-playing-smartly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия