fix: remove attempt at quiescence search
it does not help at all
This commit is contained in:
parent
d1506e4d6c
commit
69dfa98bef
@ -97,8 +97,6 @@ pub struct SearchConfig {
|
|||||||
alpha_beta_on: bool,
|
alpha_beta_on: bool,
|
||||||
/// Limit regular search depth
|
/// Limit regular search depth
|
||||||
depth: usize,
|
depth: usize,
|
||||||
/// Limit quiescence search depth (extra depth on top of regular depth)
|
|
||||||
quiesce_depth: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for SearchConfig {
|
impl Default for SearchConfig {
|
||||||
@ -106,7 +104,6 @@ impl Default for SearchConfig {
|
|||||||
SearchConfig {
|
SearchConfig {
|
||||||
alpha_beta_on: true,
|
alpha_beta_on: true,
|
||||||
depth: 5,
|
depth: 5,
|
||||||
quiesce_depth: 2,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,57 +134,6 @@ fn move_priority(board: &mut Board, mv: &Move) -> EvalInt {
|
|||||||
eval
|
eval
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Search past the "horizon" caused by limiting the minmax depth.
|
|
||||||
///
|
|
||||||
/// We'll only search captures.
|
|
||||||
///
|
|
||||||
/// # Returns
|
|
||||||
///
|
|
||||||
/// Absolute (good for current side is positive) evaluation of the position.
|
|
||||||
fn quiesce(
|
|
||||||
board: &mut Board,
|
|
||||||
config: &SearchConfig,
|
|
||||||
depth: usize,
|
|
||||||
mut alpha: EvalInt,
|
|
||||||
beta: EvalInt,
|
|
||||||
) -> EvalInt {
|
|
||||||
if depth == 0 {
|
|
||||||
let eval = board.eval();
|
|
||||||
return eval * EvalInt::from(board.turn.sign());
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut abs_best = None;
|
|
||||||
|
|
||||||
// sort moves by decreasing priority
|
|
||||||
let mut mvs: Vec<_> = board
|
|
||||||
.gen_moves()
|
|
||||||
.into_iter()
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.into_iter()
|
|
||||||
.map(|mv| (move_priority(board, &mv), mv))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
mvs.sort_unstable_by_key(|mv| -mv.0);
|
|
||||||
for (_priority, mv) in mvs {
|
|
||||||
if move_get_capture(board, &mv).is_none() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let anti_mv = mv.make(board);
|
|
||||||
let abs_score = -quiesce(board, config, depth - 1, -beta, -alpha);
|
|
||||||
anti_mv.unmake(board);
|
|
||||||
if let Some(abs_best_score) = abs_best {
|
|
||||||
abs_best = Some(max(abs_best_score, abs_score));
|
|
||||||
} else {
|
|
||||||
abs_best = Some(abs_score);
|
|
||||||
}
|
|
||||||
alpha = max(alpha, abs_best.unwrap());
|
|
||||||
if alpha >= beta && config.alpha_beta_on {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
abs_best.unwrap_or(board.eval() * EvalInt::from(board.turn.sign()))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Search the game tree to find the absolute (positive good) move and corresponding eval for the
|
/// Search the game tree to find the absolute (positive good) move and corresponding eval for the
|
||||||
/// current player.
|
/// current player.
|
||||||
///
|
///
|
||||||
@ -214,7 +160,7 @@ fn minmax(
|
|||||||
let beta = beta.unwrap_or(EVAL_BEST);
|
let beta = beta.unwrap_or(EVAL_BEST);
|
||||||
|
|
||||||
if depth == 0 {
|
if depth == 0 {
|
||||||
let eval = quiesce(board, config, config.quiesce_depth, alpha, beta);
|
let eval = board.eval() * EvalInt::from(board.turn.sign());
|
||||||
return (Vec::new(), SearchEval::Centipawns(eval));
|
return (Vec::new(), SearchEval::Centipawns(eval));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user