【发布时间】:2014-12-02 23:22:00
【问题描述】:
我正在编写一个带有 alpha-beta 修剪的 negamax。但是,它仅在删除“坏”行时才有效,但我不知道为什么。我的代码基于此pseudo-code。这是正确的吗?大多数实现在循环内(在根节点的单独函数上)调用 negamax,我应该这样做吗?为什么?
private static double AlphaBetaWithMemory(Board board, int player,
int depth,
int max_depth, double alpha, double beta) {
double eval = Double.NEGATIVE_INFINITY;
List<Integer> moves;
if (depth == max_depth
|| board.gameOver()) {
double h = board.heuristic(player);
return h;
} else {
movs=board.getMoves();
for (Integer m : moves) {
if (depth == 1) {
double val = -AlphaBetaWithMemory(
board.move(m), (player + 1) % 2,
depth + 1,
max_depth, -beta, -alpha);
if (val > eval) {
best_mov = m;
eval = val;
} else if (val == eval) {
if (Math.random() > 0.5) {
best_mov = m;
}
}
alpha = Math.max(alpha, val); //"BAD" LINE
} else {
double val = -AlphaBetaWithMemory(
board.mover(m), (player + 1) % 2,
depth + 1,
max_depth, -beta, -alpha);
eval = Math.max(eval, val);
alpha = Math.max(alpha, val);
if (alpha >= beta) {
return beta;
}
}
}
}
return eval;
【问题讨论】:
-
保持“坏线”会怎样?在第一次调用
AlphaBetaWithMemory时,其中一个参数是board.move(m),在第二次调用中是board.mover(m)。这只是一个错字吗?
标签: algorithm artificial-intelligence chess minimax