簡體   English   中英

查找給定圖的所有完整子圖的有效方法(Python)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM