堆栈溢出!
我有一个有向图,需要找到源顶点和目标顶点之间的所有路径。在多个顶点之间,有多个边。使用图形工具,可能会建议使用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)
返回的路径。
有没有办法以源顶点和目标顶点之间的边的形式返回所有路径?
答案 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))
最后,将成本函数或任何其他函数应用于值列表。