Я хочу реализовать AI (искусственный интеллект) для шашек-как играДерево Реализация в MinMax с альфа-бета отсечение
я написал методы последующей:
-The метод
public List<Move> allMoves(){
...
}
, который возвращает мне список всех допустимых ходов, отсортированных по весу, где вес рассчитываются по виду движения и положение
-The метода
public int apply(Move m){
...
}
применять ходы на доске и возвращает 1, если какая-то пешка был убит
-The метод
public void undo(){
...
}
восстановить прежний статус совета.
Это игры с нулевой суммой, поэтому AI shoud максимизирует пешки цвета игрока и сводит к минимуму пешки противника.
Для этого лучше всего использовать min-max с обрезкой альфа-бета. Это имеет последующего псевдокод
function alphabeta(node, depth, α, β, maximizingPlayer)
if depth = 0 or node is a terminal node
return the heuristic value of node
if maximizingPlayer
v := -∞
for each child of node
v := max(v, alphabeta(child, depth - 1, α, β, FALSE))
α := max(α, v)
if β ≤ α
break (* β cut-off *)
return v
else
v := ∞
for each child of node
v := min(v, alphabeta(child, depth - 1, α, β, TRUE))
β := min(β, v)
if β ≤ α
break (* α cut-off *)
return v
(* Initial call *)
alphabeta(origin, depth, -∞, +∞, TRUE)
Но я не понял, как адаптировать это к моей проблеме. Кто-нибудь может мне помочь?
EDIT
У меня есть этот MinMax, но без обрезки
private Integer minimax(Board board, Integer depth, Color current, Boolean maximizingPlayer) {
Integer bestValue;
if (0 == depth)
return ((current == selfColor) ? 1 : -1) * this.evaluateBoard(board, current);
Integer val;
if (maximizingPlayer) {
bestValue = -INF;
for (Move m : board.getPossibleMoves(current)) {
board.apply(m);
val = minimax(board, depth - 1, current, Boolean.FALSE);
bestValue = Math.max(bestValue, val);
board.revert(m);
}
return bestValue;
} else {
bestValue = INF;
for (Move m : board.getPossibleMoves(current)) {
board.apply(m);
val = minimax(board, depth - 1, current, Boolean.TRUE);
bestValue = Math.min(bestValue, val);
board.revert(m);
}
return bestValue;
}
}
the evaluate function
private Integer evaluateBoard(Board board, Color player) {
return board.pawns(player) - board.pawns(player.other());
}
Как изменить, чтобы получить альфа-бета отсечение?
Большое спасибо за ответ ... но все же я не совсем понял, как получить наилучший результат в конце рекурсии Alpha Beta ... и как " prune " – AndreaF
Обрезка выполняется двумя последними операциями if - больше ничего не нужно делать. Оценка, конечно, немного сложная. Я бы (1) подсчитал штуки, (2) посмотрел, как далеко продвинулись они и (3), если у них есть какие-либо предметы противника перед их выходом на границу. Просто предложение ....;) – Trinimon
Пожалуйста, дайте ссылку на вопрос. Спасибо. Я не понял, как редактировать minMax, чтобы добавить эту проклятую обрезку :( – AndreaF