Nicolas Winkler 3 jaren geleden
bovenliggende
commit
dc332288e2
2 gewijzigde bestanden met toevoegingen van 21 en 7 verwijderingen
  1. 3 3
      src/hash.rs
  2. 18 4
      src/search.rs

+ 3 - 3
src/hash.rs

@@ -13,9 +13,9 @@ pub enum EntryType {
 
 #[derive(Clone)]
 pub struct CacheEntry {
-    entry_type: EntryType,
-    depth: i32,
-    value: PosValue
+    pub entry_type: EntryType,
+    pub depth: i32,
+    pub value: PosValue
 }
 
 pub struct Cache {

+ 18 - 4
src/search.rs

@@ -6,6 +6,7 @@ use log::info;
 use rand::prelude::*;
 use std::collections::HashMap;
 use engine::HashEntry;
+use hash::*;
 
 enum MoveUndo {
     Default {
@@ -39,7 +40,7 @@ pub enum SearchResult {
 /**
  * searches for moves and returns the best move found plus its value
  */
-pub fn search(game: &Game, sc: &mut SearchControl, hash: &mut HashMap<Game, HashEntry>, depth: i32) -> SearchResult {
+pub fn search(game: &Game, sc: &mut SearchControl, hash: &mut Cache, depth: i32) -> SearchResult {
 
     if depth == 0 {
         return SearchResult::Invalid;
@@ -72,8 +73,21 @@ pub fn search(game: &Game, sc: &mut SearchControl, hash: &mut HashMap<Game, Hash
     let mut cancelled = false;
     for mov in moves {
         let new_game = apply_move(game, mov);
+
+        let hash_entry = hash.lookup(&new_game);
+        if let Some(he) = hash_entry {
+            match he.entry_type {
+                EntryType::Value => {
+                    if he.depth >= depth {
+                        valued_moves.push((mov, he.value));
+                        continue;
+                    }
+                }
+            }
+        }
+
         //info!("searching {}", mov.to_string());
-        let (mut val, ret) = negamax(&new_game, sc, -beta, -alpha, depth - 1);
+        let (mut val, ret) = negamax(&new_game, sc, hash, -beta, -alpha, depth - 1);
         val = -val;
 
         if ret {
@@ -122,7 +136,7 @@ pub fn search(game: &Game, sc: &mut SearchControl, hash: &mut HashMap<Game, Hash
     }
 }
 
-fn negamax(game: &Game, sc: &mut SearchControl, mut alpha: PosValue, beta: PosValue, depth: i32) -> (PosValue, bool) {
+fn negamax(game: &Game, sc: &mut SearchControl, hash: &mut Cache, mut alpha: PosValue, beta: PosValue, depth: i32) -> (PosValue, bool) {
     if depth == 0 {
         return (quiescence_search(game, sc, alpha, beta, 7), false);
         let eval = evaluate(game);
@@ -159,7 +173,7 @@ fn negamax(game: &Game, sc: &mut SearchControl, mut alpha: PosValue, beta: PosVa
     }
     for mov in moves {
         let new_game = apply_move(game, mov);
-        let (mut val, ret) = negamax(&new_game, sc, -beta, -alpha, depth - 1);
+        let (mut val, ret) = negamax(&new_game, sc, hash, -beta, -alpha, depth - 1);
         val = -val;
 
         if ret {