【发布时间】:2021-06-09 06:55:55
【问题描述】:
具有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.
谢谢。
【问题讨论】:
-
您的数据的最小工作示例将非常有用
-
@RiccardoBucco,已添加
-
叫做拓扑排序,在networkx.algorithms.dag.topological_sort下可以找到。
-
正是我需要的,@RiccardoBucco。非常感谢!您能否将您的评论设置为答案,以便我可以投票?