mirror of
https://github.com/Noratrieb/monte-carlo-tree-search.git
synced 2026-01-14 15:25:09 +01:00
pain
This commit is contained in:
parent
3cf581ced6
commit
eac879cada
1 changed files with 16 additions and 12 deletions
28
src/lib.rs
28
src/lib.rs
|
|
@ -4,8 +4,8 @@ mod basic_search;
|
||||||
|
|
||||||
pub use mcts::find_next_move;
|
pub use mcts::find_next_move;
|
||||||
|
|
||||||
pub trait GameState: Clone {
|
pub trait GameState: Clone + std::fmt::Debug {
|
||||||
type Player: Eq + Copy;
|
type Player: Eq + Copy + std::fmt::Debug;
|
||||||
|
|
||||||
fn next_states(&self) -> Box<dyn ExactSizeIterator<Item = Self>>;
|
fn next_states(&self) -> Box<dyn ExactSizeIterator<Item = Self>>;
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ mod mcts {
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct Node<'tree, S> {
|
struct Node<'tree, S> {
|
||||||
state: S,
|
state: S,
|
||||||
visited: Cell<u32>,
|
visited: Cell<u32>,
|
||||||
|
|
@ -62,7 +62,9 @@ mod mcts {
|
||||||
|
|
||||||
let root_node = alloc.alloc(Node::new(current_state, &alloc));
|
let root_node = alloc.alloc(Node::new(current_state, &alloc));
|
||||||
|
|
||||||
for _ in 0..MAX_TRIES {
|
for i in 0..MAX_TRIES {
|
||||||
|
dbg!(i);
|
||||||
|
|
||||||
let promising_node = select_promising_node(root_node);
|
let promising_node = select_promising_node(root_node);
|
||||||
|
|
||||||
if promising_node.state.player_won() == None {
|
if promising_node.state.player_won() == None {
|
||||||
|
|
@ -89,7 +91,7 @@ mod mcts {
|
||||||
let mut node = root_node;
|
let mut node = root_node;
|
||||||
|
|
||||||
while !node.children.get().is_empty() {
|
while !node.children.get().is_empty() {
|
||||||
node = uct::find_best_node_with_uct(root_node).unwrap()
|
node = uct::find_best_node_with_uct(node).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
node
|
node
|
||||||
|
|
@ -125,10 +127,7 @@ mod mcts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn simulate_random_playout<'p, S: GameState>(
|
fn simulate_random_playout<S: GameState>(node: &Node<'_, S>, opponent: S::Player) -> S::Player {
|
||||||
node: &Node<'_, S>,
|
|
||||||
opponent: S::Player,
|
|
||||||
) -> S::Player {
|
|
||||||
let mut state = node.state.clone();
|
let mut state = node.state.clone();
|
||||||
|
|
||||||
let mut board_status = state.player_won();
|
let mut board_status = state.player_won();
|
||||||
|
|
@ -145,6 +144,11 @@ mod mcts {
|
||||||
None => {
|
None => {
|
||||||
state.next_random_play();
|
state.next_random_play();
|
||||||
board_status = state.player_won();
|
board_status = state.player_won();
|
||||||
|
dbg!(&board_status);
|
||||||
|
|
||||||
|
if let None = board_status {
|
||||||
|
println!("none");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some(player) => return player,
|
Some(player) => return player,
|
||||||
}
|
}
|
||||||
|
|
@ -184,7 +188,7 @@ pub mod tic_tac_toe {
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use std::fmt::{Display, Formatter, Write};
|
use std::fmt::{Display, Formatter, Write};
|
||||||
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
pub enum Player {
|
pub enum Player {
|
||||||
O,
|
O,
|
||||||
X,
|
X,
|
||||||
|
|
@ -201,7 +205,7 @@ pub mod tic_tac_toe {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
enum State {
|
enum State {
|
||||||
Empty,
|
Empty,
|
||||||
X,
|
X,
|
||||||
|
|
@ -227,7 +231,7 @@ pub mod tic_tac_toe {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct Board {
|
pub struct Board {
|
||||||
active_player: Player,
|
active_player: Player,
|
||||||
board: [State; 9],
|
board: [State; 9],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue