This commit is contained in:
nora 2022-01-23 21:07:20 +01:00
parent fdba35e4ac
commit f95aeffef7
2 changed files with 30 additions and 63 deletions

View file

@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.8.4"

View file

@ -1,8 +1,31 @@
#![allow(dead_code)]
pub struct Node<T> {
value: T,
children: Vec<Node<T>>,
use rand::Rng;
mod basic_search;
pub trait GameState {
fn points(&self) -> i32;
fn next(&self) -> Box<dyn Iterator<Item = Self>>;
}
impl GameState for i32 {
fn points(&self) -> i32 {
*self
}
fn next(&self) -> Box<dyn Iterator<Item = Self>> {
let child_amount = rand::thread_rng().gen_range(0..10);
let mut i = 0;
Box::new(std::iter::from_fn(move || {
if i < child_amount {
Some(rand::random())
} else {
None
}
}))
}
}
#[macro_export]
@ -15,67 +38,10 @@ macro_rules! tree {
};
}
mod search {
use crate::Node;
use std::collections::VecDeque;
pub fn breadth_first_search<T: Eq>(tree: &Node<T>, searched: &T) -> bool {
let mut candidates = VecDeque::new();
candidates.push_back(tree);
loop {
if let Some(candidate) = candidates.pop_front() {
if candidate.value == *searched {
return true;
}
candidates.extend(candidate.children.iter());
} else {
break;
}
}
false
}
pub fn depth_first_search<T: Eq>(tree: &Node<T>, searched: &T) -> bool {
if tree.value == *searched {
return true;
}
for child in &tree.children {
if depth_first_search(&child, searched) {
return true;
}
}
false
}
}
mod mcts {}
#[cfg(test)]
mod tests {
use crate::search;
mod test {
#[test]
fn dfs() {
let tree = tree!(1, tree!(6, tree!(5), tree!(4)), tree!(6));
let has_seven = search::depth_first_search(&tree, &7);
let has_five = search::depth_first_search(&tree, &5);
assert!(!has_seven);
assert!(has_five);
}
#[test]
fn bfs() {
let tree = tree!(1, tree!(6, tree!(5), tree!(4)), tree!(6));
let has_seven = search::breadth_first_search(&tree, &7);
let has_five = search::breadth_first_search(&tree, &5);
assert!(!has_seven);
assert!(has_five);
}
fn t() {}
}