Prioriza las visitas cercanas con atributos de transición

En este ejemplo, se muestra cómo usar los atributos de transición para priorizar las rutas en las que el mismo vehículo realiza búsquedas y entregas cercanas en un bloque de tiempo. Para obtener más información sobre los atributos de transición, consulta Cómo modelar la lógica empresarial con atributos de transición.

En este ejemplo:

  • Las entregas de los envíos A, B y C están cerca una de la otra en la misma ruta.
  • Hay entregas adicionales más adelante en la ruta.
  • Las entregas no tienen horarios especificados.
  • Independientemente del cronograma 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 siempre son 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 la ruta 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 por la mañana, y C por la noche. El costo de la solución sería el mismo que si los tres se manejaran 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 satisfacer las necesidades de tu empresa y las preferencias de tus conductores.

Para agrupar las visitas cercanas a 100 metros entre sí, debes establecer un costo alto en los primeros 100 metros de cada transición y un costo más bajo para cualquier metro adicional de la transición. Dado que los primeros 100 metros son los más costosos, el optimizador logra los mayores ahorros mediante el uso de transiciones que son 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 coincidan 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 total de las diferentes soluciones del caso de ejemplo.

Solución 1: Realizar 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. Hay 5 transiciones:

Transición Distancia Por debajo del umbral Por encima del umbral
Distancia Costo Distancia Costo
depot →A 1000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 m 0
B→other 1030 m 100 m 5 930 m 0.93
other→C 1000 m 100 m 5 900 m 0.9
C→depot 1080 m 100 m 5 980 m 0.98
Total 450 m 22.5 3710 m 3.71

El costo total 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 (3710 m = 3.71 km)

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

Solución 2: Realizar A, B y C durante el trayecto 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 recorrido de la ruta. En el otro recorrido, el vehículo no se detiene en absoluto. Nuevamente, hay 5 transiciones, pero sus longitudes y composiciones son diferentes:

Transición Distancia Por debajo del umbral Por encima del umbral
Distancia Costo Distancia Costo
depot →A 1000 m 100 m 5 900 m 0.9
A→B 50 m 50 m 2.5 0 m 0
B→C 30 m 30 m 1.5 0 m 0
C→other 1000 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 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 por debajo del umbral

Dado que quieres priorizar las transiciones cortas sobre 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" con el mayor efecto posible, ya que prioriza 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, cambian los costos de la ruta:

Costo alto por encima del umbral Costo alto por debajo del umbral
Solución 1 Solución 2 Solución 1 Solución 2
KMs 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
KMs 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, que es lo opuesto a lo que querías lograr.