Jaocs commited on
Commit
668267d
1 Parent(s): d92d92d

Add aplication file

Browse files
Files changed (3) hide show
  1. Dockerfile +16 -0
  2. app.py +134 -0
  3. requirements.txt +3 -0
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Usa una imagen base de Python
2
+ FROM python:3.12.4
3
+ # Establece el directorio de trabajo
4
+ WORKDIR /code
5
+
6
+ # Copia los archivos necesarios al contenedor
7
+ COPY ./requirements.txt /code/requirements.txt
8
+ RUN pip install --no-cache-dir -r /code/requirements.txt
9
+ RUN pip install fastapi uvicorn
10
+
11
+ COPY . .
12
+
13
+ RUN chmod -R 777 /code
14
+
15
+ # Comando para ejecutar la aplicaci贸n
16
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
+ import numpy as np
4
+ import random
5
+ from typing import List
6
+
7
+ class InputData(BaseModel):
8
+ data: List[float] # Lista de caracter铆sticas num茅ricas (flotantes)
9
+
10
+ app = FastAPI()
11
+
12
+ # ------------- algoritmo genetico -------------
13
+ # Funci贸n para generar una poblaci贸n inicial aleatoria
14
+ def generar_poblacion(num_individuos, num_ciudades):
15
+ poblacion = []
16
+ for _ in range(num_individuos):
17
+ individuo = list(range(num_ciudades))
18
+ random.shuffle(individuo)
19
+ poblacion.append(individuo)
20
+ return poblacion
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
25
+ coordenadas_iguales = all(coord == coordenadas[0] for coord in coordenadas)
26
+
27
+ if not coordenadas_iguales:
28
+ for i in range(len(individuo) - 1):
29
+ ciudad_actual = individuo[i]
30
+ siguiente_ciudad = individuo[i + 1]
31
+ distancia_total += distancias[ciudad_actual][siguiente_ciudad]
32
+
33
+ distancia_total += distancias[individuo[-1]][individuo[0]]
34
+
35
+ return distancia_total
36
+
37
+ # Funci贸n para seleccionar individuos para la reproducci贸n (torneo binario)
38
+ def seleccion_torneo(poblacion, distancias, coordenadas):
39
+ seleccionados = []
40
+ for _ in range(len(poblacion)):
41
+ torneo = random.sample(poblacion, 2)
42
+ aptitud_torneo = [
43
+ calcular_aptitud(individuo, distancias, coordenadas) for individuo in torneo
44
+ ]
45
+ seleccionado = torneo[aptitud_torneo.index(min(aptitud_torneo))]
46
+ seleccionados.append(seleccionado)
47
+ return seleccionados
48
+
49
+ # Funci贸n para realizar el cruce de dos padres para producir un hijo
50
+ def cruzar(padre1, padre2):
51
+ punto_cruce = random.randint(0, len(padre1) - 1)
52
+ hijo = padre1[:punto_cruce] + [
53
+ gen for gen in padre2 if gen not in padre1[:punto_cruce]
54
+ ]
55
+ return hijo
56
+
57
+
58
+ # Funci贸n para aplicar mutaciones en la poblaci贸n
59
+ def mutar(individuo, probabilidad_mutacion):
60
+ if random.random() < probabilidad_mutacion:
61
+ indices = random.sample(range(len(individuo)), 2)
62
+ individuo[indices[0]], individuo[indices[1]] = (
63
+ individuo[indices[1]],
64
+ individuo[indices[0]],
65
+ )
66
+ return individuo
67
+
68
+ # Funci贸n para generar distancias aleatorias entre ciudades y sus coordenadas bidimensionales
69
+ def generar_distancias(num_ciudades):
70
+ distancias = [[0] * num_ciudades for _ in range(num_ciudades)]
71
+ coordenadas = [
72
+ (random.uniform(0, 100), random.uniform(0, 100)) for _ in range(num_ciudades)
73
+ ]
74
+
75
+ for i in range(num_ciudades):
76
+ for j in range(i + 1, num_ciudades):
77
+ distancias[i][j] = distancias[j][i] = (
78
+ sum((x - y) ** 2 for x, y in zip(coordenadas[i], coordenadas[j])) ** 0.5
79
+ )
80
+
81
+ return distancias, coordenadas
82
+
83
+ def algoritmo_genetico(num_generaciones,num_ciudades,num_individuos,probabilidad_mutacion,distancias,coordenadas):
84
+ poblacion = generar_poblacion(num_individuos, num_ciudades)
85
+ for generacion in range(num_generaciones):
86
+ poblacion = sorted(
87
+ poblacion, key=lambda x: calcular_aptitud(x, distancias, coordenadas)
88
+ )
89
+ mejor_individuo = poblacion[0]
90
+ mejor_distancia = calcular_aptitud(mejor_individuo, distancias, coordenadas)
91
+ seleccionados = seleccion_torneo(poblacion, distancias, coordenadas)
92
+ nueva_poblacion = []
93
+ for i in range(0, len(seleccionados), 2):
94
+ padre1, padre2 = seleccionados[i], seleccionados[i + 1]
95
+ hijo1 = cruzar(padre1, padre2)
96
+ hijo2 = cruzar(padre2, padre1)
97
+ hijo1 = mutar(hijo1, probabilidad_mutacion)
98
+ hijo2 = mutar(hijo2, probabilidad_mutacion)
99
+ nueva_poblacion.extend([hijo1, hijo2])
100
+ poblacion = nueva_poblacion
101
+ mejor_solucion = poblacion[0]
102
+ mejor_distancia = calcular_aptitud(mejor_solucion, distancias, coordenadas)
103
+ return mejor_solucion, mejor_distancia
104
+
105
+ # Ruta de predicci贸n
106
+ @app.post("/predict/")
107
+ async def predict(data: InputData):
108
+ print(f"Data: {data}")
109
+ try:
110
+ # Convertir la lista de entrada a un array de NumPy para la predicci贸n
111
+ input_data = np.array(data.data).reshape(
112
+ 1, -1
113
+ ) # Asumiendo que la entrada debe ser de forma (1, num_features)
114
+
115
+ num_ciudades = int(input_data[0][0])
116
+ num_individuos = int(input_data[0][1])
117
+ probabilidad_mutacion = float(input_data[0][2])
118
+ num_generaciones = int(input_data[0][3])
119
+ distancias, coordenadas = generar_distancias(num_ciudades)
120
+
121
+ mejor_solucion, mejor_distancia = algoritmo_genetico(num_generaciones,num_ciudades,num_individuos,probabilidad_mutacion,distancias,coordenadas)
122
+ #print(type(mejor_solucion),mejor_solucion
123
+ respuesta = list(mejor_solucion)
124
+ print(respuesta)
125
+ prediction = respuesta
126
+ #return {"prediction": prediction.tolist()}
127
+ return {
128
+ "num_ciudades": num_ciudades,
129
+ "distancia": int(mejor_distancia),
130
+ "prediction": prediction,
131
+ "cromosoma": mejor_solucion # Esto ya es un array de ints
132
+ }
133
+ except Exception as e:
134
+ raise HTTPException(status_code=500, detail=str(e))
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi
2
+ numpy
3
+ pydantic