Explorar el Código

tweak the evaluation function

Nicolas Winkler hace 2 años
padre
commit
fd6e203cb7
Se han modificado 3 ficheros con 40 adiciones y 6 borrados
  1. 37 3
      src/evaluate.rs
  2. 1 1
      src/hash.rs
  3. 2 2
      src/movegen.rs

+ 37 - 3
src/evaluate.rs

@@ -170,7 +170,7 @@ fn king_safety(game: &Game, side: Side) -> PosValue {
 
     let backrow =  if king & (ROW_1 | ROW_8) != 0 { 50 } else { 0 };
 
-    let kneighbors = guards.count_ones() as PosValue * 5 - attackers.count_ones() as PosValue * 15;
+    let kneighbors = guards.count_ones() as PosValue * 8 - attackers.count_ones() as PosValue * 15;
 
     let enemies = game.get_all_side(!side);
 
@@ -201,8 +201,10 @@ pub fn evaluate(game: &Game) -> PosValue {
     let castling_rights = castling_rights(game, game.turn) - castling_rights(game, !game.turn);
 
     let pawn_structure = pawn_structure(game, game.turn) - pawn_structure(game, !game.turn);
+    let bishop_moves = (bishop_moves(game, game.turn) - bishop_moves(game, !game.turn)) * 5;
+    let queen_moves = (queen_moves(game, game.turn) - queen_moves(game, !game.turn)) * 5;
 
-    let mge = sv + kv + king_safety + king_there + castling_rights + pawn_structure;
+    let mge = sv + kv + king_safety + king_there + castling_rights + pawn_structure + bishop_moves + queen_moves;
     let lge = late_game_eval(game);
 
     let lateness = game_lateness(game);
@@ -225,10 +227,12 @@ pub fn game_lateness(game: &Game) -> i32 {
     return 0;
 }
 
+///
+/// counts the number of moves the rooks of side can do
+/// 
 fn rook_moves(game: &Game, side: Side) -> PosValue {
     let rooks = game.rooks(side);
     let rook_moves = count_sliding_move_bitboard(
-        game,
         game.get_all_side(side),
         game.get_all_side(!side),
         rooks,
@@ -238,6 +242,36 @@ fn rook_moves(game: &Game, side: Side) -> PosValue {
     return rook_moves as _;
 }
 
+///
+/// counts the number of moves the bishops of side can do
+/// 
+fn bishop_moves(game: &Game, side: Side) -> PosValue {
+    let bishops = game.bishops(side);
+    let bishop_moves = count_sliding_move_bitboard(
+        game.get_all_side(side),
+        game.get_all_side(!side),
+        bishops,
+        false, true,
+        false);
+    
+    return bishop_moves as _;
+}
+
+///
+/// counts the number of moves the queens of side can do
+/// 
+fn queen_moves(game: &Game, side: Side) -> PosValue {
+    let queens = game.queens(side);
+    let queen_moves = count_sliding_move_bitboard(
+        game.get_all_side(side),
+        game.get_all_side(!side),
+        queens,
+        true, true,
+        false);
+    
+    return queen_moves as _;
+}
+
 pub fn late_game_eval(game: &Game) -> PosValue {
     let pp = pawn_push_value(game, game.turn) - pawn_push_value(game, !game.turn);
     let bp = blocked_pawns(game, game.turn) - blocked_pawns(game, !game.turn);

+ 1 - 1
src/hash.rs

@@ -4,7 +4,7 @@ use std::collections::{HashMap};
 use log::info;
 use zobrist;
 
-use crate::{movegen::Move, game};
+use crate::{movegen::Move};
 
 #[derive(Clone)]
 pub enum EntryType {

+ 2 - 2
src/movegen.rs

@@ -220,7 +220,7 @@ pub fn generate_legal_sorted_moves(game: &mut Game, _hash: &mut Cache, killers:
 
         let pv_bonus = if let Some(c) = &ce { if &c.mov == mov { 1000 } else { 0 } } else { 0 };
         let killer_bonus = if killers.contains(mov) { 300 } else { 0 };
-        let capture_bonus: i32 = -mvv_lva_score(mov) / 16;
+        let capture_bonus: i32 = if mov.is_capture() { 400 } else { 0 } - mvv_lva_score(mov) / 16;
 
         let eval = crate::evaluate::evaluate(game) - killer_bonus - capture_bonus - pv_bonus;
         game.undo_move(undo);
@@ -521,7 +521,7 @@ fn generate_queen_moves(game: &Game, side: Side, move_list: &mut Vec<Move>, capt
 }
 
 
-pub fn count_sliding_move_bitboard(game: &Game, friends: Bitboard, others: Bitboard, pieces: Bitboard, straight: bool, diagonal: bool, captures_only: bool) -> u32 {
+pub fn count_sliding_move_bitboard(friends: Bitboard, others: Bitboard, pieces: Bitboard, straight: bool, diagonal: bool, captures_only: bool) -> u32 {
     let pieces_iter = BitboardIterator(pieces);
 
     let mask = if captures_only { others } else { !(0 as Bitboard) };