2012-05-18 41 views
15

Necesito generar un subgrafo totalmente conectado con networkx, comenzando desde la lista de nodos que quiero conectar. Básicamente, quiero que todos los nodos de la lista que paso a la función estén todos conectados entre sí.Cómo generar un subgrafo completamente conectado desde la lista de nodos usando el módulo networkx de python

Me pregunto si hay alguna función incorporada para lograr esto (que no he encontrado)? ¿O debería pensar en algún algoritmo?

Muchas gracias.

Respuesta

12

no sé de cualquier método que hace esto, pero se puede imitar fácilmente el método complete_graph() de NetworkX y ligeramente cambiarlo (casi como una orden interna):

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() 
+0

Gracias, sí, debería haber buscado estas permutaciones/funciones combinaciones :) – Wilco

+1

Esto funcionó para mí cuando reemplacé 'n> 1' con' len (L)> 1' – Rasmus

+0

Hay métodos directos para hacer esto usando 'nx.complete_graph' y' nx.relabel_nodes'. Ver mi respuesta – Joel

9

hay una función para crear gráficos totalmente conectados (es decir, completos), nameley complete_graph.

import networkx as nx 
g = nx.complete_graph(10) 

Se toma un argumento entero (el número de nodos en el gráfico) y por lo tanto no se puede controlar las etiquetas de nodo. No he encontrado una función para hacer eso de forma automática, pero con itertools es bastante fácil:

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) creará tuplas de 2 elementos con todas las combinaciones de pares de nodes que luego trabajarán como los bordes en el gráfico.

Esta solución solo es válida para gráficos no dirigidos. Eche un vistazo a zubinmehta's solution para un enfoque más general.

4

Puede usar los comandos de networkx para generar directamente una camarilla con nodos enteros, y luego hay un comando simple para volver a etiquetar los nodos con cualquier otro nombre almacenable.

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. 
Cuestiones relacionadas