2012-01-21 17 views
6

Làm cách nào tôi có thể gán ngẫu nhiên trọng số từ phân bố pháp luật quyền lực cho mạng có số lượng nút rất lớn.mạng có trọng số phân bổ theo pháp luật quyền lực ngẫu nhiên

tôi đã viết

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

Tôi biết tôi gán trọng số các cạnh của một cuốn từ điển của các bộ (node1, node2, trọng lượng) sử dụng:

nx.from_edgelist(edgelist,create_using=None) 

Nhưng khi tôi chỉ quan tâm đến việc một mạng trọng số nơi trọng lượng được phân phối theo pháp luật, có cách nào ngắn hơn không?

Trả lời

3

Bạn có thể gán trọng lượng trực tiếp sử dụng G [u] [v] [ 'trọng lượng'], ví dụ

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

tôi đã sử dụng random.paretovariate Python() để chọn cân nhưng bạn có thể , tất nhiên, đặt bất cứ điều gì bạn muốn ở đó.

+0

Cảm ơn bạn rất nhiều. – Aya

+0

xin lỗi nếu tôi muốn chuỗi quyền lực này là bất kỳ số nào ngoại trừ số không? hoặc bất kỳ số nào trong một phạm vi cụ thể? sao cho giá trị nhỏ nhất là 1, ví dụ: Không có powerlaw_sequence (100, số mũ = 2.0, phạm vi (1,20)) cũng không phải powerlaw_sequence (100, số mũ = 2,0, xmin = 1) hoạt động. Cảm ơn bạn – Aya

+0

câu trả lời để tham khảo http://stackoverflow.com/questions/9016591/how-to-exclude-some-numbers-from-a-list/9016679#9016679 – Aya

1

Tôi đã thử và nhận những điều sau .. Tôi hy vọng điều đó sẽ hữu ích. Ngoài ra, tôi đang tìm kiếm các phương pháp tốt hơn vì điều này không đảm bảo tôi có được một mạng kết nối. Ngoài ra, tôi vẫn phải kiểm tra tính chất của nó.

'''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() 
Các vấn đề liên quan