loiador

Propagação em rede

Jan 15th, 2022
661
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. '''
  2. Propagacao de rumor - tipos de pessoas:
  3. tipo 0: nao conhece o rumor, mas pode saber se tiver contato com pessoas
  4. do tipo 1 ou do tipo 2, noa influencia outras pessoas
  5. tipo 1: conhece o rumor, acredita nela e influencia os outros a acreditar, nao
  6. pode mudar de tipo
  7. tipo 2: conhece o rumor, nao acredita nela e influencia os outros a nao
  8. acreditar, nao pode mudar de tipo
  9. '''
  10.  
  11. import random
  12. import igraph
  13. import matplotlib.pyplot as plt
  14.  
  15. # parametros da simulacao
  16. num_vertices = 5000
  17. tmax = 2000
  18.  
  19. # estruturas auxiliares
  20. tipo = []
  21. quant_tipo0 = []
  22. quant_tipo1 = []
  23. quant_tipo2 = []
  24. tempo = []
  25.  
  26. ''' calcula o novo estado do vertice v de forma aleatoria
  27. proporcional aos estados dos seus vizinhos, so e chamada para
  28. um vertice se ele for do tipo 0'''
  29. def muda_estado(rede, v):
  30.     n0 = calcula_n0(rede, v)
  31.     n1 = calcula_n1(rede, v)
  32.     n2 = calcula_n2(rede, v)
  33.     total = n0 + n1 + n2
  34.     if total == 0:
  35.         return 0
  36.     x = random.randint(1, total)
  37.     if x <= n0:
  38.         return 0
  39.     else:
  40.         if x > n0 + n1:
  41.             return 2
  42.         else:
  43.             return 1
  44.  
  45. ''' calcula o numero de vizinhos do tipo 0 de um vertice v '''
  46. def calcula_n0(rede, v):
  47.     n0 = 0
  48.     vizinhos = rede.neighbors(v) # vizinhos de v
  49.     for x in vizinhos:
  50.         if tipo[x] == 0: # todos sao contabilizados independentemente do grau
  51.             n0 += 1
  52.     return n0
  53.  
  54. ''' calcula o numero de vizinhos influentes do tipo 1 de um vertice v
  55. tomando o grau deles como base '''
  56. def calcula_n1(rede, v):
  57.     n1 = 0
  58.     maior = float(rede.maxdegree()) # maior grau do grafo
  59.     vizinhos = rede.neighbors(v) # vizinhos de v
  60.     for x in vizinhos:
  61.         grau = float(rede.degree(x))
  62.         a = random.random()
  63.         if a < grau/maior and tipo[x] == 1:
  64.             n1 += 1
  65.     return n1
  66.  
  67. ''' calcula o numero de vizinhos influentes do tipos 2 de u vertice v
  68. tomando o grau deles como base '''
  69. def calcula_n2(rede, v):
  70.     n2 = 0
  71.     maior = float(rede.maxdegree()) # maior grau do grafo
  72.     vizinhos = rede.neighbors(v) # vizinhos de v
  73.     for x in vizinhos:
  74.         grau = float(rede.degree(x))
  75.         a = random.random()
  76.         if a < grau/maior and tipo[x] == 2:
  77.             n2 += 1
  78.     return n2
  79.  
  80. # inicializa todos no tipo 0
  81. for i in range(num_vertices):
  82.     tipo.append(0)
  83.  
  84. # cria o grafo, escolher aqui a topologia
  85. # rede regular
  86. #rede = igraph.Graph.K_Regular(num_vertices, 4)
  87.    
  88. # rede aleatoria
  89. #rede = igraph.Graph.Erdos_Renyi(num_vertices, m = 2*num_vertices)
  90.  
  91. # rede livre de escala
  92. rede = igraph.Graph.Barabasi(num_vertices)
  93.  
  94. # salva uma imagem do grafo
  95. # igraph.plot(rede, bbox = (900, 900), vertex_size = 5).save('grafo.png')
  96.  
  97. print("Inicializando o grafo...");
  98.  
  99. # valores iniciais
  100. # quantidades 100 = 1% 200 = 0,5%
  101. t1 = random.randint(1, num_vertices/100)
  102. t2 = random.randint(1, num_vertices/100)
  103. t0 = num_vertices - t1 - t2
  104. # tipos
  105. i = 0
  106. while i < t1:
  107.     a = random.randint(0, num_vertices - 1)
  108.     while tipo[a] != 0:
  109.         a = random.randint(0, num_vertices - 1)
  110.     tipo[a] = 1
  111.     i += 1
  112. i = 0
  113. while i < t2:
  114.     a = random.randint(0, num_vertices - 1)
  115.     while tipo[a] != 0:
  116.         a = random.randint(0, num_vertices - 1)
  117.     tipo[a] = 2
  118.     i += 1
  119.  
  120. quant_tipo0.append(t0)
  121. quant_tipo1.append(t1)
  122. quant_tipo2.append(t2)
  123. tempo.append(0)
  124.  
  125. print("Executando a simulacao...");
  126.  
  127. # simulacao
  128. i = 1
  129. while i <= tmax:
  130.     q0 = 0
  131.     q1 = 0
  132.     q2 = 0
  133.     j = 0
  134.     for j in range(num_vertices):
  135.         if tipo[j] == 0 and rede.degree(j) > 0:
  136.             tipo[j] = muda_estado(rede, j)
  137.     for x in tipo:
  138.         if x == 0:
  139.             q0 += 1
  140.         if x == 1:
  141.             q1 += 1
  142.         if x == 2:
  143.             q2 += 1
  144.     tempo.append(i)
  145.     quant_tipo0.append(q0)
  146.     quant_tipo1.append(q1)
  147.     quant_tipo2.append(q2)
  148.     i += 1
  149.  
  150. print("Simulacao finalizada!")
  151.  
  152. # grafico
  153.  
  154. plt.plot(tempo, quant_tipo0, 'g', label = "nao conhece")
  155. plt.plot(tempo, quant_tipo1, 'r', label = "acredita")
  156. plt.plot(tempo, quant_tipo2, 'b', label = "nao acredita")
  157. plt.title("Tipos de Pessoas")
  158. plt.xlabel("Tempo")
  159. plt.ylabel("Quantidade")
  160. plt.legend()
  161. plt.grid()
  162. plt.savefig("grafico.png", dpi = 300)
  163. plt.show()
  164.  
RAW Paste Data