在python中的派系

时间:2012-03-15 03:12:15

标签: python graph-theory networkx clique

我有这个问题,我需要帮助,这是我的代码:

      cliques=[clique for clique in nx.find_cliques(GC) if len(clique)>2]    

      for clique in cliques:
        if len (clique)==3:
        GC.remove_edge()
        print "Clique to appear: ",clique
      #draw the graph        
      nx.draw(GC)
      plt.show()

首先我在我的图表中搜索发现派系,然后我测试长度为3的集团,如果真的我想删除一个边缘那么我可以消除完整图形(3)。 我怎么能这样做?

由于

2 个答案:

答案 0 :(得分:4)

我认为这里最棘手的问题是处理共享边缘。每次删除边缘时都不想搜索派系,但是您需要记住已经删除的边缘。

查看the documentation,我们发现find_cliques函数是一个生成器。

  

此实现是列表的生成器,每个列表都包含   最大集团的成员

这是否意味着您可以生成一个派系,删除一个边缘,然后生成下一个集团,我们的生成器会知道我们已经删除了边缘?

用另一个问题回答这个问题:为什么不在每次分解集团时突破发电机?

edge_removed = True
while edge_removed:
    edge_removed = False
    for clique in nx.find_cliques(GC):
        if len (clique)>=3:
            GC.remove_edge(clique[0], clique[1])
            edge_removed = True
            break # Gotta restart the generator now...

你必须记住,你所处理的派系有可能非常耗费资源,因为即使只是在图中检测到派系也是NP完全的。

答案 1 :(得分:0)

if len(clique)==3:
    GC.remove_edge(*clique[0:2])

或(等效)

if len(clique)==3:
    GC.remove_edge(clique[0], clique[1])

但是我可能会遗漏一些重要的东西,因为这看起来很明显而且我不是专家 - 我只是阅读了networkx文档(它说一个集团是一个节点列表,remove_edge需要两个节点)。