【发布时间】:2017-04-14 23:44:33
【问题描述】:
我有一个方向图,想找到从节点 A 到节点 B 的最短路径。我在 crates.io 上搜索,发现 petgraph 看起来像最流行的板条箱。它implements a number of algorithms,但没有一个能解决我的任务。我错过了什么吗?
例如,Dijkstra's algorithm 返回路径成本,但哪条路径的成本最低? Bellman-Ford algorithm 返回路径成本 和节点,但没有路径。
这是我发现的从图中打印路径的最简单方法:
extern crate petgraph;
use petgraph::prelude::*;
use petgraph::algo::dijkstra;
fn main() {
let mut graph = Graph::<&str, i32>::new();
let a = graph.add_node("a");
let b = graph.add_node("b");
let c = graph.add_node("c");
let d = graph.add_node("d");
graph.extend_with_edges(&[(a, b, 1), (b, c, 1), (c, d, 1), (a, b, 1), (b, d, 1)]);
let paths_cost = dijkstra(&graph, a, Some(d), |e| *e.weight());
println!("dijkstra {:?}", paths_cost);
let mut path = vec![d.index()];
let mut cur_node = d;
while cur_node != a {
let m = graph
.edges_directed(cur_node, Direction::Incoming)
.map(|edge| paths_cost.get(&edge.source()).unwrap())
.min()
.unwrap();
let v = *m as usize;
path.push(v);
cur_node = NodeIndex::new(v);
}
for i in path.iter().rev().map(|v| graph[NodeIndex::new(*v)]) {
println!("path: {}", i);
}
}
据我所知,我需要根据结果自己计算路径
dijkstra.
我相信,如果我自己实现dijkstra(基于dijkstra.rs 的实现),并取消注释predecessor 的行并返回predecessor,最终的变体会更快,因为答案将是类似predecessor[predecessor[d]]。
【问题讨论】:
-
从您的最后几句话来看,您似乎对 Dijkstra 和 Bellman-Ford 算法缺乏了解。我建议您先研究它们及其结果。
-
@E_net4 我不明白你,我看看 Dijkstra (github.com/bluss/petgraph/blob/master/src/dijkstra.rs) 的实现,他们只是评论包含结果路径的 hashmap,而不是返回这个路径。了解 Dijkstra 实施对我有何帮助?
-
请在问题中包含您尝试过的内容。如果特定 API 有问题,请指出。
-
我建议你多看一下
petgraph::algo::dijkstra上的文档,你链接了:) -
请使用这个算法:astar。