2012-01-21 22 views
6

¿Cómo puedo asignar pesos aleatoriamente desde una distribución de ley de potencia a una red con un gran número de nodos?redes con pesos distribuidos de la ley de potencia aleatoria

escribí

import networkx as nx 
import numpy as np 
from networkx.utils import powerlaw_sequence 

z=nx.utils.create_degree_sequence(200,nx.utils.powerlaw_sequence,exponent=1.9) 
nx.is_valid_degree_sequence(z) 
G=nx.configuration_model(z) 
Gcc=nx.connected_component_subgraphs(G)[0] 

edgelist=[nx.utils.powerlaw_sequence(nx.number_of_edges(Gcc),exponent=2.0)] 

sé que asignar pesos a los bordes de un diccionario de tuplas (nodo 1, el nodo 2, peso) utilizando:

nx.from_edgelist(edgelist,create_using=None) 

Pero cuando estoy solo interesado en conseguir una red ponderada donde los pesos están distribuidos por la ley del poder, ¿hay alguna otra forma más corta?

Respuesta

3

Puede asignar pesos directamente utilizando G [u] [v] [ 'peso'], por ejemplo

In [1]: import networkx as nx 

In [2]: import random 

In [3]: G = nx.path_graph(10) 

In [4]: for u,v in G.edges(): 
    ...:  G[u][v]['weight'] = random.paretovariate(2) 
    ...:  
    ...:  

In [5]: print G.edges(data=True) 
[(0, 1, {'weight': 1.6988521989583232}), (1, 2, {'weight': 1.0749963615177736}), (2, 3, {'weight': 1.1503859779558812}), (3, 4, {'weight': 1.675436575683888}), (4, 5, {'weight': 1.1948608572552846}), (5, 6, {'weight': 1.080152340891444}), (6, 7, {'weight': 1.0296667672332183}), (7, 8, {'weight': 2.0014384064255446}), (8, 9, {'weight': 2.2691612212058447})] 

Solía ​​random.paretovariate de Python() para elegir el peso pero usted puede , por supuesto, pon todo lo que quieras allí.

+0

Muchas gracias. – Aya

+0

discúlpeme ¿y si quiero que esta secuencia de ley de poder sea cualquier número excepto cero? o cualquier número en un rango específico? de modo que el valor más pequeño es 1, por ejemplo. Ni powerlaw_sequence (100, exponente = 2.0, rango (1,20)) ni powerlaw_sequence (100, exponente = 2.0, xmin = 1) funcionan. Gracias – Aya

+0

respuesta de referencia http://stackoverflow.com/questions/9016591/how-to-exclude-some-numbers-from-a-list/9016679#9016679 – Aya

1

Probé y obtuve lo siguiente .. Espero que ayude. Además, estoy buscando mejores métodos ya que esto no asegura que obtenga una red conectada. Además, aún tengo que verificar sus propiedades.

'''written by Aya Al-Zarka''' 

import networkx as nx 
import matplotlib.pyplot as plt 
from networkx.utils import powerlaw_sequence 
import random as r 
import numpy as np 

G=nx.Graph() 
v=[] 
for i in range(100): 
v.append(i) 

G.add_nodes_from(v) 

weight=[] 
for j in range(300): 
    l=powerlaw_sequence(300,exponent=2.0) 
    weight.append(r.choice(l)) 
#print(weight) 
e=[] 
for k in range(300): 
    f=[r.choice(v),r.choice(v),r.choice(weight)] 
    e.append(f) 

G.add_weighted_edges_from(e,weight='weight') 

print(nx.is_connected(G)) #not always! 


m=np.divide(weight,100.0) 
pos=nx.random_layout(G,dim=2) 
nx.draw_networkx_nodes(G,pos,nodelist=None,node_size=300,node_color='y', 
        node_shape='*', alpha=1.0, cmap=None, vmin=None, 
        vmax=None, ax=None, linewidths=None,) 
nx.draw_networkx_edges(G,pos,edgelist=None,width=m, 
edge_color='b',style='solid',alpha=None,edge_cmap=None, edge_vmin=None, 
edge_vmax=None, ax=None, arrows=False) 
plt.ylim(0,1) 
plt.xlim(0,1) 
plt.axis('off') 
plt.show() 
Cuestiones relacionadas