#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