用networkx求图的所有团

\quadpython的networkx库提供了networkx.find_cliques(G)network.find_cliques_recursive(G)两种方法来求解图的团问题。简单的调用如下:

import networkx as nx

G = nx.Graph()
edges = [(1, 2), (2, 3), (1, 3), (3, 4), (3, 'a')]
G.add_edges_from(edges)
res = nx.find_cliques(G)
for item in res:
    print(item)

\quad结果如下:
在这里插入图片描述
\quad举个大一些的例子来说明

import networkx as nx

G = nx.Graph()
edges = [('中富证券', '健桥证券'), ('中富证券', '恒信证券'), ('富国基金', '嘉实基金'), ('富国基金', '天元证券'),
         ('富国基金', '深圳国际信托'), ('富国基金', '博时基金'), ('富国基金', '金信信托'), ('富国基金', '融通基金'),
         ('南方基金', '华安基金'), ('南方基金', '易方达基金'), ('南方基金', '天元证券'), ('南方基金', '融通基金'),
         ('南方基金', '富国基金'), ('南方基金', '国联基金'), ('南方基金', '海富通基金'), ('东方证券', '融通基金'),
         ('海通证券', '博时基金'), ('国泰君安证券', '北京富而立投资'), ('国泰君安证券', '振泰实业'), ('宝盈基金', '易方达基金'),
         ('宝盈基金', '南方基金'), ('宝盈基金', '大成基金'), ('宝盈基金', '银河基金'), ('宝盈基金', '长城基金'),
         ('宝盈基金', '鹏华基金'), ('北京富而立投资', '振泰实业'), ('西部证券', '海富通基金'), ('西部证券', '博时基金'),
         ('华夏基金', '嘉实基金'), ('华夏基金', '长城基金'), ('华夏基金', '博时基金'), ('华夏基金', '上海证券'),
         ('华夏基金', '鹏华基金'), ('华夏基金', '银华基金'), ('华夏基金', '长盛基金'), ('华夏基金', '天元证券'),
         ('华夏基金', '南方基金'), ('华夏基金', '富国基金'), ('华夏基金', '大成基金'), ('华夏基金', '安信基金'),
         ('华夏基金', '国泰基金'), ('华夏基金', '华安基金'), ('华夏基金', '易方达基金'), ('华夏基金', '兴业证券')]
G.add_edges_from(edges)
res = nx.find_cliques(G)
for item in res:
    print(item)

在这里插入图片描述
\quad如果要按照从大到小将各个团体排序后输出,程序如下:

import networkx as nx

G = nx.Graph()
edges = [('中富证券', '健桥证券'), ('中富证券', '恒信证券'), ('富国基金', '嘉实基金'), ('富国基金', '天元证券'),
         ('富国基金', '深圳国际信托'), ('富国基金', '博时基金'), ('富国基金', '金信信托'), ('富国基金', '融通基金'),
         ('南方基金', '华安基金'), ('南方基金', '易方达基金'), ('南方基金', '天元证券'), ('南方基金', '融通基金'),
         ('南方基金', '富国基金'), ('南方基金', '国联基金'), ('南方基金', '海富通基金'), ('东方证券', '融通基金'),
         ('海通证券', '博时基金'), ('国泰君安证券', '北京富而立投资'), ('国泰君安证券', '振泰实业'), ('宝盈基金', '易方达基金'),
         ('宝盈基金', '南方基金'), ('宝盈基金', '大成基金'), ('宝盈基金', '银河基金'), ('宝盈基金', '长城基金'),
         ('宝盈基金', '鹏华基金'), ('北京富而立投资', '振泰实业'), ('西部证券', '海富通基金'), ('西部证券', '博时基金'),
         ('华夏基金', '嘉实基金'), ('华夏基金', '长城基金'), ('华夏基金', '博时基金'), ('华夏基金', '上海证券'),
         ('华夏基金', '鹏华基金'), ('华夏基金', '银华基金'), ('华夏基金', '长盛基金'), ('华夏基金', '天元证券'),
         ('华夏基金', '南方基金'), ('华夏基金', '富国基金'), ('华夏基金', '大成基金'), ('华夏基金', '安信基金'),
         ('华夏基金', '国泰基金'), ('华夏基金', '华安基金'), ('华夏基金', '易方达基金'), ('华夏基金', '兴业证券')]
G.add_edges_from(edges)
res = nx.find_cliques(G)
cliques = [item for item in res]
cliques = sorted(cliques, key=lambda item: -len(item))
for item in cliques:
    print(item)

在这里插入图片描述
\quad需注意,networkx里面提供的找团接口只能求解小规模的图,毕竟求图的团问题是NPC的,要求大规模团问题,还是只能用其他算法求近似解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章