我试图做一个小的公共交通路由的应用程序。
psented在以下结构我的数据重新$ P $:
图= {'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算法 www.python/doc/散文/图表/ 但正是因为递归相当缓慢,并没有支撑权重。
所以,我移动到达维德爱泼斯坦这里的$c$c.activestate/recipes/119466-dijkstras-algorithm-for-shortest-paths/ (甚至更好的实施,可以发现有与heapq的使用评论)
它的伟大工程,这是非常快的,但我只得到了最佳路线,而不是所有可能的路由列表。而这正是我卡住了。
可能有人帮我说请,或至少给一个方向?我不是在图中的最短路径算法很不错。
在此先感谢!
解决方案这是毫无疑问,会有大量的图中的最短路径。因此,很难产生在一个满意的时间复杂度的所有最短路径。但是,我可以给你,只要你想,可以让尽可能多的最短路径的简单方法。
算法I'm trying to make a small public transport routing application.
My data is represented in a following structure:
graph = {'A': {'B':3, 'C':5}, 'B': {'C':2, 'D':2}, 'C': {'D':1}, 'D': {'C':3}, 'E': {'F':8}, 'F': {'C':2}}Where:
I was using find_shortest_path algorithm described here www.python/doc/essays/graphs/ but it is rather slow because of recursion and has no support of weights.
So I moved to the algorithm described by Davide Epstein here code.activestate/recipes/119466-dijkstras-algorithm-for-shortest-paths/ (and even better implementation could be find there in comments with the usage of heapq)
It works great, it is really fast, but I get only the best route instead of the list of all possible routes. And that is where I stuck.
Could somebody help me with that please, or at least give a direction? I'm not very good in graph shortest paths algorithms.
Thanks in advance!
解决方案It's no doubt that there would be a huge amount of shortest paths in the graph. So it is hard to generate all shortest path in a satisfied time-complexity. But I can give you a simple method that can get as much shortest paths as you want.
AlgorithmPseudo Code:
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, [])