2012-01-21 6 views
6

Güç kanunu dağıtımından ağırlıkları çok sayıda düğüm içeren bir ağa rasgele nasıl atayabilirim?ağları

Ben

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)] 

kullandığımı küpe (Node1, node2, ağırlık) bir sözlükle kenarlarına ağırlıkları atamak biliyorum yazdı:

nx.from_edgelist(edgelist,create_using=None) 

Ama almakla ben olduğumda sadece ilgi Ağırlıkların dağıtıldığı güç ağı, daha kısa bir yol var mı?

cevap

3

doğrudan G [u] kullanarak ağırlıkları atayabilirsiniz [v] [ 'ağırlık'], örneğin

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})] 

kilo seçmek için Python'un random.paretovariate() kullanılan ancak yapabilirsiniz

Tabii ki, orada ne istersen onu koy.

+0

Çok teşekkür ederim. – Aya

+0

pardon, bu güç kanunu sırasının sıfır dışında herhangi bir sayı olmasını istiyorsam ne olur? veya belirli bir aralıktaki herhangi bir sayı? Böylece en küçük değer 1'dir, örn. ne powerlaw_sequence (100, üs = 2.0, aralık (1,20)) ne de powerlaw_sequence (100, üs = 2.0, xmin = 1) çalışır. Teşekkür ederiz – Aya

+0

başvuru için yanıt http://stackoverflow.com/questions/9016591/how-to-exclude-some-numbers-from-a-list/9016679#9016679 – Aya

1

Aşağıdakileri denedim ve aldım .. Umarım yardımcı olur. Ayrıca, bağlı bir ağa sahip olduğumu garanti etmediğinden daha iyi yöntemler arıyorum. Ayrıca, özelliklerini kontrol etmek için hala var.

'''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()