LupercAI / pages /vrp /Reparto.py
ML-INTA's picture
Upload 10 files
1c5e165
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