我正在尝试为我的国际象棋引擎在 Rust 中编写一个简单的负最大算法。我有一个非常简单的评估函数:
pub fn evaluate(&self) -> i32 {
let mut eval: i32 = 0;
for piece_type in PType::PIECE_TYPES {
eval += (
self.bitboards[piece_type, Col::White].count_ones() as i32 -
self.bitboards[piece_type, Col::Black].count_ones() as i32
) * piece_type.value();
}
eval
}
这是我的 negamax 实现:
fn negamax(pos: &mut Position, depth: u32, piece_colour: Col) -> i32 {
let mult = match piece_colour {
Col::Black => -1,
Col::White => 1
};
if depth == 0 {
return pos.evaluate() * mult
}
let mut best_so_far = -9999;
let legal_moves = movegen::legal_moves(pos, piece_colour);
for child in legal_moves {
pos.make_move(child);
best_so_far = std::cmp::max(best_so_far, negamax(pos, depth - 1, piece_colour.inverse()));
pos.unmake_move(child);
}
-best_so_far
}
其中很多来自 Negamax 算法的 Wikipedia 伪代码。然而,在深度 5 的以下位置中,为白色生成的最佳着法是 Nxd3,此时应该是 Nb7 来分叉皇后和国王,然后在下一步行动中捕获皇后(是的,我的移动生成器确实考虑了叉子)。
我感觉我的 Negamax 实现有问题,但是我不知道在哪里。