Как сгенерировать полностью подключенный подграф из списка node с использованием модуля python networkx
Мне нужно создать полностью подключенный подграф с networkx, начиная с списка узлов, которые я хочу подключить. В принципе, я хочу, чтобы все узлы в списке передавали функции, которые должны быть связаны друг с другом.
Интересно, есть ли какая-нибудь встроенная функция для достижения этого (чего я не нашел)?
Или я должен думать о некотором алгоритме?
Большое спасибо.
Ответы
Ответ 1
Я не знаю ни одного метода, который делает это, но вы можете легко имитировать метод complete_graph() networkx и слегка изменить его (почти как встроенный):
import networkx
import itertools
def complete_graph_from_list(L, create_using=None):
G = networkx.empty_graph(len(L),create_using)
if len(L)>1:
if G.is_directed():
edges = itertools.permutations(L,2)
else:
edges = itertools.combinations(L,2)
G.add_edges_from(edges)
return G
S = complete_graph_from_list(["a", "b", "c", "d"])
print S.edges()
Ответ 2
Существует функция для создания полностью подключенных (то есть полных) графиков, nameley complete_graph
.
import networkx as nx
g = nx.complete_graph(10)
Он принимает целочисленный аргумент (количество узлов в графе), и поэтому вы не можете управлять метками node. Я не нашел функцию для этого автоматически, но с itertools
достаточно легко:
from itertools import combinations
nodes = ['A', 'B', 'C', 'D', 'E']
edges = combinations(nodes, 2)
g = nx.Graph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
combinations(nodes, 2)
создаст 2-элементные кортежи со всеми комбинациями пар nodes
, которые затем будут работать как ребра на графике.
Это решение, однако, справедливо только для неориентированных графов. Взгляните на решение zubinmehta для более общего подхода.
Ответ 3
Вы можете использовать команды networkx для непосредственного создания клики с целыми узлами, а затем есть простая команда, чтобы перемаркировать узлы с любыми другими хешируемыми именами.
import networkx as nx
L=["hello", "world", "how", "are", "you"]
G=nx.complete_graph(len(L))
nx.relabel_nodes(G,dict(enumerate(L)), copy = False) #if copy = True then it returns a copy.