Hi there, I'm new to Rust programing and petgraph... I'm trying to implement a program that emulates google maps path search and I'm having some problems trying to implement the heuristic function into astar. I read these examples:
- https://timothy.hobbs.cz/rust-play/petgraph_review.html
- https://docs.rs/petgraph/latest/petgraph/algo/astar/fn.astar.html
But in any of these examples there is an heuristic function example that use a function that satisfy my needs. So I decided to implement and impl class than can be use as an heuristic function.... But... when i tried to run it, the compiler throw an error that say that it need a function not a method.
Can anyone help me understanding how to implement this type of heuristic function in a properly way?
My code:
use petgraph::graph::Graph;
use petgraph::graph::EdgeReference;
use petgraph::algo::astar;
use petgraph::graph::NodeIndex;
#[derive(Debug)]
struct Nodo {
id: u32,
latitud: f32,
longitud: f32
}
#[derive(Debug)]
struct Via {
distancia: f32
}
struct Rutas {
grafo: Graph<Nodo, Via>,
latitud_inicial: f32,
longitud_inicial: f32
}
impl Rutas {
pub fn add_node(&mut self, nodo: Nodo) -> NodeIndex {
self.grafo.add_node(nodo)
}
pub fn add_edge(&mut self, nodo_1: NodeIndex, nodo_2: NodeIndex, via: Via) {
self.grafo.add_edge(nodo_1, nodo_2, via);
}
pub fn set_coordinates(&mut self, nodo_objetivo: NodeIndex) {
self.latitud_inicial = self.grafo[nodo_objetivo].latitud;
self.longitud_inicial = self.grafo[nodo_objetivo].longitud;
}
pub fn compute_heuristic_distance(&mut self, nodo_busqueda: NodeIndex) -> f32 {
/*
x: longitud
y: latitud
*/
let latitud_busqueda = self.grafo[nodo_busqueda].latitud;
let longitud_busqueda = self.grafo[nodo_busqueda].longitud;
let dx = self.longitud_inicial - longitud_busqueda;
let dy = self.latitud_inicial - latitud_busqueda;
//println!("SELF {} {}", self.latitud_inicial, self.longitud_inicial);
//println!("INPUT {} {}", latitud_busqueda, longitud_busqueda);
(dx * dx + dy * dy).sqrt()
}
}
fn get_distances(er : EdgeReference<Via>) -> f32 {
er.weight().distancia
}
fn main() {
let rutas_esqueleto : Graph<Nodo, Via> = Graph::new();
//let mut lista_nodos: HashMap<NodeIndex, Nodo> = HashMap::new(); /*¿HasMap para almacenar los nodos? Aumentaria la memoria usada pero podria ser una opcion viable para evitar el borrow check*/
let mut rutas = Rutas{grafo: rutas_esqueleto, latitud_inicial: -9999.0, longitud_inicial: -9999.0};
let punto1 = rutas.add_node(Nodo{id: 1, latitud: 1.1, longitud: 1.2});
let punto2 = rutas.add_node(Nodo{id: 2, latitud: 2.1, longitud: 2.2});
let punto3 = rutas.add_node(Nodo{id: 3, latitud: 3.1, longitud: 3.2});
let punto4 = rutas.add_node(Nodo{id: 4, latitud: 4.1, longitud: 4.2});
rutas.add_edge(punto1, punto2, Via{distancia: 2.3});
rutas.add_edge(punto2, punto3, Via{distancia: 5.0});
rutas.add_edge(punto2, punto4, Via{distancia: 5.0});
rutas.set_coordinates(punto3);
let (cost, path) = astar(
&rutas.grafo,
punto1,
|n| n == punto3,
get_distances,
rutas.compute_heuristic_distance
).unwrap();
for node_ix in path.iter() {
println!("{:?}", rutas.node_weight(*node_ix).unwrap());
}
Error:
error[E0615]: attempted to take value of method compute_heuristic_distance
on type Rutas
--> src/main.rs:99:19
|
99 | rutas.compute_heuristic_distance
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ method, not a field
|
help: use parentheses to call the method
|
99 | rutas.compute_heuristic_distance(_)
| +++
For more information about this error, try rustc --explain E0615
.
error: could not compile fast_rusting_routes
due to previous error
Thank you for your time :D