Prioriza las visitas cercanas con atributos de transición

En este ejemplo, se muestra cómo usar atributos de transición para priorizar rutas en las que el mismo vehículo realiza recolecciones y entregas cercanas en un mismo período. Para obtener más información sobre los atributos de transición, consulta Model Business Logic with Transition Attributes.

En este ejemplo:

  • Las entregas de los envíos A, B y C están cerca entre sí en la misma ruta.
  • Se realizarán entregas adicionales más adelante.
  • Las entregas no tienen horarios de entrega especificados.
  • Independientemente del programa de visitas, el vehículo debe conducir por esta ruta dos veces: una por la mañana de camino al depósito y otra por la noche de regreso.
  • La distancia y la duración totales del viaje de la ruta son siempre las mismas, independientemente de cuándo se realicen A, B y C.

Ejemplo con entregas de envíos en la misma ruta. Hay tres envíos A, B y C en camino desde el depósito hacia otros envíos. A está a 1, 000 m del depósito, B está a 50 m más lejos del depósito y C está a 30 m más en la misma dirección. Hay otros envíos a 1,000 m de C.

En esta situación, y para una solicitud que solo usa el costo por hora y el costo por kilómetro, la ruta optimizada podría tener A y B atendidos por la mañana y C atendido por la tarde, y el costo de la solución sería el mismo que si los tres se atendieran al mismo tiempo.

Costo por kilómetro con un umbral

Para agrupar las visitas cercanas, primero debes seleccionar una distancia de umbral. Esta es la distancia máxima entre dos visitas que consideras cercanas. En este ejemplo, se usa un umbral de 100 metros que corresponde aproximadamente a una cuadra en un área urbana. Puedes aumentar o disminuir el umbral para que coincida con las necesidades de tu empresa y las preferencias de tus conductores.

Para agrupar las visitas cercanas que se encuentran a menos de 100 metros de distancia, debes establecer un costo alto para los primeros 100 metros de cada transición y un costo más bajo para los metros adicionales de la transición. Dado que los primeros 100 metros son los más costosos, el optimizador logra el mayor ahorro usando transiciones más cortas que el umbral de 100 metros, incluso si eso significa extender la longitud total de la ruta.

Para configurar los costos, agrega una entrada nueva a ShipmentModel.transition_attributes con las siguientes propiedades:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Ningún envío ni vehículo debe usar la etiqueta #unused_tag# para que coincida con todas las transiciones posibles. Para obtener más información, consulta Cómo hacer coincidir todas las solicitudes de visita.

Cómo funciona un costo alto por debajo del umbral

En esta sección, se muestra cómo el costo por debajo y por encima del umbral afecta el costo general de las diferentes soluciones del caso de ejemplo.

Solución 1: Realiza A y B en el camino de ida, y C en el de vuelta

En esta solución, los envíos se dividen en los dos recorridos de esta ruta. Dos de ellos se entregan en el primer recorrido, y el restante, en el segundo. Existen 5 transiciones:

Transición Distancia Por debajo del umbral Por encima del umbral
Distancia Costo Distancia Costo
depot →A 1,000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 min 0
B→otro 1030 m 100 m 5 930 m 0.93
otro→C 1,000 m 100 m 5 900 m 0.9
C→depot 1,080 m 100 m 5 980 m 0.98
Total 450 m 22.5 3710 m 3.71

El costo general se calcula como la suma de los dos costos por kilómetro:

  • el costo por kilómetro por debajo del umbral (50) multiplicado por la distancia total recorrida por debajo del umbral (450 m = 0.45 km)
  • el costo por kilómetro por encima del umbral (1) multiplicado por la distancia total recorrida por encima del umbral (3,710 m = 3.71 km).

Por lo tanto, el costo general es de 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21.

Solución 2: Realiza A, B y C en el camino de ida, y nada en el de vuelta

En esta solución, a diferencia de la solución 1, los tres envíos se entregan "en grupo" durante un solo recorrido por la ruta. En el otro recorrido, el vehículo no se detiene en absoluto. Nuevamente, hay 5 transiciones, pero sus duraciones y composiciones son diferentes:

Transición Distancia Por debajo del umbral Por encima del umbral
Distancia Costo Distancia Costo
depot →A 1,000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 min 0
B→C 30 millones 30 millones 1.5 0 min 0
C→otro 1,000 m 100 m 5 900 m 0.9
other→depot 2080 m 100 m 5 1980 m 1.98
Total 380 m 19 3780 m 3.78

Con el mismo cálculo que en la solución 1, el costo total es 0.38 * 50 + 3.78 * 1 = 19 + 3.78 = 22.78, y realizar todas las visitas en un solo bloque de tiempo tiene un costo menor que realizarlas en dos grupos. Puedes reforzar este efecto aumentando DistanceLimit.cost_per_kilometer_below_soft_max.

Por qué no funciona un costo por kilómetro bajo el umbral

Dado que prefieres las transiciones cortas a las largas, es posible que te sientas tentado a asignar un costo por kilómetro alto a las transiciones largas y mantener el costo por kilómetro bajo para las transiciones cortas. Sin embargo, esto tiene un efecto inverso: dado que los primeros 100 metros de la transición son los más económicos, el optimizador usa estos metros "económicos" de la manera más efectiva posible, ya que prefiere las transiciones que tienen cerca de 100 metros o más.

Puedes ver este efecto en las dos soluciones de ejemplo. Si intercambias el costo por kilómetro por debajo y por encima del umbral, los costos de la ruta cambian:

Costo alto por encima del umbral Costo alto por debajo del umbral
Solución 1 Solución 2 Solución 1 Solución 2
KM por debajo del umbral 0.45 0.38 0.45 0.38
Costo por KM por debajo del umbral 1.00 1.00 50.00 50.00
KM por encima del umbral 3.71 3.78 3.71 3.78
Costo por KM por encima del umbral 50.00 50.00 1.00 1.00
Costo total 185.95 189.38 26.21 22.78

Para cada versión, el menor de los costos totales de las dos soluciones se destaca en negrita. Puedes ver que, cuando usas un costo alto por encima del umbral, el costo total de la ruta ahora es más alto para la ruta en la que se agrupan las visitas, lo que es lo contrario de lo que querías lograr.