【问题标题】:Finding all paths/walks of given length in a networkx graph在networkx图中查找给定长度的所有路径/步行
【发布时间】:2015-03-21 15:36:42
【问题描述】:

我正在使用 networkx 并试图在图中找到长度为 3 的所有步行,特别是具有三个边的路径。我试图在 networkx 文档中找到有关算法的一些信息,但我只能找到图中最短路径的算法。如果最短路径为 14 -> 15 -> 16,我能否找到通过特定节点的路径长度,例如通过节点 14 -> 11 -> 12 -> 16 的路径?这是一个示例的图表图像:

【问题讨论】:

  • @msw 我猜你的意思是all_pairs_dijkstra_path_length?您的链接转到线程文档
  • 是的 all_pairs_dijsktra_path_length 如果我想找出图中有多少条路径的长度为 3 或更低,但我想获得路径中边的权重总和,并且只有对于长度不小于 3 的路径。同样的事情适用于 all_pairs_dijkstra_path,你得到所有长度为 3 或更低的路径,而不仅仅是长度为 3 的路径。
  • 明确一点,a-b-a-b 不会是长度为 3 的路径,对吗?我假设您将忽略周期?
  • 根据定义路径是具有不同边和节点的步行,循环是介于两者之间的东西,因为它们的起始节点等于它们的结束节点。如果我必须选择,我会忽略周期。

标签: python path networkx shortest


【解决方案1】:

最简单的版本(下面是另一个我认为更快的版本):

def findPaths(G,u,n):
    if n==0:
        return [[u]]
    paths = [[u]+path for neighbor in G.neighbors(u) for path in findPaths(G,neighbor,n-1) if u not in path]
    return paths

这需要一个网络 G 和一个节点 u 和一个长度 n。它递归地查找从不包括uu 的邻居开始的所有长度为n-1 的路径。然后它将u 粘贴在每个此类路径的前面并返回这些路径的列表。

注意,每个路径都是一个有序列表。它们都从指定的节点开始。所以对于你想要的,只需围绕这个循环:

allpaths = []
for node in G:
    allpaths.extend(findPaths(G,node,3))

请注意,这将具有任何 a-b-c-d 路径以及反向 d-c-b-a 路径。

如果您发现“列表理解”难以解释,这里有一个等效选项:

def findPathsNoLC(G,u,n):
    if n==0:
        return [[u]]
    paths = []
    for neighbor in G.neighbors(u):
        for path in findPathsNoLC(G,neighbor,n-1):
            if u not in path:
                paths.append([u]+path)
    return paths

为了优化这一点,特别是如果有很多循环,可能值得发送一组不允许的节点。在每个嵌套调用中,它都知道在递归中不包括任何更高层的节点。这将代替if u not in path 检查。代码会有点难以理解,但运行起来会更快。

def findPaths2(G,u,n,excludeSet = None):
    if excludeSet == None:
        excludeSet = set([u])
    else:
        excludeSet.add(u)
    if n==0:
        return [[u]]
    paths = [[u]+path for neighbor in G.neighbors(u) if neighbor not in excludeSet for path in findPaths2(G,neighbor,n-1,excludeSet)]
    excludeSet.remove(u)
    return paths

请注意,我必须在递归调用之前将u 添加到excludeSet,然后在返回之前将其删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2012-12-25
    • 2014-08-26
    • 2014-08-21
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    相关资源
    最近更新 更多