LupercAI / pages /vrp /Algoritmo_genético.py
ML-INTA's picture
Upload 10 files
1c5e165
#VERSIÓN 4: VERSIÓN SEMI-ORIENTADA A OBJETOS
#(F): A añadir en (F)uturas versiones
### CLASES DEL ALGORITMO ###
from .Reparto import Reparto, division_rutas
class Algoritmo_Genetico:
def __init__(self, tamano_poblacion : int = 50, generaciones : int = 100, tamano_torneo : int = 5,
crossover_prob : float = 0.8, mutation_prob : float = 0.2):
#Variables del algoritmo (int)
self.tamano_poblacion = tamano_poblacion
self.generaciones = generaciones
self.tamano_torneo = tamano_torneo
#Variables del algoritmo (%)
self.crossover_prob = crossover_prob
self.mutation_prob = mutation_prob
#Variables en ejecución
self.generacion_actual = 0
self.mejor_candidato = ([[1,2,3],[4]], float("inf"))
def _poblar(self, grafo, vehiculos):
Reparto.grafo = grafo
Reparto.vehiculos = vehiculos
return crear_poblacion(self)
def generar(self, grafo, vehiculos):
#print("##############\n##EMPEZAMOS \n##############")
Poblacion = self._poblar(grafo, vehiculos)
poblacion = Poblacion()
from time import sleep
for _ in range(self.generaciones):
sleep(0.1)
poblacion = poblacion.evolucionar()
self.generacion_actual = self.generacion_actual + 1
self.mejor_candidato = (division_rutas(poblacion.poblacion[0]), poblacion.poblacion[0].coste)
from .Evolucion import mejor_individuo
return mejor_individuo(poblacion.poblacion)
def crear_poblacion(alg_genetico : Algoritmo_Genetico): #quizas haga falta , clase_Reparto : type = Reparto
import random
from .Evolucion import Evolucion
class Poblacion:
def __init__(self, poblacion : list[Reparto] = [Reparto()]*alg_genetico.tamano_poblacion):
self.poblacion = poblacion
def evolucionar(self):
new_poblacion = [Evolucion.elitismo(self.poblacion)]
for _ in range(alg_genetico.tamano_poblacion - 1):
new_poblacion += [self._evolucionar_individuo()]
return Poblacion(new_poblacion)
def _evolucionar_individuo(self):
parent1 = Evolucion.torneo(self.poblacion, alg_genetico.tamano_torneo)
child = parent1
if random.random() < alg_genetico.crossover_prob: #Cruce %
parent2 = Evolucion.torneo(self.poblacion, alg_genetico.tamano_torneo)
child = Evolucion.crossover(parent1, parent2)
if random.random() < alg_genetico.mutation_prob: #Mutación %
child = Evolucion.mutate(child)
return child
return Poblacion