python - 在 python 中使用 networkx 计算无向图中大小为 k 的集团的最佳方法是什么?

标签 python networkx graph-theory clique-problem

我很惊讶 networkx 似乎没有内置函数来执行此操作,但也许我缺少一些使用内置算法执行此操作的巧妙方法?

最佳答案

您可以使用以下内置函数之一:enumerate_all_cliquesfind_cliques为了得到无向图中的所有 k-clique。

这些函数之间的区别在于 enumerate_all_cliques 遍历所有 可能的派系而 find_cliques 仅遍历最大 派系。我们最终会看到它会影响运行时间。

选项 1 使用 enumerate_all_cliques:

import networkx as nx

def enumerate_all_cliques_size_k(G, k):
    i = 0
    for clique in nx.enumerate_all_cliques(G):
        if len(clique) == k:
            i += 1
        elif len(clique) > k:
            return i
    return i

选项 2 使用 find_cliques:

import networkx as nx
import itertools

def find_cliques_size_k(G, k):
    i = 0
    for clique in nx.find_cliques(G):
        if len(clique) == k:
            i += 1
        elif len(clique) > k:
            i += len(list(itertools.combinations(clique, k)))
    return i

第一个选项更直接,但它的运行时间有问题,因为我们遍历了最大团的所有可能子集,即使最大团大小小于 k。 我们可以看到 enumerate_all_cliques_size_k 在大小为 20 的完整图上运行需要 10 倍的时间:

G = nx.complete_graph(20)


@timing
def test_enumerate_all_cliques_size_k(G,k):
    print(enumerate_all_cliques_size_k(G, k))

@timing
def test_find_cliques_size_k(G, k):
    print(find_cliques_size_k(G, k))

test_enumerate_all_cliques_size_k(G,5)
test_find_cliques_size_k(G,5)

# --------------------Result-----------------------

15504
test_enumerate_all_cliques_size_k function took 616.645 ms
15504
test_find_cliques_size_k function took 56.967 ms

关于python - 在 python 中使用 networkx 计算无向图中大小为 k 的集团的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775867/

相关文章:

java - 使用 Dijkstra 检测多条最短路径

python - 从散点图拟合数据

python - python中的递归排序

python - Pandas :Groupby 并在组内使用条件进行迭代?

python - 类型错误 : only length-1 arrays can be converted to Python scalars with NUMPY

C# 计算每个给定范围的函数最小值

python - 使用 networkx 返回负循环

python-2.7 - Python-网络x : Neighbours with certain weight

python - networkx 如何处理 2 元组?

algorithm - Ford Fulkerson 算法增加流量