在图形工具中查找源和目标之间的所有路径,返回边而不是顶点

时间:2018-09-19 06:21:39

标签: graph-tool

堆栈溢出!

我有一个有向图,需要找到源顶点和目标顶点之间的所有路径。在多个顶点之间,有多个边。使用图形工具,可能会建议使用graph_tool.topology.all_paths(g, source, target),但是,此顶点迭代器中包含的列表仅用于顶点。请参阅下面的一些输出。由于顶点之间存在多个边,因此出现了[ 0 4 8 13][0 4 13]之类的路径,因此无法区分这些路径。

iterator, paths:  [ 0  4  8 13]
iterator, paths:  [ 0  4 13]
iterator, paths:  [ 0  4  8 13]
iterator, paths:  [ 0  4 13]
iterator, paths:  [ 0  4  8 13]
iterator, paths:  [ 0  4 13]

我需要边缘形式的路径,以便能够沿每个路径遍历边缘属性。要解决此问题,我只能想到一种方法(除了重写大量代码外):创建中间顶点以避免在任何两个顶点之间出现多个边。对于两个顶点之间的任何平行边,它们将分别连接到它们自己的唯一中间顶点,以唯一地定义从graph_tool.topology.all_paths(g, source, target)返回的路径。

有没有办法以源顶点和目标顶点之间的边的形式返回所有路径?

2 个答案:

答案 0 :(得分:3)

最近已将其添加到图形工具:https://git.skewed.de/count0/graph-tool/commit/5457d04f5f37c7a49e87b67c666c1a865e206b9a

您只需要传递edges=True参数:

for p in all_paths(g, u, v, edges=True):
    for e in p:
        print(e)  # e is an edge descriptor

答案 1 :(得分:-1)

查找所有路径在计算上已经非常昂贵(O(N + E),IIRC)。如果您最终对边缘的数据属性组合感兴趣,那么我会在简化图上找到路径(没有多边缘),然后查找每个边缘的可能数据属性(可以在固定时间内完成)并计算数据属性的可能组合。分步操作:

找到路径。将节点列表转换为边列表。

path_edges = zip(path_nodes[:-1], path_nodes[1:])

创建一个字典(dict),将每个边(source, target)映射到数据属性列表,例如[0.2, 0.7, 42]。每个数据属性都对应一个多边(在您的情况下,其中许多可能是长度为1的列表,因为从您提供的数据样本中似乎很少有多边)。

计算路径中所有边的数据属性的所有组合。

 data = [edge_to_data[edge] for edge in path_edges]
 cartesian_product = itertools.product(*data) # returns an iterator!
 print(list(cartesian_product))

最后,将成本函数或任何其他函数应用于值列表。