gpt4 book ai didi

python - 如何使用 networkx + python 枚举图形中的所有 *maximal* cliques?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:14 25 4
gpt4 key购买 nike

如果你看https://en.wikipedia.org/wiki/Clique_problem ,您会注意到派系和最大派系之间存在区别。一个最大的团只包含在它自己之外的任何其他团中。所以我想要那些集团,但 networkx 似乎只提供:

networkx.algorithms.clique.enumerate_all_cliques(G)

所以我尝试了一个简单的for循环过滤机制(见下文)。

def filter_cliques(self, cliques):
# TODO: why do we need this? Post in forum...
res = []
for C in cliques:
C = set(C)
for D in res:
if C.issuperset(D) and len(C) != len(D):
res.remove(D)
res.append(C)
break
elif D.issuperset(C):
break
else:
res.append(C)
res1 = []
for C in res:
for D in res1:
if C.issuperset(D) and len(C) != len(D):
res1.remove(D)
res1.append(C)
elif D.issuperset(C):
break
else:
res1.append(C)
return res1

我想过滤掉所有合适的子集团。但正如你所看到的那样,它很糟糕,因为我不得不过滤它两次。这不是很优雅。因此,问题是,给定对象列表(整数、字符串)的列表,它们是图中的节点标签; enumerate_all_cliques(G) 准确返回此标签列表列表。现在,给定这个列表列表,过滤掉所有适当的子集团。例如:

[[a, b, c], [a, b], [b, c, d]] => [[a, b, c], [b, c, d]]

最快的 pythonic 方法是什么?

最佳答案

有一个函数:networkx.algorithms.clique.find_cliques ,是的,它确实只返回最大派系,尽管名称中没有“最大”。它的运行速度应该比任何过滤方法都快得多。

如果你觉得这个名字令人困惑(我也是),你可以重命名它:

from networkx.algorithms.clique import find_cliques as maximal_cliques

关于python - 如何使用 networkx + python 枚举图形中的所有 *maximal* cliques?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54682789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com