Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何使用图形工具找到备选(冗余)最短路径_Python 2.7_Graph Tool - Fatal编程技术网

Python 2.7 如何使用图形工具找到备选(冗余)最短路径

Python 2.7 如何使用图形工具找到备选(冗余)最短路径,python-2.7,graph-tool,Python 2.7,Graph Tool,我使用Dijkstra的最短路径算法来寻找从所有顶点到所有其他顶点的最短路径。然后,我使用边过滤器获取第一条边并“隐藏”它,然后再次重新计算最短路径以获得备用备份路径。我只想要一条备用路径,我不想找到所有路径 如果我以独立的方式调用该函数,并为其提供一对顶点,这将非常有效,我将获得预期的输出: compute_paths(g.vertex(9), g.vertex(8)) 产生: PRIMARY PATH: [9, 3, 8] SECONDARY PATH: [9, 4, 8] 但是,尝

我使用Dijkstra的最短路径算法来寻找从所有顶点到所有其他顶点的最短路径。然后,我使用边过滤器获取第一条边并“隐藏”它,然后再次重新计算最短路径以获得备用备份路径。我只想要一条备用路径,我不想找到所有路径

如果我以独立的方式调用该函数,并为其提供一对顶点,这将非常有效,我将获得预期的输出:

compute_paths(g.vertex(9), g.vertex(8))
产生:

PRIMARY PATH:   [9, 3, 8]
SECONDARY PATH: [9, 4, 8]
但是,尝试在循环中获取备份路径会产生许多空备份路径,而这些路径本不应该存在。例如:

for v in g.vertices():
    for vv in g.vertices():
        if v == vv:
            continue
        else:
            compute_paths(v, vv)
对于顶点9和顶点8之间的最短主路径和备份路径,将产生:

PRIMARY PATH:   [9, 3, 8]
SECONDARY PATH: []

我有点困了。我已经尝试过使用GraphView类和其他一些东西创建一个图的副本,但是每当我试图在循环中计算它时,我似乎无法使备份路径发生。

我发现了这个问题

与其将边过滤器设置为
None
,不如将所需边上的布尔属性映射重置为True

以下是我需要的结果:

def compute_paths(source, dest):
    results = graph_tool.topology.shortest_path(g, source, dest, weights=weight)
    filteredge[results[1][0]] = 0
    g.set_edge_filter(filteredge)
    s_results = graph_tool.topology.shortest_path(g, source, dest, weights=weight)
    print "PRIMARY PATH:   %s" % ([g.vertex_index[x] for x in results[0]])
    print "SECONDARY PATH: %s" % ([g.vertex_index[x] for x in s_results[0]])
    filteredge[results[1][0]] = 1

我想我仍然可以将边缘过滤器设置为
None
,但这似乎是多余的。

我发现了问题

与其将边过滤器设置为
None
,不如将所需边上的布尔属性映射重置为True

以下是我需要的结果:

def compute_paths(source, dest):
    results = graph_tool.topology.shortest_path(g, source, dest, weights=weight)
    filteredge[results[1][0]] = 0
    g.set_edge_filter(filteredge)
    s_results = graph_tool.topology.shortest_path(g, source, dest, weights=weight)
    print "PRIMARY PATH:   %s" % ([g.vertex_index[x] for x in results[0]])
    print "SECONDARY PATH: %s" % ([g.vertex_index[x] for x in s_results[0]])
    filteredge[results[1][0]] = 1
我想我仍然可以将边缘过滤器设置为
None
,但这似乎是多余的