【问题标题】:Efficient way for finding all the complete subgraphs of a given graph (Python)?查找给定图(Python)的所有完整子图的有效方法?
【发布时间】: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 的性能对于大图来说不是很好。

【问题讨论】:

    标签: python graph networkx


    【解决方案1】:

    好的,我找到了。简直就是list(nx.find_cliques(G)),只是因为我不知道在图论中一个团是一个全连通子图。

    编辑

    更准确地说,list(nx.find_cliques(G)) 找到了最大的派系,因此这不是我需要的。我在this link找到了类似的帖子。

    所以正确的答案是使用list(nx.enumerate_all_cliques(G))。但是,此函数还返回大小为 1 的派系,我不喜欢它,因为我的图中没有自环。因此最终的解决方案是使用以下代码行:

    [s for s in nx.enumerate_all_cliques(G) if len(s) > 1]
    

    【讨论】:

    • 为什么需要list?您应该能够直接迭代结果。
    • 我不确定你的意思。在我的例子中,图 G 的条目表示平面中矩形之间的交集(如果矩形 i,j 重叠,则 G[i,j] = 1,否则为零)。这里的团表示重叠矩形的集合(例如,大小为 3 的团表示 3 个矩形之间的交集)。基本上我需要整个列表才能知道谁与谁重叠,因为我想为每个交叉区域分配不同的颜色。如果我使用 for 循环进行迭代,事情会变得太慢,因此我试图尽可能多地矢量化我的代码。
    • 我的意思是[s for s in nx.enumerate_all_cliques(G) if len(s) > 1] 应该做同样的事情。您正在将enumerate_all_cliques 的结果具体化为一个列表,然后对其进行迭代。顺便说一句,使用 listcomp 并不是人们在提到矢量化时通常的意思。
    • 哦,现在我明白了,你是对的!我再次编辑帖子,谢谢!
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多