Added cost filter to A*
This commit is contained in:
@@ -120,7 +120,8 @@ impl<Q: SearchQueue<SearchNode>> SearchEnv<Q> {
|
|||||||
fn search(&mut self) -> Option<f32> {
|
fn search(&mut self) -> Option<f32> {
|
||||||
self.reset();
|
self.reset();
|
||||||
eprintln!("");
|
eprintln!("");
|
||||||
while let Some(node) = self.queue.q_next() {
|
while !self.is_done() {
|
||||||
|
let node = self.queue.q_next().unwrap();
|
||||||
// check whether node should be re-expanded
|
// check whether node should be re-expanded
|
||||||
{
|
{
|
||||||
let scoord = self.meta[node.last.0].sys_data.coords;
|
let scoord = self.meta[node.last.0].sys_data.coords;
|
||||||
@@ -268,16 +269,37 @@ impl<T> Default for DFS<T> {
|
|||||||
fn default() -> Self { DFS(Vec::new()) }
|
fn default() -> Self { DFS(Vec::new()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AStar<T>(BinaryHeap<Reverse<T>>);
|
struct AStar<T: SearchState>{
|
||||||
impl<T: Ord> SearchQueue<T> for AStar<T> {
|
q: BinaryHeap<Reverse<T>>,
|
||||||
fn q_next(&mut self) -> Option<T> { self.0.pop().map(|x| x.0) }
|
seen: HashMap<T::Id, f32>,
|
||||||
fn q_empty(&self) -> bool { self.0.is_empty() }
|
|
||||||
fn q_push(&mut self, item: T) { self.0.push(Reverse(item)); }
|
|
||||||
fn q_clear(&mut self) { self.0.clear(); }
|
|
||||||
fn q_len(&self) -> usize { self.0.len() }
|
|
||||||
}
|
}
|
||||||
impl<T: Ord> Default for AStar<T> {
|
impl<T: Ord + SearchState> SearchQueue<T> for AStar<T> where T::Id: Eq + Hash {
|
||||||
fn default() -> Self { AStar(BinaryHeap::new()) }
|
fn q_next(&mut self) -> Option<T> { self.q.pop().map(|x| x.0) }
|
||||||
|
fn q_empty(&self) -> bool { self.q.is_empty() }
|
||||||
|
fn q_push(&mut self, item: T) {
|
||||||
|
let id = item.id();
|
||||||
|
if let Some(odist) = self.seen.get(&id) {
|
||||||
|
if *odist < item.cost() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.seen.insert(id, item.cost());
|
||||||
|
self.q.push(Reverse(item));
|
||||||
|
}
|
||||||
|
fn q_clear(&mut self) {
|
||||||
|
self.q.clear();
|
||||||
|
self.seen.clear();
|
||||||
|
}
|
||||||
|
fn q_len(&self) -> usize { self.q.len() }
|
||||||
|
}
|
||||||
|
impl<T: Ord+SearchState> Default for AStar<T> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
q: BinaryHeap::new(),
|
||||||
|
seen: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -327,7 +349,7 @@ fn main() -> anyhow::Result<()> {
|
|||||||
base_jump: opts.jump_range,
|
base_jump: opts.jump_range,
|
||||||
init_system,
|
init_system,
|
||||||
target_system,
|
target_system,
|
||||||
queue: BFS1::default(),
|
queue: AStar::default(),
|
||||||
jumponium_cost_factor: opts.cost_factor,
|
jumponium_cost_factor: opts.cost_factor,
|
||||||
visits: 0,
|
visits: 0,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user