我想为类似跳棋的游戏实现 AI(人工智能)
我写了以下方法:
-方法
public List<Move> allMoves(){
...
}
这将返回按权重排序的所有有效移动的列表,其中权重是根据移动的类型和位置计算的
-方法
public int apply(Move m){
...
}
将这些移动应用到棋盘上,如果某个棋子被杀死,则返回 1
-方法
public void undo(){
...
}
恢复板子以前的状态。
这是一个零和游戏,因此 AI 应该最大化玩家颜色的棋子并最小化对手的棋子。
为此,最好的方法似乎是使用带有 alpha-beta 修剪的 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)
但我不明白如何适应我的问题。有人可以帮助我吗?
编辑
我有这个 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 修剪?