网络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),则拓扑排序是可能的。
具有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),则拓扑排序是可能的。