diff --git a/azalea-pathfinder/src/dstarlite.rs b/azalea-pathfinder/src/dstarlite.rs new file mode 100644 index 00000000..53556a95 --- /dev/null +++ b/azalea-pathfinder/src/dstarlite.rs @@ -0,0 +1,51 @@ +//! An implementation of D* Lite (optimized version) from +//! http://idm-lab.org/bib/abstracts/papers/aaai02b.pdf + +use std::collections::BinaryHeap; + +#[derive(Default, Ord)] +pub struct Vertex +where + Weight: Default + Ord, +{ + pub g: Weight, + pub rhs: Weight, +} + +type Heuristic = fn(start: &Vertex, current: &Vertex) -> Weight; + +pub struct DStarLite +where + Weight: Default + Ord, +{ + pub start: Vertex, + pub goal: Vertex, + + pub queue: BinaryHeap>, + + pub k_m: Weight, + pub heuristic: Heuristic, +} + +impl DStarLite { + fn calculate_key(&self, s: &Vertex) -> (Weight, Weight) { + // return [min(g(s), rhs(s)) + h(s_start, s) + k_m, min(g(s), rhs(s))] + ( + s.g.min(s.rhs) + self.heuristic(self.start, s) + self.k_m, + s.g.min(s.rhs), + ) + } + + fn initialize(&self) { + let priority_queue = BinaryHeap::new(); + let k_m = 0; + self.goal.rhs = 0; + priority_queue.push(self.goal, (self.heuristic(&self.start, self.goal), 0)); + } + + fn update_vertex(&self, u: Vertex, priority_queue: BinaryHeap) { + // if(g(u)) != rhs(u) AND u is in U) U.Update(u, calculate_key(u)) + // if u.g != u.rhs && priority_queue.contains(u) { + // priority_queue.update(u, calculate_key(s_start, u, h)); + } +} diff --git a/azalea-pathfinder/src/lib.rs b/azalea-pathfinder/src/lib.rs index 7d12d9af..f07e299a 100644 --- a/azalea-pathfinder/src/lib.rs +++ b/azalea-pathfinder/src/lib.rs @@ -1,3 +1,5 @@ +mod dstarlite; + pub fn add(left: usize, right: usize) -> usize { left + right }