我想找到中等大小的所有派系,但密集连接的图表,有369个节点和22,724个边缘。首先,我通过python接口简单地调用了igraph的Graph.cliques()
方法:
cliques = graph.cliques()
它仍在运行,并且在i7-4600U核心上消耗了超过3小时的净CPU时间。因此,我开始关注其他可能性,并且我记得几年前我已经使用过的一个很好的代码。它被称为justTheCliques,可在此处获取:https://github.com/aaronmcdaid/MaximalCliques。描述说:
在边缘列表上运行Bron-Kerbosch算法
运行此算法会在几秒钟内在同一图表上显示结果:
justTheCliques edge-list > cliques
我爱igraph,我只是想知道,这背后的根本原因是什么? Igraph使用不同的算法?结果应该是一样的吗?
答案 0 :(得分:2)
igraph似乎正在使用像apriori这样的算法来实现.cliques()
。 1-cliques是单顶点。 k-cliques是两个(k-1)-cliques的联合,它们共享除了两个顶点之外的所有顶点,它们之间具有边缘。我想这个算法在你的图上明显不如Bron - Kerbosch。如果您只需要最大派系,看起来好像.maximal_cliques()
正在使用类似B-K的算法。
答案 1 :(得分:1)
大卫是对的,如果你想要最大的派系,那么你应该使用maximal.cliques()
。我做了一个快速的比较,似乎igraph实际上比你使用的C ++库快4-5,虽然这可能取决于你的图:
library(igraph)
g <- erdos.renyi.game(369, 22724, type="gnm")
system.time(xx <- maximal.cliques(g))
# user system elapsed
# 1.432 0.012 1.448
write.graph(g, format = "edgelist", file = "graph.txt")
vagrant@logus:~/cli/MaximalCliques$ time ./justTheCliques graph.txt > cliques.txt
Network loaded after 0.15 seconds. 369 nodes and 22724 edges. Max degree is 149
processing node: 100 ...
processing node: 200 ...
processing node: 300 ...
388111 cliques found
0 #3
10367 #4
209815 #5
151633 #6
15896 #7
396 #8
4 #9
real 0m6.419s
user 0m5.324s
sys 0m1.036s