feat: contempt factor
This commit is contained in:
parent
d93fc0ecb0
commit
3fe4b8c196
@ -112,6 +112,18 @@ pub struct SearchConfig {
|
|||||||
pub depth: usize,
|
pub depth: usize,
|
||||||
/// Limit quiescence search depth
|
/// Limit quiescence search depth
|
||||||
pub qdepth: usize,
|
pub qdepth: usize,
|
||||||
|
|
||||||
|
/// Parameter that sets how confident the engine is.
|
||||||
|
///
|
||||||
|
/// Positive means avoid draws, and try to win instead.
|
||||||
|
///
|
||||||
|
/// Depending on the game phase, an extra factor will be multiplied too; in the beginning of
|
||||||
|
/// the game the opponent is more likely to blunder later and lose their advantage, so we don't
|
||||||
|
/// go for draws. Later, the result is more certain, so reduce the contempt factor.
|
||||||
|
///
|
||||||
|
/// An alternative interpretation of this: the contempt factor is the negative of the value
|
||||||
|
/// assigned to a draw.
|
||||||
|
pub contempt: EvalInt,
|
||||||
/// Enable transposition table.
|
/// Enable transposition table.
|
||||||
pub enable_trans_table: bool,
|
pub enable_trans_table: bool,
|
||||||
/// Transposition table size (2^n where this is n)
|
/// Transposition table size (2^n where this is n)
|
||||||
@ -124,6 +136,7 @@ impl Default for SearchConfig {
|
|||||||
alpha_beta_on: true,
|
alpha_beta_on: true,
|
||||||
depth: 16,
|
depth: 16,
|
||||||
qdepth: 6,
|
qdepth: 6,
|
||||||
|
contempt: 23,
|
||||||
enable_trans_table: true,
|
enable_trans_table: true,
|
||||||
transposition_size: 24,
|
transposition_size: 24,
|
||||||
}
|
}
|
||||||
@ -209,6 +222,11 @@ fn minmax(board: &mut Board, state: &mut EngineState, mm: MinmaxState) -> (Vec<M
|
|||||||
}
|
}
|
||||||
|
|
||||||
let is_repetition_draw = board.history.count(board.zobrist) >= 2;
|
let is_repetition_draw = board.history.count(board.zobrist) >= 2;
|
||||||
|
let phase_factor = EvalInt::from(board.eval.min_maj_pieces / 5);
|
||||||
|
// positive here since we're looking from the opposite perspective.
|
||||||
|
// if white caused a draw, then we'd be black here.
|
||||||
|
// therefore, white would see a negative value for the draw.
|
||||||
|
let contempt = state.config.contempt * phase_factor;
|
||||||
|
|
||||||
// quiescence stand-pat score (only calculated if needed).
|
// quiescence stand-pat score (only calculated if needed).
|
||||||
// this is where static eval goes.
|
// this is where static eval goes.
|
||||||
@ -216,7 +234,7 @@ fn minmax(board: &mut Board, state: &mut EngineState, mm: MinmaxState) -> (Vec<M
|
|||||||
|
|
||||||
if mm.quiesce {
|
if mm.quiesce {
|
||||||
board_eval = Some(if is_repetition_draw {
|
board_eval = Some(if is_repetition_draw {
|
||||||
0
|
contempt
|
||||||
} else {
|
} else {
|
||||||
board.eval() * EvalInt::from(board.turn.sign())
|
board.eval() * EvalInt::from(board.turn.sign())
|
||||||
});
|
});
|
||||||
@ -348,7 +366,7 @@ fn minmax(board: &mut Board, state: &mut EngineState, mm: MinmaxState) -> (Vec<M
|
|||||||
}
|
}
|
||||||
|
|
||||||
if is_repetition_draw {
|
if is_repetition_draw {
|
||||||
abs_best = SearchEval::Exact(0);
|
abs_best = SearchEval::Exact(contempt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(best_move) = best_move {
|
if let Some(best_move) = best_move {
|
||||||
|
Loading…
Reference in New Issue
Block a user