from .Origen import Grafo, Vehiculos class Reparto: grafo = None vehiculos = None def __init__(self, ruta = None): if type(self.grafo) == Grafo and type(self.vehiculos) == Vehiculos: if ruta == None: ruta = list(range(-self.vehiculos.num_vehiculos + 1, self.grafo.num_nodos)) ruta.remove(0) self.ruta = ruta self.coste = self._coste() def __str__(self): return str((self.ruta,self.coste)) def _coste(self): # FunciĆ³n de aptitud para evaluar la calidad de las soluciones (distancia_total , demanda_total) = (0,0) capacidades_actual = self.vehiculos.capacidad_vehiculos.copy() rutas = division_rutas(self) i = 1 for ruta in rutas: distancia_total += coste_1ruta(ruta) (demanda_actual, capacidades_actual) = capacidad_1ruta(ruta, capacidades_actual) demanda_total += demanda_actual i += 1 if demanda_total < float('inf'): return distancia_total else: return float('inf') def coste_1ruta(ruta : list[int]) -> int: #ruta = [1,2,3] sin # recorrido = [0] + ruta + [0] #recorrido = [0,1,2,3,0] distacia_total = 0 prev_nodo = 0 for nodo in recorrido[1:]: distacia_total += Reparto.grafo.distancias[prev_nodo][nodo] prev_nodo = nodo return distacia_total def capacidad_1ruta(ruta : list[int], capacidades_actual : list[int]) -> int: #ruta = [1,2,3] sin # demanda_total = 0 for nodo in ruta: demanda_total += Reparto.grafo.demandas_clientes[nodo] if demanda_total <= capacidades_actual[-1]: indice_capacidad = 0 while demanda_total > capacidades_actual[indice_capacidad]: indice_capacidad += 1 capacidades_actual.pop(indice_capacidad) return (demanda_total, capacidades_actual) else: return (float('inf'), capacidades_actual) def division_rutas(reparto : Reparto) -> list[list[int]]: result = [] ruta = [] for nodo in reparto.ruta: if nodo >= 0: ruta += [nodo] else: result += [ruta.copy()] ruta = [] result += [ruta.copy()] return result