Problema A Resolver Con Clarke y Wright (Alfonso Mejia)

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 4

PROBLEMA DE RUTAS POR CARRETERA PARA VEHÍCULOS

RESTRICCIONES DEL PROBLEMA

¿tenemos un número limitado de vehículos?, ¿hay un límite de kilómetros para los vehículos?,
¿hay que cumplir horarios de reparto? Supuestos:

● Disponemos de un único almacén (Madrid de coordenadas 40.23, -3.40), desde donde


parten y al cual regresan todos los vehículos tras realizar el reparto
● Por simplicidad, vamos a suponer que no tenemos limitación en el número de vehículos
disponibles
● No hay límite de kilometraje para los vehículos
● Todos los vehículos tienen un límite de carga igual a 40, que no puede sobrepasarse
● Cada cliente hace un pedido con un peso concreto y pudiendo ser diferente del resto

No existen restricciones espaciales ni temporales

Ejemplos: reparto de prensa, recojo de basura, planificación de transporte público

HEURÍSTICA UTILIZADA (ver figura): Dados dos clientes servidos por dos vehículos diferentes,
si hacemos que un solo vehículo sirva a los dos, obtendremos un ahorro tanto en distancia como
en vehículos. La función d (almacen, cliente i) representa la distancia entre el almacén y el i-
ésimo cliente, S representa el ahorro de combinar a los clientes i, j en una sola ruta, siempre y
cuanto no se viole ninguna restricción

RESOLVER LO SIGUIENTE:

1) APLICANDO TÉCNICAS DE CLARKE Y WRIGHT MODIFICAR EL CÓDIGO PARA


ENCONTRAR LAS RUTAS QUE SE DEBEN RECORRER

2) AGREGAR COMENTARIOS EXPLICATIVOS DE LOS BLOQUES DE CÓDIGO

3) INDICAR SI UTILIZARÁN ESTRUCTURAS TIPO GRAFO O ÁRBOL Y CUÁL ES SU


ESPACIO DE ESTADOS
CÓDIGO PYTHON

# Problema de la ruta de transporte VRP


import math
from operator import itemgetter

def distancia (coord1, coord2):


lat1 = coord1 [0]
lon1 = coord1 [1]
lat2 = coord2 [0]
lon2 = coord2 [1]
return math.sqrt ((lat1 - lat2)**2 + (lon1 - lon2)**2) #PITÁGORAS

def en_ruta (rutas, c):


ruta = None
for r in rutas:
if c in r:
ruta = r
return ruta

def peso_ruta (ruta):


total = 0
for c in ruta:
total = total + pedidos [c]
return total

def vrp_voraz ():


# calcular los ahorros
s = {} # es una estructura tipo diccionario
for c1 in coord:
for c2 in coord:
if c1 != c2:
if not (c2, c1) in s:
d_c1_c2 = distancia (coord [c1], coord [c2])
d_c1_almacen = distancia (coord [c1], almacen)
d_c2_almacen = distancia (coord [c2], almacen)
s [c1, c2] = d_c1_almacen + d_c2_almacen - d_c1_c2
# ordenar ahorros
s = sorted (s.items(), key=itemgeter(1), reverse= False)
# construir rutas
rutas = []
for k, v in s:
rc1 = en_ruta (ruta, k[0])
rc2 = en_ruta (ruta, k[1])
if rc1 == None and rc2 == None:
# no están en ninguna ruta. La creamos
if peso_ruta ([k[0], k[1]]) <= max_carga:
rutas.append ([k[], k[1]])
elif rc1 != None and rc2 == None:
# ciudad 1 ya en una ruta. Agregamos la ciudad 2
if rc1[0] == k[0]:
if peso_ruta (rc1) + peso_ruta ([k[1]]) <= max_carga:
rutas [rutas.index (rc1)].insert (0, k[1])
elif rc1 [len (rc1) -1] == k[0]:
if peso_ruta (rc1) + peso_ruta ([k[1]]) <= max_carga:
rutas [rutas.index (rc1)].append(k[1])

elif rc1 == None and rc2 != None:


# ciudad 2 ya en una ruta. Agregamos la ciudad 1
if rc2[0] == k[1]:
if peso_ruta (rc2) + peso_ruta ([k[0]]) <= max_carga:
rutas [rutas.index (rc2)].insert (0, k[0])
elif rc2 [len (rc2) -1] == k[1]:
if peso_ruta (rc2) + peso_ruta ([k[0]]) <= max_carga:
rutas [rutas.index (rc2)].append(k[])

elif rc1 = None and rc2 != None and rc1 != rc2:


# ciudad 1 y 2 ya en una ruta. Tratamos de unirlas
if rc1[0] == k[0] and rc2 [len(rc2)-1] == k[1]:
if peso_ruta (rc1) + peso_ruta (rc2) <= max_carga:
rutas [rutas.index (rc2)].extend (rc1)
rutas.remove (rc1)
elif rc1 [len (rc1) -1] == k[0] and rc2[0] == k[1]:
if peso_ruta (rc1) + peso_ruta (rc2) <= max_carga:
rutas [rutas.index (rc1)].extend(rc)
rutas.remove(rc2)
return ruta

if __name__ == "__main__":
coord = { # dic
'Malaga': (36.43, -4.24),
'Sevilla': (37.23, -5.59),
'Granada': (37.11, -3.35),
'Valencia': (39.28, -0.22),
'Madrid': (40.24, -3.41),
'Salamanca': (40.57, -5.40),
'Santiago': (42.52, -8.33),
'Santander': (43.28, -3.48),
'Zaragoza': (41.39, -0.52),
'Barcelona': (41.23, +2.11)
}
pedidos = {
'Malaga': 10,
'Sevilla': 13,
'Granada': 7,
'Valencia': 11,
'Madrid': 15,
'Salamanca': 8,
'Santiago': 6,
'Santander': 7,
'Zaragoza': 8,
'Barcelona': 14
}
almacen = (40.23, -3.40)
max_carga = 40
rutas = vrp_voraz()
for ruta in rutas:
print (ruta)

La ejecución del programa nos indica .....

También podría gustarte