-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContagio.py
100 lines (80 loc) · 3.23 KB
/
Contagio.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import click
import numpy as np
@click.group()
@click.option('--archivomatriz',
prompt=True,
help='Ruta del archivo donde se encuentra definida la matriz de adyacencia')
@click.pass_context
def cli(ctx,archivomatriz):
ctx.obj = archivomatriz
@cli.command(name='ejecutarAlgoritmo')
@click.option('--semillauno',
default=6,
help='Primer nodo contagiado inicialmente')
@click.option('--semillados',
default=7,
help='Segundo nodo contagiado inicialmente')
@click.option('--umbral',
default=0.4,
help='Umbral para establecer contagio')
@click.pass_context
def ejec_algoritmo(ctx,semillauno,semillados,umbral):
A = extraer_matriz(ctx.obj)
nodos_contagiados = algoritmo(A,semillauno,semillados,umbral)
def algoritmo(A,semillauno,semillados,umbral):
numero_nodos = len(A)
print('La matriz de adyacencia A es ')
print(A)
print('Los nodos contagiados inicialmente son ' + str(semillauno) + ' y ' + str(semillados))
print('El umbral de contagio es ' + str(umbral))
nodos_contagiados = np.zeros((1, numero_nodos))
nodos_contagiados[0][semillauno] = 1
nodos_contagiados[0][semillados] = 1
print('**********************************************')
print('EMPIEZA EL ALGORITMO')
iter = 1
while (True):
nuevos_nodos_contagiados = []
print('**********************************************')
print('**********************************************')
print('Iteración nº' + str(iter))
print('**********************************************')
for nodo in range(numero_nodos):
if (nodos_contagiados[0][nodo] == 1):
continue
fila = A[nodo, :]
nodos_totales_nodo = sum(fila)
nodos_contagiados_nodo = sum(np.multiply(fila, nodos_contagiados[0, :]))
umbral_nodo = nodos_contagiados_nodo / nodos_totales_nodo
if (umbral_nodo >= umbral):
nuevos_nodos_contagiados.append(nodo)
print('El nodo ' + str(nodo) + ' ha sido contagiado')
if (len(nuevos_nodos_contagiados) == 0):
print('No hay nuevos nodos contagiados en la iteración nº' + str(iter))
print('El algoritmo ha terminado...')
print('********************************************************')
break
iter = iter + 1
nodos_contagiados = actualizar_nodos_contagiados(nodos_contagiados, nuevos_nodos_contagiados)
return nodos_contagiados
def extraer_matriz(path):
file = open(path,'r')
filas = file.readlines()
num_nodos = len(filas)
matriz = np.zeros((num_nodos, num_nodos))
cont_fila = 0
for fila in filas:
elementos = fila.split()
cont_col = 0
for elem in elementos:
matriz[cont_fila][cont_col] = elem
cont_col = cont_col + 1
cont_fila = cont_fila + 1
return matriz
def actualizar_nodos_contagiados(nodos_contagiados_actuales, nuevos_nodos_contagiados):
nodos_contagiados = nodos_contagiados_actuales
for index in nuevos_nodos_contagiados:
nodos_contagiados[0][index] = 1
return nodos_contagiados
if __name__ == '__main__':
cli()