|
|
|
|
|
|
|
|
|
|
|
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): |
|
|
|
|
|
self.tamano_poblacion = tamano_poblacion |
|
self.generaciones = generaciones |
|
self.tamano_torneo = tamano_torneo |
|
|
|
|
|
self.crossover_prob = crossover_prob |
|
self.mutation_prob = mutation_prob |
|
|
|
|
|
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): |
|
|
|
|
|
|
|
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): |
|
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: |
|
parent2 = Evolucion.torneo(self.poblacion, alg_genetico.tamano_torneo) |
|
child = Evolucion.crossover(parent1, parent2) |
|
if random.random() < alg_genetico.mutation_prob: |
|
child = Evolucion.mutate(child) |
|
|
|
return child |
|
|
|
return Poblacion |
|
|
|
|
|
|
|
|
|
|