EdsonEAP commited on
Commit
e340df7
1 Parent(s): cbae220
Files changed (2) hide show
  1. pages/AG_2D.py +12 -0
  2. pages/test.py +33 -6
pages/AG_2D.py CHANGED
@@ -46,6 +46,7 @@ def seleccion_torneo(poblacion, distancias, coordenadas):
46
  seleccionados.append(seleccionado)
47
  return seleccionados
48
 
 
49
 
50
  # Funci贸n para realizar el cruce de dos padres para producir un hijo
51
  def cruzar(padre1, padre2):
@@ -53,8 +54,19 @@ def cruzar(padre1, padre2):
53
  hijo = padre1[:punto_cruce] + [
54
  gen for gen in padre2 if gen not in padre1[:punto_cruce]
55
  ]
 
 
56
  return hijo
57
 
 
 
 
 
 
 
 
 
 
58
 
59
  # Funci贸n para aplicar mutaciones en la poblaci贸n
60
  def mutar(individuo, probabilidad_mutacion):
 
46
  seleccionados.append(seleccionado)
47
  return seleccionados
48
 
49
+ checkboxCruce = st.sidebar.checkbox("Sin cruce de caminos")
50
 
51
  # Funci贸n para realizar el cruce de dos padres para producir un hijo
52
  def cruzar(padre1, padre2):
 
54
  hijo = padre1[:punto_cruce] + [
55
  gen for gen in padre2 if gen not in padre1[:punto_cruce]
56
  ]
57
+ if checkboxCruce:
58
+ hijo = corregir_camino(hijo, distancias)
59
  return hijo
60
 
61
+ # Funci贸n para corregir el camino y evitar cruces no deseados
62
+ def corregir_camino(camino, distancias):
63
+ n = len(camino)
64
+ for i in range(n):
65
+ for j in range(i + 2, n - 1):
66
+ if distancias[camino[i]][camino[i + 1]] + distancias[camino[j]][camino[j + 1]] > distancias[camino[i]][camino[j]] + distancias[camino[i + 1]][camino[j + 1]]:
67
+ # Intercambiar las conexiones para corregir el cruce
68
+ camino[i + 1], camino[j] = camino[j], camino[i + 1]
69
+ return camino
70
 
71
  # Funci贸n para aplicar mutaciones en la poblaci贸n
72
  def mutar(individuo, probabilidad_mutacion):
pages/test.py CHANGED
@@ -42,15 +42,42 @@ def seleccion_torneo(poblacion, distancias):
42
  seleccionados.append(seleccionado)
43
  return seleccionados
44
 
45
-
46
  # Funci贸n para realizar el cruce de dos padres para producir un hijo
47
- def cruzar(padre1, padre2):
 
48
  punto_cruce = random.randint(0, len(padre1) - 1)
49
  hijo = padre1[:punto_cruce] + [
50
  gen for gen in padre2 if gen not in padre1[:punto_cruce]
51
  ]
 
 
 
52
  return hijo
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  # Funci贸n para aplicar mutaciones en la poblaci贸n
56
  def mutar(individuo, probabilidad_mutacion):
@@ -220,8 +247,8 @@ def algoritmo_genetico(
220
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
221
  aleatorio_local = random.uniform(0, 1)
222
  if aleatorio_local <= probabilidad_cruce:
223
- hijo1 = cruzar(padre1, padre2)
224
- hijo2 = cruzar(padre2, padre1)
225
  else:
226
  hijo1, hijo2 = padre1, padre2
227
  hijo1 = mutar(hijo1, probabilidad_mutacion)
@@ -312,8 +339,8 @@ def algoritmo_genetico_early_stopping(
312
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
313
  aleatorio_local = random.uniform(0, 1)
314
  if aleatorio_local <= probabilidad_cruce:
315
- hijo1 = cruzar(padre1, padre2)
316
- hijo2 = cruzar(padre2, padre1)
317
  else:
318
  hijo1, hijo2 = padre1, padre2
319
  hijo1 = mutar(hijo1, probabilidad_mutacion)
 
42
  seleccionados.append(seleccionado)
43
  return seleccionados
44
 
45
+ checkboxCruce = st.sidebar.checkbox("Sin cruce de caminos")
46
  # Funci贸n para realizar el cruce de dos padres para producir un hijo
47
+ def cruzar(padre1, padre2,distancias):
48
+
49
  punto_cruce = random.randint(0, len(padre1) - 1)
50
  hijo = padre1[:punto_cruce] + [
51
  gen for gen in padre2 if gen not in padre1[:punto_cruce]
52
  ]
53
+ # Corregir el camino para evitar cruces
54
+ if checkboxCruce:
55
+ hijo = corregir_camino(hijo, distancias)
56
  return hijo
57
 
58
+ # Funci贸n para corregir el camino y evitar cruces no deseados
59
+ def corregir_camino(camino, distancias):
60
+ n = len(camino)
61
+ for i in range(n):
62
+ for j in range(i + 2, n - 1):
63
+ if distancias[camino[i]][camino[i + 1]] + distancias[camino[j]][camino[j + 1]] > distancias[camino[i]][camino[j]] + distancias[camino[i + 1]][camino[j + 1]]:
64
+ # Intercambiar las conexiones para corregir el cruce
65
+ camino[i + 1], camino[j] = camino[j], camino[i + 1]
66
+ return camino
67
+
68
+ def mostrar_distancias_de_cruce(padre1, padre2, punto_cruce, distancias):
69
+ genes_cruzados_padre1 = padre1[:punto_cruce]
70
+ genes_cruzados_padre2 = [gen for gen in padre2 if gen not in genes_cruzados_padre1]
71
+
72
+ distancias_cruce = [
73
+ distancias[genes_cruzados_padre1[i]][genes_cruzados_padre2[i]]
74
+ for i in range(min(len(genes_cruzados_padre1), len(genes_cruzados_padre2)))
75
+ ]
76
+
77
+ print("Distancias entre genes que se cruzan:")
78
+ for i, distancia in enumerate(distancias_cruce):
79
+ print(f"Gen {genes_cruzados_padre1[i]} de Padre 1 y Gen {genes_cruzados_padre2[i]} de Padre 2: {distancia:.2f}")
80
+
81
 
82
  # Funci贸n para aplicar mutaciones en la poblaci贸n
83
  def mutar(individuo, probabilidad_mutacion):
 
247
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
248
  aleatorio_local = random.uniform(0, 1)
249
  if aleatorio_local <= probabilidad_cruce:
250
+ hijo1 = cruzar(padre1, padre2, distancias)
251
+ hijo2 = cruzar(padre2, padre1, distancias)
252
  else:
253
  hijo1, hijo2 = padre1, padre2
254
  hijo1 = mutar(hijo1, probabilidad_mutacion)
 
339
  padre1, padre2 = seleccionados[i], seleccionados[i + 1]
340
  aleatorio_local = random.uniform(0, 1)
341
  if aleatorio_local <= probabilidad_cruce:
342
+ hijo1 = cruzar(padre1, padre2, distancias)
343
+ hijo2 = cruzar(padre2, padre1, distancias)
344
  else:
345
  hijo1, hijo2 = padre1, padre2
346
  hijo1 = mutar(hijo1, probabilidad_mutacion)