【问题标题】:Networkx : getting all possible paths in DAGNetworkx:在 DAG 中获取所有可能的路径
【发布时间】:2019-09-06 18:42:07
【问题描述】:

我正在尝试将有向(非循环)图拆分为方向连接的路径,依赖于 connectivity

当我测试弱连接和强连接子图时,我得到的结果如下:

Weak connectivity :
['16', '17'], ['3', '41', '39', '42']
Strong connectivity :
['17'], ['16'], ['39'], ['41'], ['3'], ['42']

我理解弱连接结果,但不理解强连接结果,因为我期望 3 个子图:[16, 17], [42, 39] 和 [3, 41, 39]。

我在这里缺少什么,为什么那些单节点列表?如何得到预期的结果?

代码如下:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from([('16', '17'), ('3', '41'), ('41', '39'), ('42', '39')])

print("Weak connectivity : ")
for subgraph in (G.subgraph(c).copy() for c in nx.weakly_connected_components(G)) :
    print(subgraph.nodes)
print("Strong connectivity : ")
for subgraph in (G.subgraph(c).copy() for c in nx.strongly_connected_components(G)) :
    print(subgraph.nodes)

nx.draw_networkx(G, pos=nx.circular_layout(G))
plt.show()

【问题讨论】:

  • 一个强连通分量被定义为一个子图,使得存在从任何节点到任何其他节点的路径。 networkx给出的答案是正确的。也许您正在寻找其他东西?
  • 好吧,那么 [16, 17] 将是一个强连通子图,因为你可以从 16 到 17,不是吗?还是您还需要能够从 17 岁到 16 岁?
  • 我试图实现它以获得该图中所有可能的完整有向路径,所以我会从我的例子。
  • [16,17] 不是强定向的,因为没有从 17 到 16 的路径。
  • (我现在意识到这与连接无关,我对过于具体的案例下定了决心。一旦我知道我真正在寻找什么,我将编辑我的帖子)跨度>

标签: python graph networkx directed-graph


【解决方案1】:

因此,感谢 cmets & answers,我意识到“连接性”是我想要实现的目标的错误线索。明确一点:我想在有向无环图中获取所有起始节点到其连接的结束节点之间的每条可能路径

所以我最终编写了自己的解决方案,它很容易理解,但在性能或风格(pythonic / networkx)方面可能不是最好的。欢迎提出改进建议:)

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from([('16', '17'), ('3', '41'), ('41', '39'), ('42', '39')])

roots = []
leaves = []
for node in G.nodes :
  if G.in_degree(node) == 0 : # it's a root
    roots.append(node)
  elif G.out_degree(node) == 0 : # it's a leaf
    leaves.append(node)

for root in roots :
  for leaf in leaves :
    for path in nx.all_simple_paths(G, root, leaf) :
      print(path)

nx.draw_networkx(G, pos=nx.circular_layout(G))
plt.show()

(如果networkx中有内置功能,我显然错过了)

【讨论】:

    【解决方案2】:

    你缺少的是strongly connected的定义:

    [一个有向图] 是强连通的、非连通的或简单的 强,如果它包含从 u 到 v 的有向路径和有向路径 对于每对顶点 u, v 从 v 到 u。强分量是 最大强连通子图。

    您在显示的图表的任何两个节点之间没有强连接,更不用说您列出的 3 节点子图了。您确实可以遍历 3 -> 41 -> 39,但是没有返回 41 的路径,更不用说 3。因此,该图不是强连通的。

    【讨论】:

      【解决方案3】:

      根据强连通图的定义,你得到的结果是正确的。

      定义:强连通图

      如果 V 中的每个顶点 v 都可以从 V 中的每个其他顶点到达,则称有向图 G=(V,E) 是强连通的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 2014-10-16
        • 2017-05-06
        相关资源
        最近更新 更多