diff --git a/src/search/mod.rs b/src/search/mod.rs index 55114fb..95c2884 100644 --- a/src/search/mod.rs +++ b/src/search/mod.rs @@ -18,7 +18,8 @@ pub const ASPIRATION_WINDOW_DEPTH_THRESHOLD: u8 = 4; pub const ASPIRATION_WINDOW_EXPANSION: i16 = 2; pub const LMR_DEPTH_THRESHOLD: u8 = 2; pub const LMR_MOVE_COUNT_THRESHOLD: u8 = 3; -pub const LMR_REDUCTION: u8 = 2; +pub const LMR_BASE: f32 = 1.0; +pub const LMR_DIVISION: f32 = 2.0; pub const NMP_REDUCTION: u8 = 2; pub const NMP_DEPTH_THRESHOLD: u8 = 2; pub const RFP_DEPTH_LIMIT: u8 = 6; diff --git a/src/search/negamax.rs b/src/search/negamax.rs index b3e1343..30fcda2 100644 --- a/src/search/negamax.rs +++ b/src/search/negamax.rs @@ -10,7 +10,7 @@ use super::{ quiescence::quiescence, time::TimeInfo, transposition_table::{NodeType, TTEntry}, - CHECK_EXTENSION, LMR_DEPTH_THRESHOLD, LMR_MOVE_COUNT_THRESHOLD, LMR_REDUCTION, MAX_HISTORY, + CHECK_EXTENSION, LMR_BASE, LMR_DEPTH_THRESHOLD, LMR_DIVISION, LMR_MOVE_COUNT_THRESHOLD, NMP_DEPTH_THRESHOLD, NMP_REDUCTION, RFP_DEPTH_LIMIT, RFP_MARGIN, }; @@ -123,22 +123,29 @@ pub fn negamax( let score = if legal_moves == 1 { -negamax(game, -beta, -alpha, depth - 1, plies + 1, time, nodes, true)? } else { - #[rustfmt::skip] let lmr_reduction = if !in_check && !mv.is_capture() && depth > LMR_DEPTH_THRESHOLD - && legal_moves > LMR_MOVE_COUNT_THRESHOLD { LMR_REDUCTION } else { 0 }; + && legal_moves > LMR_MOVE_COUNT_THRESHOLD + { + let log_product = (depth as f32).ln() * (legal_moves as f32).ln(); + let reduction = LMR_BASE + (log_product / LMR_DIVISION); + reduction.clamp(1.0, (depth - 1) as f32).floor() as u8 + } else { + 1 + }; let mut score = -negamax( game, -alpha - 1, -alpha, - depth - 1 - lmr_reduction, + depth - lmr_reduction, plies + 1, time, nodes, true, )?; + if score > alpha && score < beta { score = -negamax(game, -beta, -alpha, depth - 1, plies + 1, time, nodes, true)?; }