make nodes depend on snake length
This commit is contained in:
parent
6751c7e9cd
commit
4e44ac548c
@ -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)?;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user