JairoDanielMT commited on
Commit
5764e51
1 Parent(s): f35a56c

Algoritmo genetico desplegado con Streamlit en Huggingface

Browse files
Files changed (2) hide show
  1. app.py +262 -0
  2. requirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ fig_camino.add_trace(
134
+ go.Scatter3d(x=x, y=y, z=z, mode="lines+markers", name="Camino")
135
+ )
136
+
137
+ # A帽adir el punto de inicio
138
+ fig_camino.add_trace(
139
+ go.Scatter3d(
140
+ x=[x[0]],
141
+ y=[y[0]],
142
+ z=[z[0]],
143
+ mode="markers",
144
+ marker=dict(color="green", size=10),
145
+ name="Inicio",
146
+ )
147
+ )
148
+
149
+ # A帽adir el punto de fin
150
+ fig_camino.add_trace(
151
+ go.Scatter3d(
152
+ x=[x[-1]],
153
+ y=[y[-1]],
154
+ z=[z[-1]],
155
+ mode="markers",
156
+ marker=dict(color="red", size=10),
157
+ name="Fin",
158
+ )
159
+ )
160
+
161
+ # Configuraciones adicionales
162
+ fig_camino.update_layout(
163
+ scene=dict(aspectmode="cube"),
164
+ title=f"Mejor Camino Encontrado\nDistancia: {mejor_distancia:.2f}",
165
+ )
166
+
167
+ # Mostrar el gr谩fico interactivo en Streamlit
168
+ st.plotly_chart(fig_camino)
169
+
170
+
171
+ def algoritmo_genetico(
172
+ num_generaciones, num_ciudades, num_individuos, probabilidad_mutacion, distancias
173
+ ):
174
+ poblacion = generar_poblacion(num_individuos, num_ciudades)
175
+ mejor_solucion_historial = []
176
+ mejor_distancia_historial = []
177
+
178
+ for generacion in range(num_generaciones):
179
+ poblacion = sorted(poblacion, key=lambda x: calcular_aptitud(x, distancias))
180
+ mejor_individuo = poblacion[0]
181
+ mejor_distancia = calcular_aptitud(mejor_individuo, distancias)
182
+ # Almacenar el mejor individuo y su distancia en cada generaci贸n
183
+ mejor_solucion_historial.append(mejor_individuo)
184
+ mejor_distancia_historial.append(mejor_distancia)
185
+
186
+ seleccionados = seleccion_torneo(poblacion, distancias)
187
+
188
+ nueva_poblacion = []
189
+ for i in range(0, len(seleccionados), 2):
190
+ padre1, padre2 = seleccionados[i], seleccionados[i + 1]
191
+ hijo1 = cruzar(padre1, padre2)
192
+ hijo2 = cruzar(padre2, padre1)
193
+ hijo1 = mutar(hijo1, probabilidad_mutacion)
194
+ hijo2 = mutar(hijo2, probabilidad_mutacion)
195
+ nueva_poblacion.extend([hijo1, hijo2])
196
+
197
+ poblacion = nueva_poblacion
198
+
199
+ mejor_solucion = poblacion[0]
200
+ mejor_distancia = calcular_aptitud(mejor_solucion, distancias)
201
+
202
+ # Visualizar el proceso del algoritmo
203
+ visualizar_proceso_streamlit(
204
+ mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
205
+ )
206
+ # Visualizar el mejor camino encontrado
207
+ visualizar_camino_streamlit(mejor_solucion, coordenadas, mejor_distancia)
208
+
209
+ return mejor_solucion, mejor_distancia
210
+
211
+
212
+ def visualizar_proceso_streamlit(
213
+ mejor_distancia_historial, mejor_solucion, coordenadas, mejor_distancia
214
+ ):
215
+ generaciones = list(range(len(mejor_distancia_historial)))
216
+
217
+ # Crear gr谩fico interactivo de evoluci贸n de la distancia
218
+ fig_distancia = go.Figure()
219
+ fig_distancia.add_trace(
220
+ go.Scatter(x=generaciones, y=mejor_distancia_historial, mode="lines+markers")
221
+ )
222
+ fig_distancia.update_layout(
223
+ title="Evoluci贸n de la Distancia en Cada Generaci贸n",
224
+ xaxis_title="Generaci贸n",
225
+ yaxis_title="Distancia",
226
+ )
227
+ st.plotly_chart(fig_distancia)
228
+
229
+
230
+ # Ejemplo de uso en Streamlit
231
+ if __name__ == "__main__":
232
+ # Configurar la interfaz de usuario con Streamlit
233
+ st.title("Algoritmo Gen茅tico para el Problema del Viajante")
234
+ st.sidebar.header("Configuraci贸n")
235
+
236
+ num_ciudades = st.sidebar.number_input(
237
+ "N煤mero de Ciudades", min_value=5, max_value=100, value=10, step=5
238
+ )
239
+ num_generaciones = st.sidebar.slider(
240
+ "N煤mero de Generaciones", min_value=10, max_value=100, value=50
241
+ )
242
+ num_individuos = st.sidebar.slider(
243
+ "Tama帽o de la Poblaci贸n", min_value=10, max_value=100, value=50, step=2
244
+ )
245
+ probabilidad_mutacion = st.sidebar.slider(
246
+ "Probabilidad de Mutaci贸n", min_value=0.01, max_value=0.5, value=0.1
247
+ )
248
+
249
+ # Generar distancias aleatorias entre las ciudades y sus coordenadas tridimensionales
250
+ distancias, coordenadas = generar_distancias(num_ciudades)
251
+
252
+ # Ejecutar el algoritmo gen茅tico
253
+ mejor_solucion, mejor_distancia = algoritmo_genetico(
254
+ num_generaciones,
255
+ num_ciudades,
256
+ num_individuos,
257
+ probabilidad_mutacion,
258
+ distancias,
259
+ )
260
+
261
+ st.success(f"Mejor soluci贸n encontrada: {mejor_solucion}")
262
+ st.success(f"Mejor distancia encontrada: {mejor_distancia:.2f}")
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ plotly
2
+ streamlit
3
+ matplotlib