-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgng.py
163 lines (120 loc) · 5.69 KB
/
gng.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# -*- encoding: utf-8 -*-
from grafo import *
import operator
class gng():
def __init__(self,topologia,tam):
self.topologia = topologia
self.grafo = Grafo()
self.senal = []
nodo1=self.grafo.addNodo1(1,[random.randint(1,600),random.randint(1,600)],0)
nodo2=self.grafo.addNodo1(1,[random.randint(1,600),random.randint(1,600)],0)
print("Crear nodos iniciales: ")
print('\t',nodo1.posicion,nodo2.posicion)
self.grafo.addConexion(nodo1,nodo2)
self.edadMax=100
self.iteracion=0
self.alpha=0.05 #Factor de aumento de error en nuevos nodos
self.betha=0.0005 #Factor de decrecimiento de errores
self.maxNodos=1000
self.ew=0.1 #Movimiento de nodo principal
self.en=0.07 #Movimiento de vecinos
self.lamb=100 #Iteracion # para insertar nuevo nodo
self.tam=tam
self.ageStep=5
def start(self):
tam=self.tam
pantalla=pg.display.set_mode(tam)
#reloj=pg.time.Clock()
pg.font.init()
cerrar=False
while not cerrar:
for evento in pg.event.get():
if evento.type==pg.QUIT:
cerrar= True
#Generar la senal (un elemento random de la topologia)
signal= random.choice(self.topologia)
#Encontramos los 2 mas cercanos a la senal
nodo1,nodo2,dist=self.grafo.findCercanos(signal)
#print(signal)
#Aumentar el error del nodo mas cercano
nodo1.error+=dist
#Movemos al nodo mas cercano hacia la senal
#e=0.3 #Factor de movimiento (algo asi como la velocidad)
nodo1.mover(self.ew,signal)
nodo1.visitado=1
#Movemos a todos los vecinos hacia la senal
for vecino in nodo1.vecinos:
vecino[0].mover(self.en,signal)
vecino[1].edad+=self.ageStep
#Revisamos si los dos nodos del principio tienen conexion
arista=nodo1.tieneVecino(nodo2)
if arista: #Si la tienen se reinicia su edad
arista.edad=0
else: #Si no se crea una nueva conexion
self.grafo.addConexion(nodo1,nodo2)
#Se revisan todas las aristas para ver si hay una muy vieja
ar=self.grafo.aristas[:]
for arista in ar:
if arista.edad>=self.edadMax: #Si encontramos una borramos sus conexiones
self.grafo.deleteConexionA(arista)
ar=[]
#Agregar nodo si no se excedio el limite
if self.iteracion%self.lamb==0 and self.grafo.id<=self.maxNodos:
#Encontrar el nodo con error maximo
nodoU=self.grafo.getNodeErrorMax()
#Encontrar el nodo vecino de nodoU con el error maximo
nodoV , conexion=self.grafo.getNodeErrorMaxByNodo(nodoU)
#Encontrar la posicion media
posMedia=nodoU.posMedia(nodoV)
#Crear un nodo entre los dos
nodoR=self.grafo.addNodo1(1,posMedia,0)
#Conectar nodoR a nodoU y nodoV y borrar la conexion entre nodoU y nodoV
self.grafo.addConexion(nodoU,nodoR)
self.grafo.addConexion(nodoR,nodoV)
self.grafo.deleteConexionA(conexion)
#Modificar los errores de U, V y R
nodoU.error*=self.alpha
nodoV.error*=self.alpha
nodoR.error=nodoU.error
#Reducir los errores de todos los nodos del grafo
for nodo in self.grafo.nodos:
nodo.error-=self.betha*nodo.error
#Dibujar
pantalla.fill(pg.color.Color('black'))
for punto in self.topologia:
pg.draw.circle(pantalla,pg.color.Color('white'),punto,3)
for arista in self.grafo.aristas:
pg.draw.line(pantalla,pg.color.Color('red'),arista.nodos[0].posicion,arista.nodos[1].posicion,4)
for nodo in self.grafo.nodos:
pg.draw.circle(pantalla,pg.color.Color('blue'), map(int,nodo.posicion),3)
text_to_screen(pantalla,"nodos: "+str(self.grafo.id),[5,5])
pg.display.flip()
#print("nodos: "+str(self.grafo.id))
#Si excedio el limite GG
if len(self.grafo.nodos)==self.maxNodos:
print("Termino\n")
print("Numero de nodos",len(self.grafo.nodos))
input("Presione una tecla para cerrar")
# for nodo in self.grafo.nodos:
# print(nodo.id, [i[0].id for i in nodo.vecinos])
cerrar=True
#return
#text_to_screen(pantalla,nodo.id,nodo.posicion)
self.iteracion+=1
# reloj.tick(100)
print("Termino\n")
print("Numero de nodos",len(self.grafo.nodos))
cerrar=False
pantalla=pg.display.set_mode(tam)
while not cerrar:
for evento in pg.event.get():
if evento.type==pg.QUIT:
cerrar= True
pantalla.fill(pg.color.Color('black'))
for arista in self.grafo.aristas:
pg.draw.line(pantalla,pg.color.Color('red'),arista.nodos[0].posicion,arista.nodos[1].posicion,3)
# for nodo in self.grafo.nodos:
# pg.draw.circle(pantalla,pg.color.Color('blue'), list(map(int,nodo.posicion)),3)
pg.display.flip()
#reloj.tick(20)
#print("Cercanos:",nodo1.posicion,nodo2.posicion,dist)