2012-01-21 12 views
6

Jak mogę losowo przydzielić wagi z dystrybucji energii do sieci o bardzo dużej liczbie węzłów.sieci z losowymi obciążeniami rozproszonymi mocy

pisałem

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

wiem przypisywać wagi do krawędzi przez słownikiem krotek (node1 Node2, waga) z zastosowaniem:

nx.from_edgelist(edgelist,create_using=None) 

Ale kiedy jestem tylko zainteresowany w uzyskaniu ważona sieć, w której wagi są dystrybuowane przez prawo, czy istnieje jeszcze krótsza droga?

Odpowiedz

3

Można przypisać wagi bezpośrednio za pomocą G [U] [v] [ 'ciężar'], na przykład

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

użyłem random.paretovariate Pythona(), aby wybrać wagę, ale można , oczywiście, tam, gdzie chcesz.

+0

Dziękuję bardzo. – Aya

+0

Przepraszam, jeśli chcę, aby ta sekwencja prawa zasilania była dowolną liczbą oprócz zera? lub dowolną liczbę w określonym zakresie? tak, że najmniejsza wartość to 1, np. Nie działa ani powerlaw_sequence (100, wykładnik = 2,0, zakres (1,20)), ani powerlaw_sequence (100, wykładnik = 2,0, xmin = 1). Dziękuję – Aya

+0

odpowiedź na odniesienie http://stackoverflow.com/questions/9016591/how-to-exclude-some-numbers-from-a-list/9016679#9016679 – Aya

1

Próbowałem i otrzymałem następujące informacje. Mam nadzieję, że to pomaga. Ponadto szukam lepszych metod, ponieważ to nie gwarantuje, że otrzymam podłączoną sieć. Ponadto nadal muszę sprawdzić jego właściwości.

'''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() 
Powiązane problemy