Los períodos especifican el horario de los eventos en una ruta. Estos eventos pueden incluir el inicio y el final de la ruta de un conductor, los horarios programados de retiro y entrega, o la duración de toda una ruta.
Las ventanas temporales pueden admitir objetivos como los siguientes:
- Prioriza completar las recolecciones y entregas dentro de los períodos especificados.
- Planifica rutas para operar dentro del horario de atención general.
- Asegúrate de que los vehículos comiencen y finalicen las rutas dentro de los períodos especificados.
Estructura
Como se muestra en el diagrama, los períodos se estructuran de la siguiente manera:
globalStartTime
yglobalEndTime
son propiedades deShipmentModel
timeWindows
son propiedades de lo siguiente:pickups
dentro deShipment
deliveries
dentro deShipment
startTimeWindows
yendTimeWindows
son propiedades deVehicle
.
Lista de tareas de Essentials
Propiedades
En la siguiente tabla, se describen las propiedades de la ventana temporal global.
Propiedad | Formato | Descripción |
---|---|---|
globalStartTime |
Timestamp |
Es la hora más temprana para cualquier evento. |
globalEndTime |
Timestamp |
Es la hora más reciente para cualquier evento. |
En la siguiente tabla, se describen las propiedades de la ventana de tiempo en los envíos y los vehículos.
Madre o padre | Propiedad | Formato | Descripción |
---|---|---|---|
Shipment.pickups |
timeWindows |
Es un array de tipos de mensajes TimeWindow . |
Especifica los intervalos de tiempo para el retiro de un envío. |
Shipment.deliveries |
timeWindows |
Especifica los intervalos de tiempo para la entrega de un envío. | |
Vehicle |
startTimeWindows |
Especifica la hora de inicio del programa de funcionamiento de un vehículo. | |
endTimeWindows |
Especifica la hora de finalización del programa de funcionamiento de un vehículo. |
En la siguiente tabla, se describen las propiedades de un tipo de mensaje TimeWindow
.
Propiedad | Formato | Descripción |
---|---|---|
startTime |
Cadena (formato RFC3339 UTC “Zulú”) | Es el inicio de un período. |
endTime |
Cadena (formato RFC3339 UTC “Zulú”) | Es el final de un período. |
Ejemplos
En esta sección, se abordan tres tipos de ejemplos:
- Ejemplos de código que ilustran la estructura de los períodos.
- Un ejemplo de situación que muestra una forma de usar los períodos para lograr un objetivo comercial.
- Un ejemplo de solicitud que incluye los valores establecidos en la situación de ejemplo.
Muestras de código
En las siguientes secciones, se muestran ejemplos de código de diferentes tipos de períodos.
Períodos globales
En el siguiente ejemplo de código, se muestra la estructura de los períodos globales:
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
Ventanas de tiempo para retiros y entregas
En el siguiente ejemplo de código, se muestra la estructura de los intervalos de tiempo en las recolecciones y entregas de un envío:
{ "model": { "shipments": [ { "pickups": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ], "deliveries": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } ], "vehicles": [ ... ] } }
Períodos de vehículos
En el siguiente ejemplo de código, se muestra la estructura de los períodos de tiempo de un vehículo:
{ "model": { "shipments": [ ... ], "vehicles": [ { "startTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ], "endTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } }
Situación de ejemplo
En esta sección, se usa una situación comercial de una guardería para perros. En el ejemplo, se optimizan las rutas para recoger y dejar perros en dos casas diferentes, y los dueños tienen los mismos períodos de tiempo para recogerlos y dejarlos. El optimizador debe respetar el horario de atención de la guardería, los períodos específicos de retiro y entrega de los clientes, y el horario de trabajo del conductor.
En este ejemplo, los valores de propiedad en la solicitud son los siguientes:
Madre o padre | Propiedad | Valor | Situación |
---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Representa la hora de apertura de tu guardería canina. No se pueden realizar retiros ni entregas antes de esta hora. |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
Representa la hora de cierre de la guardería para perros. Todas las recolecciones y entregas deben completarse antes de esta hora. |
Shipment.pickups |
timeWindows |
startTime :2023-01-13T07:30:00Z |
Define el período aceptable para recoger a un perro de la casa de un cliente. En este ejemplo, les indicaste a ambos clientes que estuvieran disponibles para retirar el pedido entre las 7:30 a.m. y las 9:00 a.m. |
endTime :2023-01-13T09:00:00Z |
|||
Shipment.deliveries |
timeWindows |
startTime :2023-01-13T17:00:00Z |
Define el período aceptable para dejar a un perro en la casa de un cliente. En este ejemplo, les dijiste a ambos clientes que sus perros se dejarán entre las 5:00 p.m. y las 6:30 p.m. |
endTime :2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime :2023-01-13T07:00:00Z endTime :2023-01-13T07:15:00Z |
Define el período aceptable para que el vehículo comience (de 7:00 a.m. a 7:15 a.m.) y finalice (de 5:00 p.m. a 5:15 p.m.). |
endTimeWindows |
startTime :2023-01-13T18:45:00Z endTime :2023-01-13T19:00:00Z |
En el siguiente diagrama, se ilustran los períodos que afectan esta ruta.
En esta situación, como se ilustra en el diagrama, los períodos funcionan de la siguiente manera:
- El período global representa el horario de atención de la guardería canina, y todos los demás períodos deben estar dentro de este.
- Los retiros y las entregas tienen su propio
timeWindows
al inicio y al final del día, respectivamente. - Los
startTimeWindows
del vehículo le brindan al operador un período en el que debe comenzar a trabajar, y losendTimeWindows
proporcionan otro período en el que debe terminar su día. - La hora de inicio del primer
startTimeWindow
y la hora de finalización del últimoendTimeWindow
definen el horario de funcionamiento del vehículo, que, en este caso, es el mismo que el período global.
Ejemplo de solicitud
En el siguiente ejemplo, se muestra la estructura de una solicitud de optimizeTours
que incorpora los valores de las ventanas de tiempo del caso de ejemplo.
{ "model": { "globalStartTime": "2023-01-13T07:00:00Z", "globalEndTime": "2023-01-13T19:00:00Z", "shipments": [ { "pickups": [ { "arrivalLocation": { "latitude": 37.8024, "longitude": -122.4058 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] }, { "pickups": [ { "arrivalLocation": { "latitude": 37.7359, "longitude": -122.5011 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] } ], "vehicles": [ { "startLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "endLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "costPerHour": 27, "startTimeWindows": [ { "startTime": "2023-01-13T07:00:00Z", "endTime": "2023-01-13T07:15:00Z" } ], "endTimeWindows": [ { "startTime": "2023-01-13T18:45:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ] } }
Períodos flexibles
Las ventanas de tiempo se pueden usar como restricciones flexibles definiendo softStartTime
y softEndTime
en un tipo de mensaje TimeWindow
. Esto permite que el optimizador se desvíe del período especificado a un costo determinado, lo que prioriza la optimización general por sobre el cumplimiento estricto de los períodos cuando es beneficioso.
Los períodos flexibles tienen las siguientes limitaciones de uso:
- No se pueden aplicar a
globalStartTime
yglobalEndTime
, ya que no usan el tipo de mensajeTimeWindow
. - Solo se aplican cuando hay un solo
TimeWindow
en una lista.
Propiedades
En la siguiente tabla, se describen las propiedades de las restricciones flexibles para los períodos.
Nombre de la propiedad | Formato | Descripción de la propiedad |
---|---|---|
softStartTime |
Marca de tiempo | Especifica el comienzo del período flexible. Si un evento ocurre antes de esta hora, se generará un costo. |
softEndTime |
Marca de tiempo | Especifica el final del período flexible. Si ocurre un evento después de este tiempo, se generará un costo. |
costPerHourBeforeSoftStartTime |
número | Es el costo por hora en el que se incurre cuando un evento comienza antes del softStartTime . Esta propiedad es obligatoria cuando se usa softStartTime . Consulta el concepto clave del modelo de costos para obtener más información sobre cómo implementar los costos. |
costPerHourAfterSoftEndTime |
número | Es el costo por hora en el que se incurre cuando un evento finaliza después de softEndTime . Esta propiedad es obligatoria cuando se usa softEndTime . Consulta el concepto clave del modelo de costos para obtener más información sobre cómo implementar los costos. |
Muestra de código
En el siguiente ejemplo, se muestra la estructura de las propiedades de restricción flexible de un tipo de mensaje TimeWindow
:
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }