【发布时间】:2016-10-27 12:37:48
【问题描述】:
是否有一种有效的方法可以使用 networkx 找到给定(无向)图的所有完全连接的组件(即完整的子图)?例如,我有以下邻接矩阵(没有自循环):
|0 1 1 0 0|
|1 0 1 0 0|
G = |1 1 0 1 0|
|0 0 1 0 1|
|0 0 0 1 0|
(0,1), (1,2), (0,2), (3,4), (2,3), (0,1,2)
我知道 networkx 有查找循环、强连接组件等的例程,但我找不到任何关于 全连接 组件的信息。如果 networkx 无法实现,那么 Numpy + Scipy 也可以。非常感谢!
编辑
这就是我所做的:
import networkx as nx
import itertools
def findsubsets(S, m):
return set(itertools.combinations(S, m))
A = np.array([[0, 1, 1, 0, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0]])
G = nx.from_numpy_matrix(A)
M = np.sqrt(np.size(A))
for m in range(2, M+1):
for a in findsubsets(range(0, M), m):
if(nx.number_of_edges(G.subgraph(a)) == (m**2 - m)/2.):
print nx.nodes(G.subgraph(a))
它基本上找到给定子图的所有可能的 mXm 子图,然后检查它们是否具有最大(即 (m**2 - m)/2)连接数。但我想知道是否有更有效的方法来做到这一点,因为函数 itertools.combinations 的性能对于大图来说不是很好。
【问题讨论】: