|
|
|
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): |
|
|
|
(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: |
|
recorrido = [0] + ruta + [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: |
|
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 |
|
|
|
|