diff options
| author | Mike White <botahamec@outlook.com> | 2021-09-18 22:49:34 -0400 |
|---|---|---|
| committer | Mike White <botahamec@outlook.com> | 2021-09-18 22:49:34 -0400 |
| commit | 86273330cd6e09b1fe4b9c6efbfb9c56033e28bd (patch) | |
| tree | 9013aa83df8edf4da89837a0732e13903a7ea898 /ai/src/lib.rs | |
| parent | f0f18161c6a20db901cfd285491b8677e4c41851 (diff) | |
Created a transposition table and fixed some bugs
Diffstat (limited to 'ai/src/lib.rs')
| -rw-r--r-- | ai/src/lib.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/ai/src/lib.rs b/ai/src/lib.rs index 7bee732..426ee47 100644 --- a/ai/src/lib.rs +++ b/ai/src/lib.rs @@ -1,8 +1,11 @@ +use crate::transposition_table::TranspositionTableReference; pub use model::{CheckersBitBoard, Move, PieceColor, PossibleMoves}; use parking_lot::{Mutex, RwLock}; use rayon::prelude::*; use std::mem::MaybeUninit; +mod transposition_table; + const KING_WORTH: u32 = 2; fn eval_position(board: CheckersBitBoard) -> f32 { @@ -42,12 +45,26 @@ pub fn eval_singlethreaded( 1.0 - eval_position(board) } } else { + let table = TranspositionTableReference::new(); + if let Some(eval) = table.get(board, depth as u8) { + return eval; + } + let turn = board.turn(); let mut best_eval = f32::NEG_INFINITY; let moves = PossibleMoves::moves(board); if moves.is_empty() { - return 0.5; + let pos_eval = if board.turn() == PieceColor::Dark { + eval_position(board) + } else { + 1.0 - eval_position(board) + }; + return if pos_eval < f32::EPSILON || pos_eval > 1.0 - f32::EPSILON { + pos_eval + } else { + 0.5 + }; } for current_move in PossibleMoves::moves(board) { @@ -58,6 +75,9 @@ pub fn eval_singlethreaded( eval_singlethreaded(depth - 1, alpha, beta, board) }; + let table = TranspositionTableReference::new(); + table.insert(board, current_eval, depth as u8); + if current_eval >= beta { return beta; } |
