我正在尝试做一个小的公共交通路线应用程序。
我的数据用以下结构表示:
graph = {'A': {'B':3, 'C':5},
'B': {'C':2, 'D':2},
'C': {'D':1},
'D': {'C':3},
'E': {'F':8},
'F': {'C':2}}其中:
我使用了这里描述的find_shortest_path算法,https://www.python.org/doc/essays/graphs/,但是由于递归,它非常慢,不支持权重。
因此,我转到了由Davide Epstein在这里描述的算法http://code.activestate.com/recipes/119466-dijkstras-algorithm-for-shortest-paths/ (在使用heapq的注释中可以找到更好的实现)。
它工作的很好,它真的很快,但我只得到最好的路线,而不是所有可能的路线清单。那就是我坚持的地方。
有人能帮我一下吗,或者至少给我个指示?我对图最短路径算法不是很在行。
提前感谢!
发布于 2012-11-23 03:34:34
毫无疑问,图中会有大量的最短路径。因此,在满足时间复杂度的情况下,很难生成所有最短路径。但是我可以给你一个简单的方法,它可以得到你想要的最短路径。
算法
伪码:
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, []) 发布于 2012-11-22 19:50:03
Networkx有一个函数来执行这个路径。
它返回所有最短路径的生成器。
发布于 2013-01-13 21:13:19
在交通网络分析中,我遇到了一个类似的问题。我使用了优秀的python模块NetworkX。它有一个函数来生成两个节点之间的所有简单路径。以下是链接:
paths.html
https://stackoverflow.com/questions/13519030
复制相似问题