2012-01-21 8 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)] 

나는 내가 사용 튜플 (노드 1, 노드 2, 무게)의 사전으로 가장자리에 가중치를 할당 알고 썼다 :

nx.from_edgelist(edgelist,create_using=None) 

을하지만를 점점 내가 때 단지 관심 가중치가 가중치가있는 가중치가있는 네트워크가 더 짧은 방법이 있습니까?

답변

3

직접 G [U]를 사용하여 가중치를 할당 할 수 있습니다 [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})] 

나는 무게를 선택하는 파이썬의 random.paretovariate()를 사용하지만, 당신이 할 수있는

, 물론, 거기에 원하는 것을 넣으십시오.

+0

대단히 감사합니다. – Aya

+0

이 법칙 시퀀스를 0을 제외한 숫자로 바꾸려면 어떻게해야하나요? 또는 특정 범위의 숫자? 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()