网络x。有向图。从开始节点走到结束节点

networkx. digraph. walking from starting to ending nodes

具有networkx DiGraph 呈现以下结构: 我试图找到一种方法从最左边的节点(没有任何传入边)遍历有向图从中间节点(具有传入和传出边)呈现 data sources 呈现 operators 将数据转换到最右边边缘(只有传入边缘)呈现 data destinations。 我能够将初始图划分为一组孤立的子图(红色框):

subgraphs = weakly_connected_components(g)

但是我需要找到以上述方式遍历每个子图的方法。问题是我有不同类型的图表: 1 - 反向树 2 - 直线 3 - 反向树 4 - 很少有连接的反向树 树(非反向树)也可能发生。

例如对于 subgraph 1 我需要按顺序 1.1、1.2、1.3 或 1.1、1.3、1.2 传递节点。 确切的顺序并不重要。唯一严格的条件是在进入子图 4 中的 4.1 和 4.5 之前不传递到节点 4.7,但如上所述,我需要从没有任何传入边的节点开始行走。 有人可以建议任何已经在 networkx 中实现的现有算法,使这种步行成为可能吗? 与图中的循环发生碰撞的概率为零。

在屏幕截图上构建图形的示例代码:

import networkx as nx
from networkx.algorithms.components import weakly_connected_components

g = nx.DiGraph()
for i in range(0, 23):
    g.add_node(i)

g.add_edge(13,12)
g.add_edge(9, 8)
g.add_edge(3, 10)
g.add_edge(5, 13)
g.add_edge(7, 11)
g.add_edge(9, 14)
g.add_edge(7, 15)
g.add_edge(7, 16)
g.add_edge(17, 18)
g.add_edge(18, 19)
g.add_edge(3, 20)
g.add_edge(3, 22)
g.add_edge(18, 22)
g.add_edge(22, 21)

# removing unused nodes (without edges)
g.remove_node(0)
g.remove_node(1)
g.remove_node(2)
g.remove_node(4)
g.remove_node(6)

# get subgraphs
subgraphs = weakly_connected_components(g)

for subgraph in subgraphs:
    # here I need to iterate nodes in each subgraph 
    # in following sequence - passing dependent node can't
    # be passed before passing it's dependency nodes. For 
    # example, 4.7 can't be passed before 4.1 and 4.5, 4.5
    # can't be passed before 4.4. But no matter which of 4.1
    # and 4.5 will be passed first.

谢谢。

根据评论中的建议,您需要使用networkx.topological_sort。有向图的拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v 的每条有向边 uv,u 在排序中排在 v 之前。当且仅当图没有有向环时,即如果它是有向无环图 (DAG),则拓扑排序是可能的。