我正在尝试应用强力方法来查找原点和目标节点(OD对)之间的最短路径。我使用networkX创建网络并调用排列,然后应用暴力。
如果网络中的所有节点都与所有其他节点连接,则可以。但是如果没有一些或许多边缘,这种方法就不会有效。
为了使它正确,我应该删除所有包含非法边缘的permations。
例如,如果两个排列元组是
[(1,2,3,4,5),(1,2,4,3,5)]
并且在我的网络中,节点2和3之间没有边缘,应该删除上述列表中的第一个元组。
第一个问题:这是首先创建排列然后进入并删除那些包含非法边缘的有效方法吗?如果不是我该怎么办?
第二个问题:如果是,我的策略是我首先创建一个元组列表,其中包含来自networkx“G.has_edge(u,v)”命令的所有非法边缘,然后进入排列并查看是否存在这样的边缘,删除该排列等等。这是一个好策略吗?如果不是,你还有什么建议。
谢谢:)
答案 0 :(得分:0)
通用TSP的精确解被认为是非多项式。列举所有排列是最直接的方法,尽管其O(n!)
复杂度很高,但仍然有效。有关更多信息,请参阅wikipedia page of TSP。
至于您的具体问题,可以使用depth-first search对图表生成有效的排列。
显示此算法的类似Python的伪代码如下:
def dfs(vertex, visited):
if vertex == target_vertex:
visited.append(target_vertex)
if visited != graph.vertices:
return
do_it(visited) # visited is a valid permutation
for i in graph.vertices:
if not i in visited and graph.has_edge(vertex, i):
dfs(i, visited + [i])
dfs(start_vertex, [start_vertex])