Python Dijkstra k最短路径
作者:互联网
我正在尝试制作一个小型公共交通路线应用程序.
我的数据以下列结构表示:
graph = {'A': {'B':3, 'C':5},
'B': {'C':2, 'D':2},
'C': {'D':1},
'D': {'C':3},
'E': {'F':8},
'F': {'C':2}}
哪里:
>图表dict键是一个节点
> subdict键是2个节点之间的边
> subdict value是边权重
我正在使用这里描述的find_shortest_path算法https://www.python.org/doc/essays/graphs/,但由于递归而且它不支持权重,所以它相当慢.
所以我转到了Davide Epstein在这里描述的算法http://code.activestate.com/recipes/119466-dijkstras-algorithm-for-shortest-paths/(甚至更好的实现可以在使用heapq的评论中找到)
它工作得很好,它真的很快,但我只获得最佳路线而不是所有可能路线的列表.这就是我陷入困境的地方.
有人可以帮助我,或者至少给出指示?我在图最短路径算法方面不是很好.
提前致谢!
解决方法:
毫无疑问,图中会有大量的最短路径.因此很难在满足时间复杂度的情况下生成所有最短路径.但我可以给你一个简单的方法,可以获得你想要的最短路径.
算法
>从起点运行Dijkstra算法,得到disS [i]列表(最短距离
在起点和点之间i).然后从终点运行Dijkstra算法,得到disT [i]列表(终点和点i之间的最短距离)
>制作新图表:对于原始图表中的边缘,如果
disS [a] disT [b] w(a,b)== disS [结束点],我们在新图中添加边.显然,新图是DAG(有向无环图),并且具有接收器(起始点)和目标(终点).从接收器到目标的任何路径都是原始图中的最短路径.
>您可以在新图表中运行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, [])
标签:dijkstra,python,algorithm,graph,graph-algorithm 来源: https://codeday.me/bug/20191004/1854522.html