use std::vec;
use rusty_planner::mcts;
use rusty_planner::planner;
const WIDTH: i32 = 5;
const HEIGHT: i32 = 5;
struct Arena {
obstacles: Vec<(i32, i32)>,
}
impl planner::ProblemSpace for Arena {
type State = (i32, i32);
type Iter = vec::IntoIter<(Self::State, f64)>;
fn heuristic(&self, _: &Self::State, _: &Self::State) -> f64 {
unimplemented!()
}
fn succ(&self, state: &Self::State) -> Self::Iter {
let mut res = vec![];
if state.0 < WIDTH && !self.obstacles.contains(&(state.0 + 1, state.1)) {
res.push(((state.0 + 1, state.1), 1.0));
}
if state.1 < HEIGHT && !self.obstacles.contains(&(state.0, state.1 + 1)) {
res.push(((state.0, state.1 + 1), 1.0));
}
if state.0 < WIDTH
&& state.1 < HEIGHT
&& !self.obstacles.contains(&(state.0 + 1, state.1 + 1))
{
res.push(((state.0 + 1, state.1 + 1), 0.8));
}
res.into_iter()
}
fn pred(&self, state: &Self::State) -> Self::Iter {
let mut res = vec![];
if state.0 >= 1 && !self.obstacles.contains(&(state.0 - 1, state.1)) {
res.push(((state.0 - 1, state.1), 1.0));
}
if state.1 >= 1 && !self.obstacles.contains(&(state.0, state.1 - 1)) {
res.push(((state.0, state.1 - 1), 1.0));
}
if state.0 >= 1 && state.1 >= 0 && !self.obstacles.contains(&(state.0 - 1, state.1 - 1)) {
res.push(((state.0 - 1, state.1 - 1), 0.8));
}
res.into_iter()
}
}
impl planner::Anytime for Arena {
fn callback(&mut self, s_0: &(i32, i32)) {
println!("Current best next step: {:?}", s_0);
}
}
fn main() {
let mut ps = Arena {
obstacles: vec![(2, 2), (3, 3), (4, 3), (4, 4)],
};
let start = (1, 1);
let goal = (WIDTH, HEIGHT);
mcts::solve(&mut ps, start, goal, 3);
}