JairoDanielMT commited on
Commit
050142e
1 Parent(s): a427d80

Mostrar puntos en el espacio e ingreso manual de datos

Browse files
Files changed (2) hide show
  1. app.py +40 -15
  2. pages/test.py +282 -0
app.py CHANGED
@@ -3,6 +3,7 @@ import matplotlib.pyplot as plt
3
  import random
4
  from mpl_toolkits.mplot3d import Axes3D
5
  import plotly.graph_objects as go
 
6
 
7
  # Se debe tener instalado plotly, streamlit y matplotlib
8
 
@@ -194,17 +195,13 @@ def algoritmo_genetico(
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)
204
  mejor_distancia_historial.append(mejor_distancia)
205
-
206
  seleccionados = seleccion_torneo(poblacion, distancias)
207
-
208
  nueva_poblacion = []
209
  for i in range(0, len(seleccionados), 2):
210
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
@@ -213,12 +210,9 @@ def algoritmo_genetico(
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
-
222
  # Visualizar el proceso del algoritmo
223
  visualizar_proceso_streamlit(
224
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
@@ -247,28 +241,58 @@ def visualizar_proceso_streamlit(
247
  st.plotly_chart(fig_distancia)
248
 
249
 
250
- # Ejemplo de uso en Streamlit
251
  if __name__ == "__main__":
252
- # Configurar la interfaz de usuario con Streamlit
253
  st.title("Algoritmo Gen茅tico para el Problema del Viajante")
254
  st.sidebar.header("Configuraci贸n")
 
 
 
 
 
 
 
255
 
256
- num_ciudades = st.sidebar.number_input(
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
270
- distancias, coordenadas = generar_distancias(num_ciudades)
271
-
272
  # Ejecutar el algoritmo gen茅tico
273
  mejor_solucion, mejor_distancia = algoritmo_genetico(
274
  num_generaciones,
@@ -278,5 +302,6 @@ if __name__ == "__main__":
278
  distancias,
279
  )
280
 
 
281
  st.success(f"Mejor soluci贸n encontrada: {mejor_solucion}")
282
  st.success(f"Mejor distancia encontrada: {mejor_distancia:.2f}")
 
3
  import random
4
  from mpl_toolkits.mplot3d import Axes3D
5
  import plotly.graph_objects as go
6
+ import pandas as pd
7
 
8
  # Se debe tener instalado plotly, streamlit y matplotlib
9
 
 
195
  poblacion = generar_poblacion(num_individuos, num_ciudades)
196
  mejor_solucion_historial = []
197
  mejor_distancia_historial = []
 
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
  mejor_solucion_historial.append(mejor_individuo)
203
  mejor_distancia_historial.append(mejor_distancia)
 
204
  seleccionados = seleccion_torneo(poblacion, distancias)
 
205
  nueva_poblacion = []
206
  for i in range(0, len(seleccionados), 2):
207
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
 
210
  hijo1 = mutar(hijo1, probabilidad_mutacion)
211
  hijo2 = mutar(hijo2, probabilidad_mutacion)
212
  nueva_poblacion.extend([hijo1, hijo2])
 
213
  poblacion = nueva_poblacion
 
214
  mejor_solucion = poblacion[0]
215
  mejor_distancia = calcular_aptitud(mejor_solucion, distancias)
 
216
  # Visualizar el proceso del algoritmo
217
  visualizar_proceso_streamlit(
218
  mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
 
241
  st.plotly_chart(fig_distancia)
242
 
243
 
 
244
  if __name__ == "__main__":
 
245
  st.title("Algoritmo Gen茅tico para el Problema del Viajante")
246
  st.sidebar.header("Configuraci贸n")
247
+ manual_input = st.sidebar.checkbox("Ingresar datos manualmente")
248
+ # Ingresar datos manualmente o generarlos aleatoriamente (por defecto), adem谩s de generar las distancias
249
+ if manual_input:
250
+ st.sidebar.subheader("Ingresar coordenadas manualmente:")
251
+ num_ciudades = st.sidebar.number_input(
252
+ "N煤mero de Ciudades", min_value=5, max_value=100, value=10, step=5
253
+ )
254
 
255
+ coordenadas = []
256
+ for i in range(num_ciudades):
257
+ st.sidebar.subheader(f"Coordenadas Ciudad {i + 1}")
258
+ x = st.sidebar.number_input(
259
+ f"X Ciudad {i + 1}:", value=0.0, key=f"x_{i}", step=1.0
260
+ )
261
+ y = st.sidebar.number_input(
262
+ f"Y Ciudad {i + 1}:", value=0.0, key=f"y_{i}", step=1.0
263
+ )
264
+ z = st.sidebar.number_input(
265
+ f"Z Ciudad {i + 1}:", value=0.0, key=f"z_{i}", step=1.0
266
+ )
267
+ coordenadas.append((x, y, z))
268
+
269
+ data = pd.DataFrame(coordenadas, columns=["X", "Y", "Z"])
270
+ distancias, _ = generar_distancias(num_ciudades)
271
+ else:
272
+ num_ciudades = st.sidebar.number_input(
273
+ "N煤mero de Ciudades", min_value=5, max_value=100, value=10, step=5
274
+ )
275
+
276
+ distancias, coordenadas = generar_distancias(num_ciudades)
277
+ data = pd.DataFrame(coordenadas, columns=["X", "Y", "Z"])
278
+
279
+ # Mostrar datos en la interfaz
280
+ st.write(
281
+ "Puntos en el espacio tridimensional (X, Y, Z), donde cada punto es una ciudad"
282
  )
283
+ st.dataframe(data=data, use_container_width=True)
284
+
285
+ # Configuraciones adicionales
286
  num_generaciones = st.sidebar.slider(
287
  "N煤mero de Generaciones", min_value=10, max_value=100, value=50
288
  )
289
  num_individuos = st.sidebar.slider(
290
+ "Tama帽o de la Poblaci贸n ($par$)", min_value=10, max_value=100, value=50, step=2
291
  )
292
  probabilidad_mutacion = st.sidebar.slider(
293
  "Probabilidad de Mutaci贸n", min_value=0.01, max_value=0.5, value=0.1
294
  )
295
 
 
 
 
296
  # Ejecutar el algoritmo gen茅tico
297
  mejor_solucion, mejor_distancia = algoritmo_genetico(
298
  num_generaciones,
 
302
  distancias,
303
  )
304
 
305
+ # Mostrar resultados
306
  st.success(f"Mejor soluci贸n encontrada: {mejor_solucion}")
307
  st.success(f"Mejor distancia encontrada: {mejor_distancia:.2f}")
pages/test.py ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import matplotlib.pyplot as plt
3
+ import random
4
+ from mpl_toolkits.mplot3d import Axes3D
5
+ 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):
12
+ poblacion = []
13
+ for _ in range(num_individuos):
14
+ individuo = list(range(num_ciudades))
15
+ random.shuffle(individuo)
16
+ poblacion.append(individuo)
17
+ return poblacion
18
+
19
+
20
+ # Funci贸n para evaluar la aptitud de un individuo (distancia total del recorrido)
21
+ def calcular_aptitud(individuo, distancias):
22
+ distancia_total = 0
23
+ for i in range(len(individuo) - 1):
24
+ ciudad_actual = individuo[i]
25
+ siguiente_ciudad = individuo[i + 1]
26
+ distancia_total += distancias[ciudad_actual][siguiente_ciudad]
27
+ distancia_total += distancias[individuo[-1]][individuo[0]]
28
+ return distancia_total
29
+
30
+
31
+ # Funci贸n para seleccionar individuos para la reproducci贸n (torneo binario)
32
+ def seleccion_torneo(poblacion, distancias):
33
+ seleccionados = []
34
+ for _ in range(len(poblacion)):
35
+ torneo = random.sample(poblacion, 2)
36
+ aptitud_torneo = [
37
+ calcular_aptitud(individuo, distancias) for individuo in torneo
38
+ ]
39
+ seleccionado = torneo[aptitud_torneo.index(min(aptitud_torneo))]
40
+ seleccionados.append(seleccionado)
41
+ return seleccionados
42
+
43
+
44
+ # Funci贸n para realizar el cruce de dos padres para producir un hijo
45
+ def cruzar(padre1, padre2):
46
+ punto_cruce = random.randint(0, len(padre1) - 1)
47
+ hijo = padre1[:punto_cruce] + [
48
+ gen for gen in padre2 if gen not in padre1[:punto_cruce]
49
+ ]
50
+ return hijo
51
+
52
+
53
+ # Funci贸n para aplicar mutaciones en la poblaci贸n
54
+ def mutar(individuo, probabilidad_mutacion):
55
+ if random.random() < probabilidad_mutacion:
56
+ indices = random.sample(range(len(individuo)), 2)
57
+ individuo[indices[0]], individuo[indices[1]] = (
58
+ individuo[indices[1]],
59
+ individuo[indices[0]],
60
+ )
61
+ return individuo
62
+
63
+
64
+ # Funci贸n para generar distancias aleatorias entre ciudades y sus coordenadas tridimensionales
65
+ def generar_distancias(num_ciudades):
66
+ distancias = [[0] * num_ciudades for _ in range(num_ciudades)]
67
+ coordenadas = [
68
+ (random.uniform(0, 100), random.uniform(0, 100), random.uniform(0, 100))
69
+ for _ in range(num_ciudades)
70
+ ]
71
+
72
+ for i in range(num_ciudades):
73
+ for j in range(i + 1, num_ciudades):
74
+ distancias[i][j] = distancias[j][i] = (
75
+ sum((x - y) ** 2 for x, y in zip(coordenadas[i], coordenadas[j])) ** 0.5
76
+ )
77
+
78
+ return distancias, coordenadas
79
+
80
+
81
+ def visualizar_camino(camino, coordenadas, mejor_distancia):
82
+ fig = go.Figure()
83
+
84
+ # A帽adir el camino como un trazado 3D interactivo
85
+ x = [coordenadas[i][0] for i in camino]
86
+ y = [coordenadas[i][1] for i in camino]
87
+ z = [coordenadas[i][2] for i in camino]
88
+
89
+ fig.add_trace(go.Scatter3d(x=x, y=y, z=z, mode="lines+markers", name="Camino"))
90
+
91
+ # A帽adir el punto de inicio
92
+ fig.add_trace(
93
+ go.Scatter3d(
94
+ x=[x[0]],
95
+ y=[y[0]],
96
+ z=[z[0]],
97
+ mode="markers",
98
+ marker=dict(color="green", size=10),
99
+ name="Inicio",
100
+ )
101
+ )
102
+
103
+ # A帽adir el punto de fin
104
+ fig.add_trace(
105
+ go.Scatter3d(
106
+ x=[x[-1]],
107
+ y=[y[-1]],
108
+ z=[z[-1]],
109
+ mode="markers",
110
+ marker=dict(color="red", size=10),
111
+ name="Fin",
112
+ )
113
+ )
114
+
115
+ # Configuraciones adicionales
116
+ fig.update_layout(
117
+ scene=dict(aspectmode="cube"),
118
+ title=f"Mejor Camino Encontrado\nDistancia: {mejor_distancia:.2f}",
119
+ )
120
+
121
+ # Mostrar el gr谩fico interactivo en Streamlit
122
+ st.plotly_chart(fig)
123
+
124
+
125
+ def visualizar_camino_streamlit(camino, coordenadas, mejor_distancia):
126
+ fig_camino = go.Figure()
127
+
128
+ # A帽adir el camino como un trazado 3D interactivo
129
+ x = [coordenadas[i][0] for i in camino]
130
+ y = [coordenadas[i][1] for i in camino]
131
+ z = [coordenadas[i][2] for i in camino]
132
+
133
+ # A帽adir el camino como un trazado 3D interactivo con identificadores
134
+ fig_camino.add_trace(
135
+ go.Scatter3d(
136
+ x=x, y=y, z=z, mode="lines+markers", marker=dict(size=5), name="Camino"
137
+ )
138
+ )
139
+
140
+ # A帽adir los puntos de inicio y fin con etiquetas
141
+ fig_camino.add_trace(
142
+ go.Scatter3d(
143
+ x=[x[0]],
144
+ y=[y[0]],
145
+ z=[z[0]],
146
+ mode="markers+text",
147
+ marker=dict(color="green", size=10),
148
+ name="Inicio",
149
+ text=[str(camino[0])],
150
+ textposition="top center",
151
+ )
152
+ )
153
+
154
+ fig_camino.add_trace(
155
+ go.Scatter3d(
156
+ x=[x[-1]],
157
+ y=[y[-1]],
158
+ z=[z[-1]],
159
+ mode="markers+text",
160
+ marker=dict(color="red", size=10),
161
+ name="Fin",
162
+ text=[str(camino[-1])],
163
+ textposition="top center",
164
+ )
165
+ )
166
+
167
+ # A帽adir etiquetas a los puntos intermedios
168
+ for i, (xi, yi, zi) in enumerate(zip(x[1:-1], y[1:-1], z[1:-1])):
169
+ fig_camino.add_trace(
170
+ go.Scatter3d(
171
+ x=[xi],
172
+ y=[yi],
173
+ z=[zi],
174
+ mode="markers+text",
175
+ marker=dict(size=5),
176
+ text=[str(camino[i + 1])],
177
+ textposition="top center",
178
+ )
179
+ )
180
+
181
+ # Configuraciones adicionales
182
+ fig_camino.update_layout(
183
+ scene=dict(aspectmode="cube"),
184
+ title=f"Mejor Camino Encontrado\nDistancia: {mejor_distancia:.2f}",
185
+ )
186
+
187
+ # Mostrar el gr谩fico interactivo en Streamlit
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)
204
+ mejor_distancia_historial.append(mejor_distancia)
205
+
206
+ seleccionados = seleccion_torneo(poblacion, distancias)
207
+
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
+
222
+ # Visualizar el proceso del algoritmo
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
+ ):
235
+ generaciones = list(range(len(mejor_distancia_historial)))
236
+
237
+ # Crear gr谩fico interactivo de evoluci贸n de la distancia
238
+ fig_distancia = go.Figure()
239
+ fig_distancia.add_trace(
240
+ go.Scatter(x=generaciones, y=mejor_distancia_historial, mode="lines+markers")
241
+ )
242
+ fig_distancia.update_layout(
243
+ title="Evoluci贸n de la Distancia en Cada Generaci贸n",
244
+ xaxis_title="Generaci贸n",
245
+ yaxis_title="Distancia",
246
+ )
247
+ st.plotly_chart(fig_distancia)
248
+
249
+
250
+ # Ejemplo de uso en Streamlit
251
+ if __name__ == "__main__":
252
+ # Configurar la interfaz de usuario con Streamlit
253
+ st.title("Algoritmo Gen茅tico para el Problema del Viajante")
254
+ st.sidebar.header("Configuraci贸n")
255
+
256
+ num_ciudades = st.sidebar.number_input(
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
270
+ distancias, coordenadas = generar_distancias(num_ciudades)
271
+
272
+ # Ejecutar el algoritmo gen茅tico
273
+ mejor_solucion, mejor_distancia = algoritmo_genetico(
274
+ num_generaciones,
275
+ num_ciudades,
276
+ num_individuos,
277
+ probabilidad_mutacion,
278
+ distancias,
279
+ )
280
+
281
+ st.success(f"Mejor soluci贸n encontrada: {mejor_solucion}")
282
+ st.success(f"Mejor distancia encontrada: {mejor_distancia:.2f}")