4

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

      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)。我怎样才能做到这一点?

谢谢

4

2 回答 2

4

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

查看文档,我们发现该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...

您必须记住,您对 cliques 所做的任何事情都可能非常耗费资源,因为即使只是简单地检测图中的 clique 也是 NP 完全的。

于 2012-03-15T04:11:32.680 回答
0
if len(clique)==3:
    GC.remove_edge(*clique[0:2])

或同等学历)

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

但我可能遗漏了一些重要的东西,因为这似乎很明显而且我不是专家——我只是阅读了 networkx 文档(其中说一个 clique 是一个节点列表,并且remove_edge需要两个节点)。

于 2012-03-15T03:20:45.423 回答