首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Dijkstra k最短路径

Python Dijkstra k最短路径
EN

Stack Overflow用户
提问于 2012-11-22 19:33:13
回答 3查看 12.1K关注 0票数 12

我正在尝试做一个小的公共交通路线应用程序。

我的数据用以下结构表示:

代码语言:javascript
复制
graph = {'A': {'B':3, 'C':5},
     'B': {'C':2, 'D':2},
     'C': {'D':1},
     'D': {'C':3},
     'E': {'F':8},
     'F': {'C':2}}

其中:

  1. 图切分键是一个节点
  2. subdict键是两个节点之间的一条边。
  3. 乘积值是一个边权。

我使用了这里描述的find_shortest_path算法,https://www.python.org/doc/essays/graphs/,但是由于递归,它非常慢,不支持权重。

因此,我转到了由Davide Epstein在这里描述的算法http://code.activestate.com/recipes/119466-dijkstras-algorithm-for-shortest-paths/ (在使用heapq的注释中可以找到更好的实现)。

它工作的很好,它真的很快,但我只得到最好的路线,而不是所有可能的路线清单。那就是我坚持的地方。

有人能帮我一下吗,或者至少给我个指示?我对图最短路径算法不是很在行。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-23 03:34:34

毫无疑问,图中会有大量的最短路径。因此,在满足时间复杂度的情况下,很难生成所有最短路径。但是我可以给你一个简单的方法,它可以得到你想要的最短路径。

算法

  1. 从起点运行Dijkstra算法,并获得disSi列表(起点与点i之间的最短距离)。然后从端点运行Dijkstra算法,得到disTi列表(端点到I点之间的最短距离)。
  2. 创建一个新图:对于原图中的边,如果disSa + disTb + w(a,b) == disSending点,则在新图中添加边。很明显,新的图是一个DAG(有向无圈图),并且有一个接收器(起始点)和一个目标(结束点)。从接收器到目标的任何路径都是原始图中的最短路径。
  3. 您可以在新图表中运行DFS。将路径信息保存在递归和回溯中,无论何时到达目标,所保存的信息都是最短路径。当算法的结尾都取决于你。

伪码:

代码语言:javascript
复制
def find_one_shortest_path(graph, now, target, path_info):
    if now == target:
        print path_info
        return
    for each neighbor_point of graph[now]:
        path_info.append(neighbor_point) 
        find_one_shortest_path(graph, neighbor_point, target, path_info) #recursion
        path_info.pop(-1) #backtracking

def all_shortest_paths(graph, starting_point, ending_point):
    disS = [] # shortest path from S
    disT = [] # shortest path from T
    new_graph = []
    disS = Dijkstra(graph, starting_point)
    disT = Dijkstra(graph, endinng_point)
    for each edge<a, b> in graph:
        if disS[a] + w<a, b> + disT[b] == disS[ending_point]:
            new_graph.add(<a, b>)
    find_one_shortest_path(new_graph, starting_point, ending_point, []) 
票数 9
EN

Stack Overflow用户

发布于 2012-11-22 19:50:03

Networkx有一个函数来执行这个路径

它返回所有最短路径的生成器。

票数 4
EN

Stack Overflow用户

发布于 2013-01-13 21:13:19

在交通网络分析中,我遇到了一个类似的问题。我使用了优秀的python模块NetworkX。它有一个函数来生成两个节点之间的所有简单路径。以下是链接:

paths.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13519030

复制
相关文章

相似问题

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