make nodes depend on snake length

This commit is contained in:
Max Känner 2024-10-06 22:28:08 +02:00
parent 6751c7e9cd
commit 4e44ac548c

View File

@ -19,7 +19,7 @@ use std::{
use log::{error, info, warn}; use log::{error, info, warn};
use ordered_float::OrderedFloat; use ordered_float::OrderedFloat;
use rand::thread_rng; use rand::{prelude::*, thread_rng};
use serde_json::{json, Value}; use serde_json::{json, Value};
use crate::{ use crate::{
@ -172,7 +172,8 @@ pub fn get_move(
let chosen = actions let chosen = actions
.iter() .iter()
.max_by_key(|(_, stat)| OrderedFloat(stat.won as f64 / stat.played as f64)) .max_by_key(|(_, stat)| OrderedFloat(stat.won as f64 / stat.played as f64))
.map(|(direction, _)| *direction)?; .map(|(direction, _)| *direction)
.or_else(|| possible_actions.iter().choose(&mut thread_rng()).copied())?;
info!( info!(
"DIRECTION {turn}: {chosen:?} after {}ms ({})", "DIRECTION {turn}: {chosen:?} after {}ms ({})",
@ -205,7 +206,7 @@ struct DeadlineError;
struct Node { struct Node {
statistic: Statistics, statistic: Statistics,
child_statistics: BTreeMap<SnakeToken, BTreeMap<Direction, ActionStatistic>>, child_statistics: BTreeMap<SnakeToken, BTreeMap<Direction, ActionStatistic>>,
childs: BTreeMap<BTreeMap<SnakeToken, Direction>, Node>, childs: BTreeMap<BTreeMap<SnakeToken, (Direction, usize)>, Node>,
} }
impl Node { impl Node {
@ -258,9 +259,13 @@ impl Node {
.collect(); .collect();
board.simulate_actions(&actions, &mut thread_rng()); board.simulate_actions(&actions, &mut thread_rng());
let map_actions = actions
.iter()
.map(|(&snake, &action)| (snake, (action, board.snake_length(snake).unwrap_or(0))))
.collect();
let winner = self let winner = self
.childs .childs
.entry(actions.clone()) .entry(map_actions)
.or_default() .or_default()
.monte_carlo_step(board, deadline)?; .monte_carlo_step(board, deadline)?;
@ -352,9 +357,13 @@ impl Node {
return Err(DeadlineError); return Err(DeadlineError);
} }
board.simulate_actions(&actions, &mut thread_rng()); board.simulate_actions(&actions, &mut thread_rng());
let map_actions = actions
.iter()
.map(|(&snake, &action)| (snake, (action, board.snake_length(snake).unwrap_or(0))))
.collect();
let lengths = self let lengths = self
.childs .childs
.entry(actions.clone()) .entry(map_actions)
.or_default() .or_default()
.monte_carlo_step_solo(board, deadline)?; .monte_carlo_step_solo(board, deadline)?;