En esta guía, se muestran los posibles usos de los atributos de transición. Te enseñará a modelar situaciones del mundo real con dos ejemplos: incorporar el tiempo de estacionamiento del vehículo en las rutas optimizadas y garantizar que cada ruta finalice con una visita a una ubicación específica.
Antes de comenzar
Utilizas atributos de transición para agregar costos y demoras específicos del modelo a ciertas transiciones en las rutas optimizadas. Estos costos y demoras se suman a las duraciones de la transición y los costos calculados a partir de los datos del mapa según los parámetros del vehículo utilizado.
Una transición es el tramo de la ruta que conecta una ubicación con la siguiente.
Una ubicación hace referencia a cualquiera de los siguientes puntos en la ruta de un vehículo:
- Es el punto de partida de la ruta.
- Es una parada en la que se realiza un retiro o una entrega.
- Es el punto final de la ruta.
Para definir todos los atributos de transición del modelo, agrégalos a la lista ShipmentModel.transition_attributes
.
Cada elemento de la lista define un conjunto de atributos de transición y se corresponde con las transiciones en las rutas a través de etiquetas en la ubicación de inicio y la ubicación de finalización de la transición. Para obtener más información sobre los atributos de transición, consulta la documentación de referencia de TransitionAttributes
.
Modelar situaciones del mundo real
En esta sección, se muestran dos ejemplos pequeños de cómo implementar restricciones comerciales del mundo real con atributos de transición.
Reserva tiempo para estacionar
En esta situación, el conductor debe estacionar el vehículo antes de poder visitar la ubicación A. La ubicación B está cerca, y el conductor puede usar el mismo lugar de estacionamiento para ambas visitas. Si el conductor visita B inmediatamente después de A, ahorra tiempo porque no necesita salir del estacionamiento y volver a estacionar el vehículo. En la API de Route Optimization, puedes usar atributos de transición para agregar tiempo adicional para estacionar el vehículo solo cuando el conductor se mueve de un lugar de estacionamiento a otro.
Cuando modelas el tiempo de estacionamiento por separado de las duraciones de las visitas, las rutas en las que se agrupan las visitas que usan el mismo estacionamiento tardan menos tiempo. Haces que el modelo sea más preciso y que el optimizador prefiera las rutas en las que se agrupan las visitas.
Sigue estos pasos para hacerlo en una solicitud a la API de Route Optimization:
Usa
VisitRequest.duration
solo durante el tiempo necesario para realizar la visita. Por ejemplo, para entregar el paquete y obtener la firma del cliente.Para cada lugar de estacionamiento distinto que se use en el modelo, usa una etiqueta nueva que no se use para nada más en el modelo, por ejemplo,
PARKING_123
.Agrega esta etiqueta a lo siguiente:
VisitRequest.tags
en todas las solicitudes de visita que usen este lugar de estacionamiento.Vehicle.start_tags
si el vehículo comienza su ruta en este lugar de estacionamiento.Vehicle.end_tags
si el vehículo comienza o termina su ruta en este estacionamiento.
Para cada etiqueta de estacionamiento nueva, agrega una entrada a
ShipmentModel.transition_attributes
que agregue una demora para el estacionamiento cuando se llega desde un lugar de estacionamiento diferente. Para ello, haz lo siguiente:Establece
TransitionAttributes.excluded_src_tag
yTransitionAttributes.dst_tag
enPARKING_123
.Establece
TransitionAttributes.delay
en el tiempo necesario para estacionar el vehículo.
Por ejemplo, cuando la etiqueta de una ubicación es
PARKING_123
y se tarda 150 segundos en estacionar el vehículo, agrega la siguiente entrada aShipmentModel.transition_attributes
:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Limpieza obligatoria al final de la ruta
En este caso, el vehículo debe limpiarse al final de la ruta, con las siguientes restricciones adicionales:
- La limpieza se realiza en una instalación especializada antes de regresar al depósito de vehículos. La ruta optimizada utiliza la mejor instalación de limpieza según su ubicación y las ubicaciones de las recolecciones y entregas que realiza el vehículo.
- Después de la limpieza, el vehículo no debe realizar ninguna otra recolección ni entrega.
- El tiempo de viaje y limpieza del vehículo se cuenta como horas de trabajo del conductor y debe ajustarse a la duración máxima de la ruta.
Para modelar este requisito, solo permite rutas que estén vacías o cuyo último destino sea una instalación de limpieza. En la API de Route Optimization, puedes hacerlo prohibiendo las transiciones al punto de ruta final de la ruta desde cualquier ubicación, excepto desde la instalación de limpieza o desde el punto de partida de la ruta:
- Elige dos etiquetas nuevas que no se usen en ninguna parte del modelo, por ejemplo,
CLEANED
yROUTE_END
. El primero es para las ubicaciones en las que el vehículo está o se vuelve limpio, y el segundo es para el final de la ruta. - Para cada vehículo, agrega un envío nuevo solo para entrega que represente la visita a una instalación de limpieza con los siguientes atributos:
- Cada ubicación de la instalación de limpieza debe representarse como una solicitud de visita de entrega de este envío.
- Agrega
CLEANED
aVisitRequest.tags
de cada solicitud de visita del envío de la instalación de limpieza. Indica que un vehículo que sale de esta ubicación está limpio. Otras solicitudes de visita en el modelo no deben usar esta etiqueta para que el vehículo se considere "no limpio" cuando las abandone. - Permite que el optimizador omita este envío cuando el vehículo no se use de otra manera. Para ello, establece su
penalty_cost
en un número pequeño.
Para cada vehículo, agrega
CLEANED
aVehicle.start_tags
. Se usa para marcar el vehículo como limpio antes de que realice cualquier retiro o entrega, suponiendo que se limpió al final del día laboral anterior, y permitirle ir desde el punto de partida directamente hasta el punto final. Incluso si esas rutas no se dan en la práctica, permitir este escenario ayuda al optimizador a buscar rutas optimizadas de manera más eficiente.Para cada vehículo, agrega
ROUTE_END
aVehicle.end_tags
.Agrega una entrada nueva a
ShipmentModel.transition_attributes
que prohíba que los vehículos lleguen al punto de ruta final del vehículo cuando no estén limpios, con las siguientes propiedades:Establece
TransitionAttributes.excluded_src_tag
enCLEANED
.Establece
TransitionAttributes.dst_tag
enROUTE_END
.Establece
TransitionAttributes.delay
en un valor grande. Cuando haces que la demora sea más larga que la duración máxima de la ruta, prohíbes de manera efectiva que el optimizador use esta transición en una ruta.
Por ejemplo, cuando la escala de tiempo del modelo es de un día laboral, puedes usar una demora de 24 horas (86,400 segundos) para prohibir la transición al final de la ruta desde cualquier lugar, excepto desde una instalación de limpieza y el inicio de la ruta:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Cómo elegir entre demoras y costos
La elección entre demoras y costos depende de la naturaleza de la lógica y las restricciones comerciales implementadas. El parámetro de configuración TransitionAttributes.delay
es el más adecuado para implementar restricciones estrictas o expresar una compensación en términos del tiempo invertido.
TransitionAttributes.cost
se ajusta mejor cuando se implementan preferencias flexibles o compensaciones expresadas como un costo adicional. Puedes combinar demoras y costos de forma arbitraria cuando se trata del tiempo invertido y el costo.
En el ejemplo de limpieza de vehículos, se usa una demora muy larga, ya que limpiar el vehículo al final de la ruta es un requisito estricto y la demora larga evita que el optimizador ignore el requisito. Si solo estableces un costo, el optimizador podría optar por omitir la limpieza si encuentra una forma de compensar el costo en otro lugar, por ejemplo, realizando más envíos en el tiempo "ahorrado" por no limpiar el vehículo.
El ejemplo de estacionamiento usa una demora corta que corresponde al tiempo adicional necesario para estacionar el vehículo. También puedes usar costos en combinación con demoras si el conductor se detiene en un estacionamiento pagado.
Cómo agregar un atributo de transición que coincida con todas las solicitudes de visita
En los ejemplos anteriores, se usan atributos de transición que coinciden con ubicaciones que tienen una etiqueta determinada o que no la tienen. Pero ¿qué sucede si necesitas agregar atributos de transición que se apliquen a todas las transiciones?
No puedes omitir las etiquetas, ya que cada mensaje TransitionAttributes
debe tener una de las etiquetas TransitionAttributes.src_tag
y TransitionAttributes.excluded_src_tag
, y una de las etiquetas TransitionAttributes.dst_tag
y TransitionAttributes.excluded_dst_tag
.
Sin embargo, puedes hacer coincidir todas las etiquetas configurando TransitionAttributes.excluded_src_tag
o TransitionAttributes.excluded_dst_tag
en una etiqueta que no se use en ninguna parte del modelo. Esto coincidirá con todas las ubicaciones que no tengan esta etiqueta, pero, como elegiste intencionalmente una etiqueta que no usa ninguna ubicación, estos atributos de transición coincidirán con todas las ubicaciones.