- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试构建国际象棋 AI。我的带 alpha-beta 修剪 (ABP) 的 negamax 函数运行速度比单独的 min 和 max 函数也用 ABP 慢得多(大约 8 倍),尽管返回的移动是相等的。
我的棋盘评估函数总是返回一个关于红色玩家的值,即红色越高越好。仅对于 Negamax,当返回深度 0 时,此值乘以黑色玩家的 -1。
我的 Negamax 函数:
int alphaBeta(Board board, int depth, int alpha, int beta) {
if (depth <= 0 || board.isGameOver()) { // game over == checkmate/stalemate
int color = board.getCurrPlayer().getAlliance().isRed() ? 1 : -1;
return BoardEvaluator.evaluate(board, depth) * color;
}
int bestVal = Integer.MIN_VALUE + 1;
for (Move move : MoveSorter.simpleSort(board.getCurrPlayer().getLegalMoves())) {
MoveTransition transition = board.getCurrPlayer().makeMove(move);
if (transition.getMoveStatus().isAllowed()) { // allowed == legal && non-suicidal
int val = -alphaBeta(transition.getNextBoard(), depth - 1, -beta, -alpha);
if (val >= beta) {
return val; // fail-soft
}
if (val > bestVal) {
bestVal = val;
alpha = Math.max(alpha, val);
}
}
}
return bestVal;
}
根调用:
-alphaBeta(transition.getNextBoard(), searchDepth - 1,
Integer.MIN_VALUE + 1, Integer.MAX_VALUE); // +1 to avoid overflow when negating
我的最小和最大函数:
int min(Board board, int depth, int alpha, int beta) {
if (depth <= 0 || board.isGameOver()) {
return BoardEvaluator.evaluate(board, depth);
}
int minValue = Integer.MAX_VALUE;
for (Move move : MoveSorter.simpleSort(board.getCurrPlayer().getLegalMoves())) {
MoveTransition transition = board.getCurrPlayer().makeMove(move);
if (transition.getMoveStatus().isAllowed()) {
minValue = Math.min(minValue, max(transition.getNextBoard(), depth - 1, alpha, beta));
beta = Math.min(beta, minValue);
if (alpha >= beta) break; // cutoff
}
}
return minValue;
}
int max(Board board, int depth, int alpha, int beta) {
if (depth <= 0 || board.isGameOver()) {
return BoardEvaluator.evaluate(board, depth);
}
int maxValue = Integer.MIN_VALUE;
for (Move move : MoveSorter.simpleSort(board.getCurrPlayer().getLegalMoves())) {
MoveTransition transition = board.getCurrPlayer().makeMove(move);
if (transition.getMoveStatus().isAllowed()) {
maxValue = Math.max(maxValue, min(transition.getNextBoard(), depth - 1, alpha, beta));
alpha = Math.max(alpha, maxValue);
if (alpha >= beta) break; // cutoff
}
}
return maxValue;
}
root 分别调用红色和黑色玩家:
min(transition.getNextBoard(), searchDepth - 1, Integer.MIN_VALUE, Integer.MAX_VALUE);
max(transition.getNextBoard(), searchDepth - 1, Integer.MIN_VALUE, Integer.MAX_VALUE);
尽管我遵循了 here 中的伪代码,但我猜测 Negamax 函数中的截止值存在错误。 .感谢任何帮助,谢谢!
编辑:alphaBeta()
被调用的次数是 min()
和 max()
加起来的 6 倍,而 beta 的次数截断值仅增加约 2 倍。
最佳答案
已解决。我也应该发布根调用的完整代码——没有意识到我没有传递 beta 的新值。 Alpha/beta 实际上是在根方法中更新的,用于单独的 min-max。
Negamax 的更新根方法:
Move bestMove = null;
int bestVal = Integer.MIN_VALUE + 1;
for (Move move : MoveSorter.simpleSort(currBoard.getCurrPlayer().getLegalMoves())) {
MoveTransition transition = currBoard.getCurrPlayer().makeMove(move);
if (transition.getMoveStatus().isAllowed()) {
int val = -alphaBeta(transition.getNextBoard(), searchDepth - 1, Integer.MIN_VALUE + 1, -bestVal);
if (val > bestVal) {
bestVal = val;
bestMove = move;
}
}
}
return bestMove;
对于我的问题中缺少提供的信息,我深表歉意——我没想到错误会在那里。
关于java - 我的带有 alpha-beta 剪枝的 Negamax 算法有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491478/
我不小心修剪了一些远程分支,我真的不知道这样做的后果是什么(我点击了 Git Extensions 中的“Prune remote branches”按钮,以为它会删除一个远程分支)。 官方文档说“g
扎克伯格说,Llama3-8B还是太大了,不适合放到手机中,有什么办法? 量化、剪枝、蒸馏,如果你经常关注大语言模型,一定会看到这几个词,单看这几个字,我们很难理解它们都干了些什么,但
我正在尝试实现通过转置表增强的 alpha-beta 最小-最大剪枝。我使用这个伪代码作为引用: http://people.csail.mit.edu/plaat/mtdf.html#abmem f
我花了一整天的时间在没有真正理解的情况下尝试实现 minimax。现在,我想我了解 minimax 的工作原理,但不了解 alpha-beta 剪枝。 这是我对极小极大的理解: 生成所有可能移动的列表
我有一个代码将 Tensorflow Probability(需要 TF 2.00)与 Keras Pruning 混合,修剪第一个密集层的权重并为 TF 概率提供输入,在同一模型中具有两个代码(Ke
这是我的 minimax 方法,它实现了 alpha beta 修剪和内存: public int[] newminimax499(int a, int b){ int bestPos=-1;
在我的方法 newminimax49 中,我有一个使用 memoization 的极小极大算法以及在此 post 中向我建议的其他一般改进.该方法使用简单的启发式棋盘评估函数。我的问题基本上是关于 a
虽然我了解 MiniMax 树和 alpha-beta 修剪概念,但我不明白为什么在许多(例如维基百科)有关 alpha-beta 修剪的资源中存在像 α >= β 这样的条件。具体来说,equals
我是一名优秀的程序员,十分优秀!