首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从花瓣图中找出从A到B的最短路径是哪种算法?

从花瓣图中找出从A到B的最短路径是哪种算法?
EN

Stack Overflow用户
提问于 2017-04-14 23:44:33
回答 1查看 1.8K关注 0票数 6

我有一个方向图,希望找到从节点A到节点B的最短路径。我在crates.io上搜索了花瓣图,它看起来像最流行的板条箱。它是实现了许多算法,但没有一个能解决我的任务。我错过了什么吗?

例如,迪克斯特拉算法返回路径成本,但是哪条路径的成本最小?Bellman算法返回路径成本和节点,但不返回路径。

这是我找到的从图中打印路径的最简单方法:

代码语言:javascript
复制
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]]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-22 14:09:37

作为评论中提到 (由库的主要作者,至少),您可以使用A* (astar)算法:

代码语言:javascript
复制
use petgraph::{algo, prelude::*}; // 0.5.1

fn main() {
    let mut graph = Graph::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 path = algo::astar(
        &graph,
        a,               // start
        |n| n == d,      // is_goal
        |e| *e.weight(), // edge_cost
        |_| 0,           // estimate_cost
    );

    match path {
        Some((cost, path)) => {
            println!("The total cost was {}: {:?}", cost, path);
        }
        None => println!("There was no path"),
    }
}
代码语言:javascript
复制
The total cost was 2: [NodeIndex(0), NodeIndex(1), NodeIndex(3)]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43420605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档