JairoDanielMT commited on
Commit
d2423cc
1 Parent(s): f1afdd1

implementación del fitness y probabilidad de cruce

Browse files
Files changed (4) hide show
  1. pages/AG_2D.py +64 -17
  2. pages/AG_3D.py +49 -50
  3. pages/test.py +50 -7
  4. requirements.txt +1 -1
pages/AG_2D.py CHANGED
@@ -127,22 +127,27 @@ def visualizar_camino(camino, coordenadas, mejor_distancia):
127
  def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
128
  fig_camino = go.Figure()
129
 
130
- # Añadir el camino como un trazado 2D interactivo
131
- x = [coordenadas[i][0] for i in camino]
132
- y = [coordenadas[i][1] for i in camino]
133
 
134
- # Añadir el camino como un trazado 2D interactivo con identificadores
135
  fig_camino.add_trace(
136
- go.Scatter(x=x, y=y, mode="lines+markers", marker=dict(size=5), name="Camino")
 
 
 
 
 
137
  )
138
 
139
  # Añadir los puntos de inicio y fin con etiquetas
140
  fig_camino.add_trace(
141
  go.Scatter(
142
- x=[x[0]],
143
- y=[y[0]],
144
  mode="markers+text",
145
- marker=dict(color="green", size=10),
146
  name="Inicio",
147
  text=[str(camino[0])],
148
  textposition="top center",
@@ -151,10 +156,10 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
151
 
152
  fig_camino.add_trace(
153
  go.Scatter(
154
- x=[x[-1]],
155
- y=[y[-1]],
156
  mode="markers+text",
157
- marker=dict(color="red", size=10),
158
  name="Fin",
159
  text=[str(camino[-1])],
160
  textposition="top center",
@@ -162,15 +167,16 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
162
  )
163
 
164
  # Añadir etiquetas a los puntos intermedios
165
- for i, (xi, yi) in enumerate(zip(x[1:-1], y[1:-1])):
166
  fig_camino.add_trace(
167
  go.Scatter(
168
  x=[xi],
169
  y=[yi],
170
  mode="markers+text",
171
- marker=dict(size=5),
172
  text=[str(camino[i + 1])],
173
  textposition="top center",
 
174
  )
175
  )
176
 
@@ -183,6 +189,15 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
183
  st.plotly_chart(fig_camino)
184
 
185
 
 
 
 
 
 
 
 
 
 
186
  def algoritmo_genetico(
187
  num_generaciones,
188
  num_ciudades,
@@ -190,11 +205,14 @@ def algoritmo_genetico(
190
  probabilidad_mutacion,
191
  distancias,
192
  coordenadas,
 
193
  ):
194
  poblacion = generar_poblacion(num_individuos, num_ciudades)
195
  mejor_solucion_historial = []
196
  mejor_distancia_historial = []
197
- for generacion in range(num_generaciones):
 
 
198
  poblacion = sorted(
199
  poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
200
  )
@@ -206,24 +224,47 @@ def algoritmo_genetico(
206
  nueva_poblacion = []
207
  for i in range(0, len(seleccionados), 2):
208
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
209
- hijo1 = cruzar(padre1, padre2)
210
- hijo2 = cruzar(padre2, padre1)
 
 
 
 
211
  hijo1 = mutar(hijo1, probabilidad_mutacion)
212
  hijo2 = mutar(hijo2, probabilidad_mutacion)
213
  nueva_poblacion.extend([hijo1, hijo2])
214
  poblacion = nueva_poblacion
 
 
 
215
  mejor_solucion = poblacion[0]
216
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
217
  # Visualizar el proceso del algoritmo
218
  visualizar_proceso_streamlit(
219
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
220
  )
 
 
221
  # Visualizar el mejor camino encontrado
222
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
223
 
224
  return mejor_solucion, mejor_distancia
225
 
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  def visualizar_proceso_streamlit(
228
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
229
  ):
@@ -242,6 +283,7 @@ def visualizar_proceso_streamlit(
242
  st.plotly_chart(fig_distancia)
243
 
244
 
 
245
  if __name__ == "__main__":
246
  st.title("Algoritmo Genético para el Problema del Viajante")
247
  st.sidebar.header("Configuración")
@@ -288,8 +330,12 @@ if __name__ == "__main__":
288
  "Tamaño de la Población ($par$)", min_value=10, max_value=500, value=50, step=2
289
  )
290
  probabilidad_mutacion = st.sidebar.slider(
291
- "Probabilidad de Mutación", min_value=0.01, max_value=0.5, value=0.1
 
 
 
292
  )
 
293
 
294
  # Ejecutar el algoritmo genético
295
  mejor_solucion, mejor_distancia = algoritmo_genetico(
@@ -299,6 +345,7 @@ if __name__ == "__main__":
299
  probabilidad_mutacion,
300
  distancias,
301
  coordenadas,
 
302
  )
303
 
304
  # Mostrar resultados
 
127
  def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
128
  fig_camino = go.Figure()
129
 
130
+ # Ordenar las coordenadas de acuerdo con el camino
131
+ ordenado_x = [coordenadas[i][0] for i in camino]
132
+ ordenado_y = [coordenadas[i][1] for i in camino]
133
 
134
+ # Añadir el camino como un trazado 2D interactivo sin markers
135
  fig_camino.add_trace(
136
+ go.Scatter(
137
+ x=ordenado_x,
138
+ y=ordenado_y,
139
+ mode="lines",
140
+ name="Camino",
141
+ )
142
  )
143
 
144
  # Añadir los puntos de inicio y fin con etiquetas
145
  fig_camino.add_trace(
146
  go.Scatter(
147
+ x=[ordenado_x[0]],
148
+ y=[ordenado_y[0]],
149
  mode="markers+text",
150
+ marker=dict(color="green", size=15),
151
  name="Inicio",
152
  text=[str(camino[0])],
153
  textposition="top center",
 
156
 
157
  fig_camino.add_trace(
158
  go.Scatter(
159
+ x=[ordenado_x[-1]],
160
+ y=[ordenado_y[-1]],
161
  mode="markers+text",
162
+ marker=dict(color="red", size=15),
163
  name="Fin",
164
  text=[str(camino[-1])],
165
  textposition="top center",
 
167
  )
168
 
169
  # Añadir etiquetas a los puntos intermedios
170
+ for i, (xi, yi) in enumerate(zip(ordenado_x[1:-1], ordenado_y[1:-1])):
171
  fig_camino.add_trace(
172
  go.Scatter(
173
  x=[xi],
174
  y=[yi],
175
  mode="markers+text",
176
+ marker=dict(size=3),
177
  text=[str(camino[i + 1])],
178
  textposition="top center",
179
+ showlegend=False,
180
  )
181
  )
182
 
 
189
  st.plotly_chart(fig_camino)
190
 
191
 
192
+ # funcion para fitness
193
+ def fitness(distancia, maxima_distancia, tamCromosoma):
194
+ return (
195
+ 0
196
+ if distancia * tamCromosoma == 0
197
+ else 1 - ((distancia) / (maxima_distancia * tamCromosoma))
198
+ )
199
+
200
+
201
  def algoritmo_genetico(
202
  num_generaciones,
203
  num_ciudades,
 
205
  probabilidad_mutacion,
206
  distancias,
207
  coordenadas,
208
+ probabilidad_cruce,
209
  ):
210
  poblacion = generar_poblacion(num_individuos, num_ciudades)
211
  mejor_solucion_historial = []
212
  mejor_distancia_historial = []
213
+ peor = 0
214
+ fitness_historial = []
215
+ for _ in range(num_generaciones):
216
  poblacion = sorted(
217
  poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
218
  )
 
224
  nueva_poblacion = []
225
  for i in range(0, len(seleccionados), 2):
226
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
227
+ aleatorio_cruce = random.uniform(0, 1)
228
+ if aleatorio_cruce < probabilidad_cruce:
229
+ hijo1 = cruzar(padre1, padre2)
230
+ hijo2 = cruzar(padre2, padre1)
231
+ else:
232
+ hijo1, hijo2 = padre1, padre2
233
  hijo1 = mutar(hijo1, probabilidad_mutacion)
234
  hijo2 = mutar(hijo2, probabilidad_mutacion)
235
  nueva_poblacion.extend([hijo1, hijo2])
236
  poblacion = nueva_poblacion
237
+ if peor < mejor_distancia:
238
+ peor = mejor_distancia
239
+ fitness_historial.append(fitness(mejor_distancia, peor, len(padre1)))
240
  mejor_solucion = poblacion[0]
241
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
242
  # Visualizar el proceso del algoritmo
243
  visualizar_proceso_streamlit(
244
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
245
  )
246
+ # Visualizar el fitness
247
+ visualizar_fitness_streamlit(fitness_historial)
248
  # Visualizar el mejor camino encontrado
249
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
250
 
251
  return mejor_solucion, mejor_distancia
252
 
253
 
254
+ def visualizar_fitness_streamlit(fitness_historial):
255
+ generaciones = list(range(len(fitness_historial)))
256
+ fig_fitness = go.Figure()
257
+ fig_fitness.add_trace(
258
+ go.Scatter(x=generaciones, y=fitness_historial, mode="lines+markers")
259
+ )
260
+ fig_fitness.update_layout(
261
+ title="Evolución del fitness en Cada Generación",
262
+ xaxis_title="Generación",
263
+ yaxis_title="Fitness",
264
+ )
265
+ st.plotly_chart(fig_fitness)
266
+
267
+
268
  def visualizar_proceso_streamlit(
269
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
270
  ):
 
283
  st.plotly_chart(fig_distancia)
284
 
285
 
286
+ #####################
287
  if __name__ == "__main__":
288
  st.title("Algoritmo Genético para el Problema del Viajante")
289
  st.sidebar.header("Configuración")
 
330
  "Tamaño de la Población ($par$)", min_value=10, max_value=500, value=50, step=2
331
  )
332
  probabilidad_mutacion = st.sidebar.slider(
333
+ "Probabilidad de Mutación", min_value=0.01, max_value=0.5, value=0.1, step=0.01
334
+ )
335
+ probabilidad_cruce = st.sidebar.slider(
336
+ "Probabilidad de cruce", min_value=0.90, max_value=1.0, value=0.95, step=0.01
337
  )
338
+ distancias_generadas, coordenadas_generadas = generar_distancias(num_ciudades)
339
 
340
  # Ejecutar el algoritmo genético
341
  mejor_solucion, mejor_distancia = algoritmo_genetico(
 
345
  probabilidad_mutacion,
346
  distancias,
347
  coordenadas,
348
+ probabilidad_cruce,
349
  )
350
 
351
  # Mostrar resultados
pages/AG_3D.py CHANGED
@@ -19,7 +19,6 @@ def generar_poblacion(num_individuos, num_ciudades):
19
  return poblacion
20
 
21
 
22
- # Función para evaluar la aptitud de un individuo (distancia total del recorrido)
23
  # Función para evaluar la aptitud de un individuo (distancia total del recorrido)
24
  def calcular_aptitud(individuo, distancias, coordenadas):
25
  distancia_total = 0
@@ -88,50 +87,6 @@ def generar_distancias(num_ciudades):
88
  return distancias
89
 
90
 
91
- def visualizar_camino(camino, coordenadas, mejor_distancia):
92
- fig = go.Figure()
93
-
94
- # Añadir el camino como un trazado 3D interactivo
95
- x = [coordenadas[i][0] for i in camino]
96
- y = [coordenadas[i][1] for i in camino]
97
- z = [coordenadas[i][2] for i in camino]
98
-
99
- fig.add_trace(go.Scatter3d(x=x, y=y, z=z, mode="lines+markers", name="Camino"))
100
-
101
- # Añadir el punto de inicio
102
- fig.add_trace(
103
- go.Scatter3d(
104
- x=[x[0]],
105
- y=[y[0]],
106
- z=[z[0]],
107
- mode="markers",
108
- marker=dict(color="green", size=10),
109
- name="Inicio",
110
- )
111
- )
112
-
113
- # Añadir el punto de fin
114
- fig.add_trace(
115
- go.Scatter3d(
116
- x=[x[-1]],
117
- y=[y[-1]],
118
- z=[z[-1]],
119
- mode="markers",
120
- marker=dict(color="red", size=10),
121
- name="Fin",
122
- )
123
- )
124
-
125
- # Configuraciones adicionales
126
- fig.update_layout(
127
- scene=dict(aspectmode="cube"),
128
- title=f"Mejor Camino Encontrado\nDistancia: {mejor_distancia:.2f}",
129
- )
130
-
131
- # Mostrar el gráfico interactivo en Streamlit
132
- st.plotly_chart(fig)
133
-
134
-
135
  def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
136
  fig_camino = go.Figure()
137
 
@@ -185,6 +140,7 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
185
  marker=dict(size=5),
186
  text=[str(camino[i + 1])],
187
  textposition="top center",
 
188
  )
189
  )
190
 
@@ -198,7 +154,12 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
198
  st.plotly_chart(fig_camino)
199
 
200
 
201
- # ...
 
 
 
 
 
202
 
203
 
204
  def algoritmo_genetico(
@@ -208,10 +169,13 @@ def algoritmo_genetico(
208
  probabilidad_mutacion,
209
  distancias,
210
  coordenadas,
 
211
  ):
212
  poblacion = generar_poblacion(num_individuos, num_ciudades)
213
  mejor_solucion_historial = []
214
  mejor_distancia_historial = []
 
 
215
  for generacion in range(num_generaciones):
216
  poblacion = sorted(
217
  poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
@@ -224,24 +188,55 @@ def algoritmo_genetico(
224
  nueva_poblacion = []
225
  for i in range(0, len(seleccionados), 2):
226
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
227
- hijo1 = cruzar(padre1, padre2)
228
- hijo2 = cruzar(padre2, padre1)
 
 
 
 
229
  hijo1 = mutar(hijo1, probabilidad_mutacion)
230
  hijo2 = mutar(hijo2, probabilidad_mutacion)
231
  nueva_poblacion.extend([hijo1, hijo2])
232
  poblacion = nueva_poblacion
 
 
 
 
 
 
 
 
 
233
  mejor_solucion = poblacion[0]
234
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
235
  # Visualizar el proceso del algoritmo
236
  visualizar_proceso_streamlit(
237
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
238
  )
 
 
239
  # Visualizar el mejor camino encontrado
240
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
241
 
242
  return mejor_solucion, mejor_distancia
243
 
244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  def visualizar_proceso_streamlit(
246
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
247
  ):
@@ -330,7 +325,10 @@ if __name__ == "__main__":
330
  "Tamaño de la Población ($par$)", min_value=10, max_value=100, value=50, step=2
331
  )
332
  probabilidad_mutacion = st.sidebar.slider(
333
- "Probabilidad de Mutación", min_value=0.001, max_value=0.5, value=0.01
 
 
 
334
  )
335
 
336
  # Ejecutar el algoritmo genético
@@ -340,7 +338,8 @@ if __name__ == "__main__":
340
  num_individuos,
341
  probabilidad_mutacion,
342
  distancias,
343
- coordenadas, # Se añade este argumento
 
344
  )
345
 
346
  # Mostrar resultados
 
19
  return poblacion
20
 
21
 
 
22
  # Función para evaluar la aptitud de un individuo (distancia total del recorrido)
23
  def calcular_aptitud(individuo, distancias, coordenadas):
24
  distancia_total = 0
 
87
  return distancias
88
 
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
91
  fig_camino = go.Figure()
92
 
 
140
  marker=dict(size=5),
141
  text=[str(camino[i + 1])],
142
  textposition="top center",
143
+ showlegend=False,
144
  )
145
  )
146
 
 
154
  st.plotly_chart(fig_camino)
155
 
156
 
157
+ def fitness(distancia, maxima_distancia, tamCromosoma):
158
+ return (
159
+ 0
160
+ if distancia * tamCromosoma == 0
161
+ else 1 - ((distancia) / (maxima_distancia * tamCromosoma))
162
+ )
163
 
164
 
165
  def algoritmo_genetico(
 
169
  probabilidad_mutacion,
170
  distancias,
171
  coordenadas,
172
+ probabilidad_cruce,
173
  ):
174
  poblacion = generar_poblacion(num_individuos, num_ciudades)
175
  mejor_solucion_historial = []
176
  mejor_distancia_historial = []
177
+ peor = 0
178
+ fitness_historial = []
179
  for generacion in range(num_generaciones):
180
  poblacion = sorted(
181
  poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
 
188
  nueva_poblacion = []
189
  for i in range(0, len(seleccionados), 2):
190
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
191
+ aleatorio_cruce = random.uniform(0, 1)
192
+ if aleatorio_cruce < probabilidad_cruce:
193
+ hijo1 = cruzar(padre1, padre2)
194
+ hijo2 = cruzar(padre2, padre1)
195
+ else:
196
+ hijo1, hijo2 = padre1, padre2
197
  hijo1 = mutar(hijo1, probabilidad_mutacion)
198
  hijo2 = mutar(hijo2, probabilidad_mutacion)
199
  nueva_poblacion.extend([hijo1, hijo2])
200
  poblacion = nueva_poblacion
201
+ if peor < mejor_distancia:
202
+ peor = mejor_distancia
203
+ fitness_historial.append(
204
+ fitness(
205
+ mejor_distancia,
206
+ peor,
207
+ len(padre1),
208
+ )
209
+ )
210
  mejor_solucion = poblacion[0]
211
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
212
  # Visualizar el proceso del algoritmo
213
  visualizar_proceso_streamlit(
214
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
215
  )
216
+ # visualizar el fitness
217
+ visualizar_proceso_fitness_streamlit(fitness_historial)
218
  # Visualizar el mejor camino encontrado
219
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
220
 
221
  return mejor_solucion, mejor_distancia
222
 
223
 
224
+ def visualizar_proceso_fitness_streamlit(fitness_arreglo):
225
+ generaciones = list(range(len(fitness_arreglo)))
226
+
227
+ # Crear gráfico interactivo de evolución de la distancia
228
+ fig_distancia = go.Figure()
229
+ fig_distancia.add_trace(
230
+ go.Scatter(x=generaciones, y=fitness_arreglo, mode="lines+markers")
231
+ )
232
+ fig_distancia.update_layout(
233
+ title="Evolución del fitnesss en Cada Generación",
234
+ xaxis_title="Generación",
235
+ yaxis_title="fitness",
236
+ )
237
+ st.plotly_chart(fig_distancia)
238
+
239
+
240
  def visualizar_proceso_streamlit(
241
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
242
  ):
 
325
  "Tamaño de la Población ($par$)", min_value=10, max_value=100, value=50, step=2
326
  )
327
  probabilidad_mutacion = st.sidebar.slider(
328
+ "Probabilidad de Mutación", min_value=0.01, max_value=0.1, value=0.01
329
+ )
330
+ probabilidad_cruce = st.sidebar.slider(
331
+ "Probabilidad de cruce", min_value=0.9, max_value=0.95, value=0.01, step=0.01
332
  )
333
 
334
  # Ejecutar el algoritmo genético
 
338
  num_individuos,
339
  probabilidad_mutacion,
340
  distancias,
341
+ coordenadas,
342
+ probabilidad_cruce,
343
  )
344
 
345
  # Mostrar resultados
pages/test.py CHANGED
@@ -6,6 +6,8 @@ import plotly.graph_objects as go
6
 
7
  # Se debe tener instalado plotly, streamlit y matplotlib
8
 
 
 
9
 
10
  # Función para generar una población inicial aleatoria
11
  def generar_poblacion(num_individuos, num_ciudades):
@@ -188,16 +190,27 @@ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
188
  st.plotly_chart(fig_camino)
189
 
190
 
 
 
 
 
191
  def algoritmo_genetico(
192
- num_generaciones, num_ciudades, num_individuos, probabilidad_mutacion, distancias
 
 
 
 
 
193
  ):
194
  poblacion = generar_poblacion(num_individuos, num_ciudades)
195
  mejor_solucion_historial = []
196
  mejor_distancia_historial = []
197
-
 
198
  for generacion in range(num_generaciones):
199
  poblacion = sorted(poblacion, key=lambda x: calcular_aptitud(x, distancias))
200
  mejor_individuo = poblacion[0]
 
201
  mejor_distancia = calcular_aptitud(mejor_individuo, distancias)
202
  # Almacenar el mejor individuo y su distancia en cada generación
203
  mejor_solucion_historial.append(mejor_individuo)
@@ -208,14 +221,21 @@ def algoritmo_genetico(
208
  nueva_poblacion = []
209
  for i in range(0, len(seleccionados), 2):
210
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
211
- hijo1 = cruzar(padre1, padre2)
212
- hijo2 = cruzar(padre2, padre1)
 
 
 
 
213
  hijo1 = mutar(hijo1, probabilidad_mutacion)
214
  hijo2 = mutar(hijo2, probabilidad_mutacion)
215
  nueva_poblacion.extend([hijo1, hijo2])
216
 
217
  poblacion = nueva_poblacion
218
-
 
 
 
219
  mejor_solucion = poblacion[0]
220
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias)
221
 
@@ -223,12 +243,30 @@ def algoritmo_genetico(
223
  visualizar_proceso_streamlit(
224
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
225
  )
 
 
226
  # Visualizar el mejor camino encontrado
227
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
228
 
229
  return mejor_solucion, mejor_distancia
230
 
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  def visualizar_proceso_streamlit(
233
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
234
  ):
@@ -257,13 +295,17 @@ if __name__ == "__main__":
257
  "Número de Ciudades", min_value=5, max_value=100, value=10, step=5
258
  )
259
  num_generaciones = st.sidebar.slider(
260
- "Número de Generaciones", min_value=10, max_value=100, value=50
261
  )
262
  num_individuos = st.sidebar.slider(
263
  "Tamaño de la Población", min_value=10, max_value=100, value=50, step=2
264
  )
265
  probabilidad_mutacion = st.sidebar.slider(
266
- "Probabilidad de Mutación", min_value=0.01, max_value=0.5, value=0.1
 
 
 
 
267
  )
268
 
269
  # Generar distancias aleatorias entre las ciudades y sus coordenadas tridimensionales
@@ -276,6 +318,7 @@ if __name__ == "__main__":
276
  num_individuos,
277
  probabilidad_mutacion,
278
  distancias,
 
279
  )
280
 
281
  st.success(f"Mejor solución encontrada: {mejor_solucion}")
 
6
 
7
  # Se debe tener instalado plotly, streamlit y matplotlib
8
 
9
+ st.set_page_config(layout="centered", page_title="Sección de pruebas", page_icon="🧬")
10
+
11
 
12
  # Función para generar una población inicial aleatoria
13
  def generar_poblacion(num_individuos, num_ciudades):
 
190
  st.plotly_chart(fig_camino)
191
 
192
 
193
+ def fitness(distancia, maxima_distancia, tamCromosoma):
194
+ return 1 - ((distancia) / (maxima_distancia * tamCromosoma))
195
+
196
+
197
  def algoritmo_genetico(
198
+ num_generaciones,
199
+ num_ciudades,
200
+ num_individuos,
201
+ probabilidad_mutacion,
202
+ distancias,
203
+ probabilidad_cruce,
204
  ):
205
  poblacion = generar_poblacion(num_individuos, num_ciudades)
206
  mejor_solucion_historial = []
207
  mejor_distancia_historial = []
208
+ peor = 0
209
+ fitness_historial = []
210
  for generacion in range(num_generaciones):
211
  poblacion = sorted(poblacion, key=lambda x: calcular_aptitud(x, distancias))
212
  mejor_individuo = poblacion[0]
213
+
214
  mejor_distancia = calcular_aptitud(mejor_individuo, distancias)
215
  # Almacenar el mejor individuo y su distancia en cada generación
216
  mejor_solucion_historial.append(mejor_individuo)
 
221
  nueva_poblacion = []
222
  for i in range(0, len(seleccionados), 2):
223
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
224
+ aleatorio_local = random.uniform(0, 1)
225
+ if aleatorio_local <= probabilidad_cruce:
226
+ hijo1 = cruzar(padre1, padre2)
227
+ hijo2 = cruzar(padre2, padre1)
228
+ else:
229
+ hijo1, hijo2 = padre1, padre2
230
  hijo1 = mutar(hijo1, probabilidad_mutacion)
231
  hijo2 = mutar(hijo2, probabilidad_mutacion)
232
  nueva_poblacion.extend([hijo1, hijo2])
233
 
234
  poblacion = nueva_poblacion
235
+ if peor < mejor_distancia:
236
+ peor = mejor_distancia
237
+ # print(peor,fitness(mejor_distancia,peor,len(padre1)))
238
+ fitness_historial.append(fitness(mejor_distancia, peor, len(padre1)))
239
  mejor_solucion = poblacion[0]
240
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias)
241
 
 
243
  visualizar_proceso_streamlit(
244
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
245
  )
246
+ # visualizar el fitness
247
+ visualizar_proceso_fitness_streamlit(fitness_historial)
248
  # Visualizar el mejor camino encontrado
249
  visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
250
 
251
  return mejor_solucion, mejor_distancia
252
 
253
 
254
+ def visualizar_proceso_fitness_streamlit(fitness_arreglo):
255
+ generaciones = list(range(len(fitness_arreglo)))
256
+
257
+ # Crear gráfico interactivo de evolución de la distancia
258
+ fig_distancia = go.Figure()
259
+ fig_distancia.add_trace(
260
+ go.Scatter(x=generaciones, y=fitness_arreglo, mode="lines+markers")
261
+ )
262
+ fig_distancia.update_layout(
263
+ title="Evolución del fitnesss en Cada Generación",
264
+ xaxis_title="Generación",
265
+ yaxis_title="fitness",
266
+ )
267
+ st.plotly_chart(fig_distancia)
268
+
269
+
270
  def visualizar_proceso_streamlit(
271
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
272
  ):
 
295
  "Número de Ciudades", min_value=5, max_value=100, value=10, step=5
296
  )
297
  num_generaciones = st.sidebar.slider(
298
+ "Número de Generaciones", min_value=10, max_value=1000, value=50
299
  )
300
  num_individuos = st.sidebar.slider(
301
  "Tamaño de la Población", min_value=10, max_value=100, value=50, step=2
302
  )
303
  probabilidad_mutacion = st.sidebar.slider(
304
+ "Probabilidad de Mutación", min_value=0.01, max_value=0.1, value=0.01
305
+ )
306
+
307
+ probabilidad_cruce = st.sidebar.slider(
308
+ "Probabilidad de Cruce", min_value=0.9, max_value=1.0, value=0.95, step=0.01
309
  )
310
 
311
  # Generar distancias aleatorias entre las ciudades y sus coordenadas tridimensionales
 
318
  num_individuos,
319
  probabilidad_mutacion,
320
  distancias,
321
+ probabilidad_cruce,
322
  )
323
 
324
  st.success(f"Mejor solución encontrada: {mejor_solucion}")
requirements.txt CHANGED
@@ -1,3 +1,3 @@
1
  plotly
2
  streamlit
3
- matplotlib
 
1
  plotly
2
  streamlit
3
+ matplotlib