如何使用图形工具

时间:2015-07-31 04:23:04

标签: python-2.7 graph-tool

Consider this graph

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

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]])
    g.set_edge_filter(None)

如果我以独立的方式调用函数,为它提供一对顶点,那么这很有用,我得到了我期望的输出:

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类创建一个图形副本,还有其他一些东西,但是当我试图在循环中计算它时,我似乎无法使备份路径发生。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。

我不应该将边缘过滤器设置为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,但这似乎是多余的。