gpt4 book ai didi

python - networkx 中图形的遍历级别顺序

转载 作者:行者123 更新时间:2023-11-28 22:34:18 35 4
gpt4 key购买 nike

我正在尝试将 DiGraph 转换为 n 叉树并按级别顺序或 BFS 显示节点。我的树与此类似,但要大得多,为简单起见,使用此示例:

G = networkx.DiGraph()
G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])
G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])
G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])
G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])

树:从这个question中借用了数据:

n---->n1--->n11
| |--->n12
| |--->n13
| |--->n131
|--->n2
| |---->n21
| |---->n22
| |--->n221
|--->n3

为此,我正在使用 networkx.DiGraph 并成功创建了图形。这是我创建有向图的代码:

G = nx.DiGraph()
roots = set()
for l in raw.splitlines():
if len(l):
target, prereq = regex1.split(l)
deps = tuple(regex2.split(prereq))
print("Add node:") + target
roots.add(target)
G.add_node(target)
for d in deps:
if d:
G.add_edge(target, d)

我正在按照以下格式从一个大约 200 行的文件中读取所有数据,并尝试获取依赖关系树。我的图大约有 100 个节点和 600 条边。

AAA: BBB,CCC,DDD,
BBB:
DDD: EEE,FFF,GGG,KKK
GGG: AAA,BBB,III,LLL
....
...
..
.

在线查看 networkx 文档后,现在我可以使用以下代码实现对依赖树进行拓扑排序的级别顺序输出。

order =  nx.topological_sort(G)
print "topological sort"
print order

输出:

['n2', 'n3', 'n1', 'n21', 'n22', 'n11', 'n13', 'n12', 'n221', 'n131']

顺序似乎是正确的,但由于我需要批量处理作业(这样可以节省时间)而不是按顺序处理,所以我希望输出按级别排序输出批处理或使用 BFS。实现此目标的最佳方法是什么?
例如:级别 [0:n],例如:

0. ['n'] 
1. ['n2', 'n3', 'n1',]
2. ['n21', 'n22', 'n11',]
3. ['n13', 'n12', 'n221', 'n131']

最佳答案

您可以使用 bfs_edges() 函数以广度优先搜索顺序获取节点列表。

In [1]: import networkx

In [2]: G = networkx.DiGraph()

In [3]: G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])

In [4]: G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])

In [5]: G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])

In [6]: G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])

In [7]: list(networkx.bfs_edges(G,'n'))
Out[7]:
[('n', 'n2'),
('n', 'n3'),
('n', 'n1'),
('n2', 'n21'),
('n2', 'n22'),
('n1', 'n11'),
('n1', 'n13'),
('n1', 'n12'),
('n22', 'n221'),
('n13', 'n131')]

In [8]: [t for (s,t) in networkx.bfs_edges(G,'n')]
Out[8]: ['n2', 'n3', 'n1', 'n21', 'n22', 'n11', 'n13', 'n12', 'n221', 'n131']

In [9]: networkx.single_source_shortest_path_length(G,'n')
Out[9]:
{'n': 0,
'n1': 1,
'n11': 2,
'n12': 2,
'n13': 2,
'n131': 3,
'n2': 1,
'n21': 2,
'n22': 2,
'n221': 3,
'n3': 1}

关于python - networkx 中图形的遍历级别顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078805/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com