# reprodução do gráfico da página 89 do livro do Barabasi
# by Ana Carolina Medeiros Brito

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

g = None
N = 100
iters = 100 # M
X = []
Y = []
Y_err = []

for p in np.linspace(0.0001, 0.1, 100): # valores maiores de p não são interessantes pois a rede gerada já possui apenas um componente
  # print('probabilidade de conexão entre vértices %.2f' % p)
 
  k = p*(N-1)
  # print('grau médio estimado %.2f' % k)
 
  N_g_configs = []
  k_configs = []
  for _ in range(iters):
#    g = nx.erdos_renyi_graph(N, p)
    g = nx.watts_strogatz_graph(N, 2, p, seed=None)
    
    k = np.mean(list(dict(g.degree()).values())) # grau médio da rede gerada
    k_configs.append(k)

    giant = sorted(nx.connected_components(g), key=len, reverse=True)[0]
    N_g = len(giant) # tamanho do maior componente
    N_g_configs.append(N_g)

  N_g_configs_normed = np.asarray(N_g_configs)/N
 
  X.append(np.mean(k_configs))
  Y.append(np.mean(N_g_configs_normed))
  Y_err.append(np.std(N_g_configs_normed))

plt.figure(figsize=(16,9))
plt.errorbar(X,Y,yerr=Y_err)
plt.axvline(1, c='red')
plt.axvline(np.log(N), c='red')
plt.xlabel('<k>', size=14)
plt.ylabel(r'$N_g$/N', size=14)
plt.show()

Modifié le: jeudi 19 novembre 2020, 08:27