|
1 | 1 | use crate::structure::graph::graph_trait::GraphWeightTrait;
|
2 | 2 |
|
3 | 3 | /// Manhattan distance heuristic for A*
|
4 |
| -pub fn manhattan_heuristic<W: GraphWeightTrait + From<i32>>(node: usize, goal: usize) -> W { |
5 |
| - let ((x1, y1), (x2, y2)) = get_points(node, goal); |
| 4 | +pub fn manhattan_heuristic<W: GraphWeightTrait + From<i32>>( |
| 5 | + node: usize, |
| 6 | + goal: usize, |
| 7 | + nodes: usize, |
| 8 | +) -> W { |
| 9 | + let ((x1, y1), (x2, y2)) = get_points(node, goal, nodes); |
6 | 10 | W::from((x1 - x2).abs() + (y1 - y2).abs())
|
7 | 11 | }
|
8 | 12 |
|
9 | 13 | /// Euclidean distance heuristic for A*
|
10 |
| -pub fn euclidean_heuristic<W: GraphWeightTrait + From<i32>>(node: usize, goal: usize) -> W { |
11 |
| - let ((x1, y1), (x2, y2)) = get_points(node, goal); |
| 14 | +pub fn euclidean_heuristic<W: GraphWeightTrait + From<i32>>( |
| 15 | + node: usize, |
| 16 | + goal: usize, |
| 17 | + nodes: usize, |
| 18 | +) -> W { |
| 19 | + let ((x1, y1), (x2, y2)) = get_points(node, goal, nodes); |
12 | 20 | W::from(((x1 as f64 - x2 as f64).powi(2) + (y1 as f64 - y2 as f64).powi(2)).sqrt() as i32)
|
13 | 21 | }
|
14 | 22 |
|
15 | 23 | /// Chebyshev distance heuristic for A*
|
16 |
| -pub fn chebyshev_heuristic<W: GraphWeightTrait + From<i32>>(node: usize, goal: usize) -> W { |
17 |
| - let ((x1, y1), (x2, y2)) = get_points(node, goal); |
| 24 | +pub fn chebyshev_heuristic<W: GraphWeightTrait + From<i32>>( |
| 25 | + node: usize, |
| 26 | + goal: usize, |
| 27 | + nodes: usize, |
| 28 | +) -> W { |
| 29 | + let ((x1, y1), (x2, y2)) = get_points(node, goal, nodes); |
18 | 30 | W::from((x1 - x2).abs().max((y1 - y2).abs()))
|
19 | 31 | }
|
20 | 32 |
|
21 | 33 | /// Octile distance heuristic for A*
|
22 |
| -pub fn octile_heuristic<W: GraphWeightTrait + From<i32>>(node: usize, goal: usize) -> W { |
23 |
| - let ((x1, y1), (x2, y2)) = get_points(node, goal); |
| 34 | +pub fn octile_heuristic<W: GraphWeightTrait + From<i32>>( |
| 35 | + node: usize, |
| 36 | + goal: usize, |
| 37 | + nodes: usize, |
| 38 | +) -> W { |
| 39 | + let ((x1, y1), (x2, y2)) = get_points(node, goal, nodes); |
24 | 40 | let (dx, dy) = ((x1 - x2).abs(), (y1 - y2).abs());
|
25 | 41 | W::from((dx + dy) + ((2 - 2_i32.isqrt()) * dx.min(dy)))
|
26 | 42 | }
|
27 | 43 |
|
28 | 44 | /// Dijkstra's Heuristic
|
29 |
| -pub fn dijkstra_heuristic<W: GraphWeightTrait>(_: usize, _: usize) -> W { |
| 45 | +pub fn dijkstra_heuristic<W: GraphWeightTrait>(_: usize, _: usize, _: usize) -> W { |
30 | 46 | W::zero()
|
31 | 47 | }
|
32 | 48 |
|
33 |
| -fn get_points(node: usize, goal: usize) -> ((i32, i32), (i32, i32)) { |
| 49 | +fn get_points(node: usize, goal: usize, nodes: usize) -> ((i32, i32), (i32, i32)) { |
34 | 50 | (
|
35 |
| - (node as i32 % 3, node as i32 / 3), |
36 |
| - (goal as i32 % 3, goal as i32 / 3), |
| 51 | + ((node % nodes) as i32, (node / nodes) as i32), |
| 52 | + ((goal % nodes) as i32, (goal / nodes) as i32), |
37 | 53 | )
|
38 | 54 | }
|
0 commit comments