Anonymous
Минимакс работает нормально, но обрезка альфа-бета - нет.
Сообщение
Anonymous » 02 ноя 2024, 00:39
Я пытаюсь заставить работать альфа-бета-отсечение, но оно дает мне совершенно неправильные действия по сравнению с моей минимаксной функцией. Вот моя минимакс-функция, которая сейчас работает отлично.
Код: Выделить всё
float Minimax(char[,] _board, int depth, bool isMax) {
if (depth == 0 || isFull(_board)) {
EvaluateBoard(_board);
}
if (isMax) {
float bestScore = -Mathf.Infinity;
float score = -Mathf.Infinity;
for (int i = 0; i < 7; i++) {
char[,] board = (char[, ]) _board.Clone();
if (Play(board, i, false)) {
score = Minimax(board, depth - 1, false);
bestScore = Mathf.Max(score, bestScore);
}
}
return bestScore;
} else {
float bestScore = Mathf.Infinity;
float score = Mathf.Infinity;
for (int i = 0; i < 7; i++) {
char[,] board = (char[, ]) _board.Clone();
if (Play(board, i, true)) {
score = Minimax(board, depth - 1, true);
bestScore = Mathf.Min(score, bestScore);
}
}
return bestScore;
}
}
а вот моя альфа-бета-функция обрезки
Код: Выделить всё
float ABPruning(char[,] _board, int depth, float alpha, float beta, bool isMax) {
if (depth == 0 || isFull(_board)) {
return EvaluateBoard(_board);
}
if (isMax) {
float bestScore = -Mathf.Infinity;
for (int i = 0; i < 7; i++) {
char[, ] board = (char[,]) _board.Clone();
if (Play(board, i, false)) {
bestScore = ABPruning(board, depth - 1, alpha, beta, false);
alpha = Mathf.Max(alpha, bestScore);
if (beta
Подробнее здесь: [url]https://stackoverflow.com/questions/67952011/minimax-works-fine-but-alpha-beta-pruning-doesnt[/url]
1730497199
Anonymous
Я пытаюсь заставить работать альфа-бета-отсечение, но оно дает мне совершенно неправильные действия по сравнению с моей минимаксной функцией. Вот моя минимакс-функция, которая сейчас работает отлично. [code]float Minimax(char[,] _board, int depth, bool isMax) { if (depth == 0 || isFull(_board)) { EvaluateBoard(_board); } if (isMax) { float bestScore = -Mathf.Infinity; float score = -Mathf.Infinity; for (int i = 0; i < 7; i++) { char[,] board = (char[, ]) _board.Clone(); if (Play(board, i, false)) { score = Minimax(board, depth - 1, false); bestScore = Mathf.Max(score, bestScore); } } return bestScore; } else { float bestScore = Mathf.Infinity; float score = Mathf.Infinity; for (int i = 0; i < 7; i++) { char[,] board = (char[, ]) _board.Clone(); if (Play(board, i, true)) { score = Minimax(board, depth - 1, true); bestScore = Mathf.Min(score, bestScore); } } return bestScore; } } [/code] а вот моя альфа-бета-функция обрезки[code]float ABPruning(char[,] _board, int depth, float alpha, float beta, bool isMax) { if (depth == 0 || isFull(_board)) { return EvaluateBoard(_board); } if (isMax) { float bestScore = -Mathf.Infinity; for (int i = 0; i < 7; i++) { char[, ] board = (char[,]) _board.Clone(); if (Play(board, i, false)) { bestScore = ABPruning(board, depth - 1, alpha, beta, false); alpha = Mathf.Max(alpha, bestScore); if (beta Подробнее здесь: [url]https://stackoverflow.com/questions/67952011/minimax-works-fine-but-alpha-beta-pruning-doesnt[/url]