gpt4 book ai didi

Python Dijkstra k 最短路径

转载 作者:太空狗 更新时间:2023-10-29 18:04:01 27 4
gpt4 key购买 nike

我正在尝试制作一个小型公共(public)交通路线应用程序。

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

graph = {'A': {'B':3, 'C':5},
'B': {'C':2, 'D':2},
'C': {'D':1},
'D': {'C':3},
'E': {'F':8},
'F': {'C':2}}

地点:

  1. graph dict key是一个节点
  2. subdict key是2个节点之间的一条边
  3. subdict 值是一个边权重

我正在使用此处描述的 find_shortest_path 算法 https://www.python.org/doc/essays/graphs/但由于递归且不支持权重,因此速度相当慢。

所以我转向了 Davide Epstein 在这里描述的算法 http://code.activestate.com/recipes/119466-dijkstras-algorithm-for-shortest-paths/ (甚至可以在使用 heapq 的评论中找到更好的实现)

效果很好,速度非常快,但我只得到最佳路线,而不是所有可能路线的列表。这就是我坚持的地方。

有人可以帮我解决这个问题,或者至少给个方向吗?我不太擅长图最短路径算法。

提前致谢!

最佳答案

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

算法

  1. 从起点运行Dijkstra算法,得到disS[i]列表(最短距离在起点和点 i) 之间。然后从终点运行Dijkstra算法,得到disT[i]列表(终点到i点的最短距离)
  2. 制作新图:对于原图中的一条边,如果disS[a] + disT[b] + w(a, b) == disS[ending point],我们在新图中添加一条边。很明显,新图是一个 DAG(有向无环图),并且有一个 sink(起点)和一个 target(终点)。从汇点到目标点的任何路径都是原始图中的最短路径。
  3. 您可以在新图中运行 DFS。将路径信息保存在递归和回溯,任何时候你到达目标,保存信息将是一条最短路径。算法什么时候结束完全取决于你。

伪代码:

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, [])

关于Python Dijkstra k 最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com