考虑以下针对networkx图的data set的图形结构。当上述数据集被转换成一棵树:Networkx图移除冗余路径以计算级别顺序
拓扑排序给出平次序如下输出(更多或更少,这正是我期待的),但没有提供有关信息每个节点对应。例如:n0:Level-0,n2:Level-1和n3:Level-1等等。
print(nx.topological_sort(G))
['n2', 'n1', 'n0', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n24', 'n27', 'n21', 'n23', 'n50', 'n15', 'n14', 'n16', 'n17', 'n25', 'n18', 'n19', 'n42', 'n28', 'n38', 'n30', 'n31', 'n32', 'n39', 'n33', 'n34', 'n35', 'n36', 'n37', 'n49', 'n41', 'n40', 'n43', 'n44', 'n29', 'n22', 'n20', 'n26', 'n45', 'n48', 'n46', 'n47', 'n51', 'n54', 'n52', 'n53', 'n11', 'n10', 'n13', 'n12', 'n55']
因此,我进一步处理所述数据集以与nextworkx.single_source_shortest_path_length()
和排序基于电平的顺序。由于在双图中存在多条边,所以单源最短路径输出不是很准确。
from operator import itemgetter
nd = nx.single_source_shortest_path_length(G,'n0')
sorted(nd.items(), key=itemgetter(1))
[('n0', 0),
('n12', 1),
('n13', 1),
...
('n4', 1),
('n5', 1),
('n6', 1),
('n7', 1)]
为了解决这个问题,我试图找出基于以下方法解决:
1.通过消除冗余路径和计算使用single_source_shortest_path()
水平顺序。为了实现这一点,我可能必须删除冗余路径,以使每个节点只有一条路径,直到根(n0),通过它的父节点。冗余路径除了在前往根节点(n0)的路径上访问附近节点(父节点)的路径之外的所有路径。因此,一个节点只能有一条路径(不一定是最短路径)。例如,如果节点(n221)具有到父节点(n22)的边,并且另一边是祖父节点(n或n2),则移除祖父节点的所有边(移除边n221- - > n),如果父母(n22)有一个边缘(n22 ---> n)给祖父母。
- 我可以得到拓扑排序输出。随着输出我可以重建使用
nx.topological_sort(G)
和nx.bfs_successors(G, 'n0')
类似于简单的树什么是this question
来达到的最终希望得到以下结果来迭代每个级别开始从N0为根:
Levels: nodes
1: n0
2: n3, n21
3: n4
4: n5
6: n7, n15 ...
7: ...
我在这里错过了什么来获得正确的结果,以及如何获得预期的行为?
我正在处理具有〜1.5K节点的非常大的数据集,因此在这里采用了一个简单的示例,而不是呈现完整的数据集。
你会考虑什么水平'n1'和'n2'?他们要么没有联系,要么是新的根。 – Kevin