用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的,要求大規模團問題,還是隻能用其他算法求近似解。

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