2012-01-21 22 views
6

如何隨機地將權重從冪律分佈分配給節點數量非常大的網絡。具有隨機冪律分佈權重的網絡

我寫

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

我知道我用的元組(節點,節點2,體重)的字典分配權重的邊緣:

nx.from_edgelist(edgelist,create_using=None) 

但當我只是感興趣的是得到一個加權網絡的權重是冪律分佈的,還有另一種更短的方法嗎?

回答

3

您可以直接分配使用G [C]權[V] [ '重量'],例如

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

我用Python的random.paretovariate()來選擇重量,但你可以當然,把你想要的東西放在那裏。

+0

非常感謝。 – Aya

+0

對不起,如果我想要這個冪律序列是除零以外的任何數字?或特定範圍內的任何數字?因此最小值爲1,例如powerlaw_sequence(100,指數= 2.0,範圍(1,20))和powerlaw_sequence(100,指數= 2.0,xmin = 1)都不起作用。謝謝 – Aya

+0

回答參考http://stackoverflow.com/questions/9016591/how-to-exclude-some-numbers-from-a-list/9016679#9016679 – Aya

1

我試過了,並得到以下..我希望它有幫助。此外,我正在尋找更好的方法,因爲這不能確保我獲得連接的網絡。另外,我還要檢查它的屬性。

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