我正在尝试为一组项目找到最大派系。
目前我正在使用python的networkx库并使用 find_cliques()函数来查找所有最大派系,如下所示:
import newtworkx as nx
G = nx.Graph()
E = [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4], [2,6], [2,5], [5,6]]
G.add_edges_from(E)
#G.edges()
lst = list(nx.find_cliques(G))
lst
Out [] : [[2, 1, 3, 4], [2, 5, 6]]
但我实际上期待的是找到最大派系,然后删除最大集团图中的节点,然后再次找到上次删除后留下的节点中的最大集团。
对于上面的例子,我期望得到[2,1,3,4]然后删除这些节点,所以只留下5和6,这将是另一个集团[5,6]。
更新
我们可以使用 G.remove_node(),它会按预期删除节点以及所有相邻边。
G = nx.Graph()
E = [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4], [2,6], [2,5], [5,6], [3,5], [5,7]]
G.add_edges_from(E)
list1 = list(nx.find_cliques(G))
#list1 gives [[2, 3, 1, 4], [2, 3, 5], [2, 6, 5], [7, 5]]
n = nx.number_of_nodes(G)
#n
[G.remove_node(nd) for nd in list1[0]]
list2 = list(nx.find_cliques(G))
#list2 gives [[5, 6], [5, 7]]
[G.remove_node(nd) for nd in list2[0]]
list3 = list(nx.find_cliques(G))
#list3 gives [[7]]
但是每次删除节点时,都会找到新的最大派系并将其存储在新列表中,依此类推。如何在while循环中运行,直到图G中没有剩余边,即节点数为0或1。
答案 0 :(得分:1)
您可以使用G.remove_node
从图表中删除节点(以及相关边缘)。
如何删除第一个集团的所有节点:
lst = list(nx.find_cliques(G))
[G.remove_node(nd) for nd in lst[0]]
要重复删除第一个集团的节点,直到没有派系:
lst = list(nx.find_cliques(G))
while len(lst) > 0:
[G.remove_node(nd) for nd in lst[0]]
lst = list(nx.find_cliques(G))
请注意,这与在每个步骤中删除任何最大集团中的所有节点不同,这将是:< / p>
最后,如果您想要删除派系的某个顺序(例如,首先是最大派系),您可以通过相应地排序 编辑:为了完整起见,这里是如何在删除之前存储派系(根据您的评论@Ankie): 作为补充说明,应该指出这些操作基本上是“破坏”图lst = list(nx.find_cliques(G))
while len(lst) > 0:
# This flattens the list of cliques into one list. `set` reduces to unique values.
flattened = set([nd for cl in lst for nd in cl])
[G.remove_node(nd) for nd in flattened]
lst = list(nx.find_cliques(G))
lst
来执行此操作:lst = list(nx.find_cliques(G))
while len(lst) > 0:
lst.sort(key=len, reverse=True) # Sort maximum clique to the front
[G.remove_node(nd) for nd in lst[0]]
lst = list(nx.find_cliques(G))
out = []
lst = list(nx.find_cliques(G))
while len(lst) > 0:
out.append(lst[0])
[G.remove_node(nd) for nd in lst[0]]
lst = list(nx.find_cliques(G))
G
。如果以后需要再次使用图形并且需要很长时间来构建,那么处理图形的副本以便保留原始图形是有意义的。副本可以这样制作:G2 = G.copy()