Compare commits

..

2 Commits

Author SHA1 Message Date
c50892d79a elo: edit settings 2025-04-28 19:02:40 -04:00
6b9516a510 fix logic and minmax 2025-04-28 18:44:37 -04:00
2 changed files with 22 additions and 10 deletions

View File

@@ -2,7 +2,7 @@ use crate::{
agent::{Agent, RandomAgent},
complexagent::ComplexAgent,
game_inner::GameInner,
logic::{ChildrenEvalMethod, FutureMoveConfig},
logic::{ChildrenEvalMethod, FutureMoveConfig, FutureMoves},
repr::{Board, Piece, Winner},
};
use indicatif::{ProgressBar, ProgressStyle};
@@ -18,12 +18,19 @@ type AgentMaker = Box<dyn Fn(Piece) -> Box<dyn Agent>>;
#[allow(dead_code)]
pub fn run() {
let total_memory = 30_000_000_000;
let num_threads = std::thread::available_parallelism()
.map(NonZero::get)
.expect("unable to get number of threads");
let mem_per_thread = total_memory / num_threads;
let fmv_base = FutureMoveConfig {
max_depth: 20,
max_depth: 10,
min_arena_depth: 14,
top_k_children: 2,
up_to_minus: 10,
max_arena_size: usize::MAX,
// max_arena_size: usize::MAX,
max_arena_size: mem_per_thread / FutureMoves::ARENA_ENTRY_SIZE,
do_prune: false,
print: false,
children_eval_method: Default::default(),
@@ -129,7 +136,7 @@ pub fn run() {
let mut arena = PlayerArena::new(vec);
arena.prop_arena(100);
arena.prop_arena(500);
println!("{}", arena);
}
@@ -278,8 +285,7 @@ impl PlayerArena {
player_1,
player_2,
false,
// Board::random(rand::random_range(20..=30)),
Board::STARTING_POSITION,
Board::random(rand::random_range(4..=15)),
)
.expect("unable to create game")
.loop_until_result();

View File

@@ -109,6 +109,9 @@ impl FutureMoves {
}
}
pub const ARENA_ENTRY_SIZE: usize =
size_of::<Move>() + size_of::<usize>() * (Board::AREA.0 as usize / 4);
/// Return the length of the Arena
pub fn arena_len(&self) -> usize {
self.arena.len()
@@ -382,12 +385,15 @@ impl FutureMoves {
/// Return the best move which is a child of `self.current_root`
pub fn best_move(&self) -> Option<MoveCoord> {
self.current_root
.and_then(|x| {
self.arena[x]
.and_then(|x| match self.config.children_eval_method {
ChildrenEvalMethod::MinMax => self.arena[x]
.children
.iter()
// this would be considered `minimax`
.max_by_key(|&&idx| self.arena[idx].value)
.max_by_key(|&&idx| self.arena[idx].value.value),
ChildrenEvalMethod::MinMaxProb => self.arena[x]
.children
.iter()
.max_by_key(|&&idx| self.arena[idx].value),
})
.inspect(|&&x| {
assert_eq!(