[英]Efficient way for finding all the complete subgraphs of a given graph (Python)?
有沒有一種有效的方法可以使用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
函數的性能對於大型圖形而言不是很好。
好的,我找到了。 它只是list(nx.find_cliques(G))
,只是因為我不知道在圖論中,集團是完全連接的子圖。
編輯
更准確地說, list(nx.find_cliques(G))
找到最大的集團,因此這不是我所需要的。 我在此鏈接上找到了類似的帖子。
所以正確的答案是使用list(nx.enumerate_all_cliques(G))
。 但是,此函數還會返回大小為1的小集團,我不喜歡它,因為我的圖形中沒有自循環。 因此,最終的解決方案是使用以下代碼行:
[s for s in nx.enumerate_all_cliques(G) if len(s) > 1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.