File size: 2,475 Bytes
1c5e165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

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