从permuation集(python)中删除非法边

时间:2016-10-19 09:11:54

标签: python shortest-path brute-force

我正在尝试应用强力方法来查找原点和目标节点(OD对)之间的最短路径。我使用networkX创建网络并调用排列,然后应用暴力。
如果网络中的所有节点都与所有其他节点连接,则可以。但是如果没有一些或许多边缘,这种方法就不会有效。 为了使它正确,我应该删除所有包含非法边缘的permations。

例如,如果两个排列元组是

  

[(1,2,3,4,5),(1,2,4,3,5)]

并且在我的网络中,节点2和3之间没有边缘,应该删除上述列表中的第一个元组。

第一个问题:这是首先创建排列然后进入并删除那些包含非法边缘的有效方法吗?如果不是我该怎么办?

第二个问题:如果是,我的策略是我首先创建一个元组列表,其中包含来自networkx“G.has_edge(u,v)”命令的所有非法边缘,然后进入排列并查看是否存在这样的边缘,删除该排列等等。这是一个好策略吗?如果不是,你还有什么建议。

谢谢:)

1 个答案:

答案 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])