问题 在有向树(igraph)中从一个节点到另一个节点的所有可能路径


我用 python绑定 至 IGRAPH 表示有向树。我想找到从该图中的一个节点到另一个节点的所有可能路径。不幸的是,我无法在执行此任务的igraph中找到准备使用的功能?

编辑 

对无数路径的关注

我所说的图实际上是一个带有单根的有向无环图(DAG)。它表示单级级联事件,在级联的各个级别上,可以拆分或连接在一起。正如我所说,这是一个单向图。还提供图表不包含任何循环。由于这两个原因,无限的路径列表是不可能的。

我想做什么?

我的目标是找到从图形顶部(根)到给定节点的所有可能路径。


5339
2017-10-19 19:17


起源

只要这两个节点都可以到达另一个节点,您就可以通过在到达目标节点之前重复遍历边缘来构建无限多个路径。出于这个原因,所有可能路径的非终止列表不太可能对你有好处。你真的想找到什么,为什么? - Jeremy W. Sherman
@Jeremy W. Sherman,我不得不提到我所说的图是一棵树。请参阅我的编辑,以澄清情况 - Boris Gorelik


答案:


您正在寻找有向无环图(DAG)中一个节点与另一个节点之间的所有路径。

树始终是DAG,但DAG并不总是树。不同之处在于树的分支不允许加入,只能分割,而DAG的分支可以一起流动,只要不引入循环即可。

您的解决方案可以找到 find_all_paths() 在 “Python模式 - 实现图形。” 这需要稍微适应与igraph一起使用。我没有安装igraph,但使用模拟,这似乎工作:

def adjlist_find_paths(a, n, m, path=[]):
  "Find paths from node index n to m using adjacency list a."
  path = path + [n]
  if n == m:
    return [path]
  paths = []
  for child in a[n]:
    if child not in path:
      child_paths = adjlist_find_paths(a, child, m, path)
      for child_path in child_paths:
        paths.append(child_path)
  return paths

def paths_from_to(graph, source, dest):
  "Find paths in graph from vertex source to vertex dest."
  a = graph.get_adjlist()
  n = source.index
  m = dest.index
  return adjlist_find_paths(a, n, m)

从文档中不清楚adjlist是顶点索引列表列表还是顶点对象列表列表。我假设列表包含简化使用adjlist的索引。结果,返回的路径是顶点索引。如果需要,则必须将这些映射回顶点对象,或者调整代码以附加顶点而不是其索引。


13
2017-10-19 22:27



+1这很好,我唯一要改变的是使用图形本身而不是邻接列表表示 adjlist_find_paths。 a[n] 然后可以替换为 graph.successors(n) 它可以为您提供相同的功能,但可以提前避免为可能较大的图形构建邻接列表。 (免责声明:我是应该被指责为igraph的人之一) - Tamás