Las ventanas de tiempo especifican el momento en que se producen 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 una ruta completa.
Las ventanas de tiempo pueden respaldar objetivos como los siguientes:
- Prioriza completar las recolecciones y entregas dentro de los plazos especificados.
- Planifica rutas para operar dentro del horario de atención general.
- Asegúrate de que los vehículos inicien y finalicen las rutas dentro de los plazos especificados.
Estructura
Como se muestra en el diagrama, las ventanas de tiempo se estructuran de la siguiente manera:
globalStartTimeyglobalEndTimeson propiedades deShipmentModeltimeWindowsson propiedades de:pickupsdentro deShipment.deliveriesdentro deShipment.
startTimeWindowsyendTimeWindowsson propiedades deVehicle.
Lista de tareas de Essentials
En la siguiente lista de tareas, se describen los conocimientos esenciales que evitan posibles errores relacionados con las ventanas de tiempo. Esta lista puede ayudarte a validar tu solicitud y solucionar problemas con tu respuesta.
Propiedades
En la siguiente tabla, se describen las propiedades de la ventana de tiempo global.
| Propiedad | Formato | Descripción |
|---|---|---|
globalStartTime |
Timestamp |
La hora más temprana para cualquier evento. |
globalEndTime |
Timestamp |
La hora más tardía para cualquier evento. |
En la siguiente tabla, se describen las propiedades de las ventanas de tiempo en los envíos y los vehículos.
| Padres | Propiedad | Formato | Descripción |
|---|---|---|---|
Shipment.pickups |
timeWindows |
Es un array de tipos de mensajes TimeWindow. |
Especifica los intervalos de tiempo para la recolección de un envío. |
Shipment.deliveries |
timeWindows |
Especifica intervalos de tiempo para la entrega de un envío. | |
Vehicle |
startTimeWindows |
Especifica la hora de inicio del programa de operaciones de un vehículo. | |
endTimeWindows |
Especifica la hora de finalización del programa de operaciones de un vehículo. |
En la siguiente tabla, se describen las propiedades de un tipo de mensaje
TimeWindow.
| Propiedad | Formato | Descripción |
|---|---|---|
startTime |
String (formato RFC3339 UTC "Zulú") | Es el inicio de un período. |
endTime |
String (formato RFC3339 UTC "Zulú") | El final de un período. |
Ejemplos
En esta sección, se abordan tres tipos de ejemplos:
- Muestras de código que ilustran la estructura de las ventanas de tiempo.
- Un ejemplo de situación que muestra una forma de usar las ventanas de tiempo 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 muestras de código de diferentes tipos de ventanas de tiempo.
Períodos globales
En la siguiente muestra de código, se indica la estructura de las ventanas de tiempo globales:
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
Ventanas de tiempo de retiros y entregas
En la siguiente muestra de código, se indica la estructura de las ventanas horarias 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 los vehículos
En la siguiente muestra de código, se indica la estructura de las ventanas 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 empresarial de guardería para perros. En el ejemplo, se optimizan las rutas para recoger y dejar perros de dos casas diferentes, y los propietarios tienen los mismos períodos de tiempo para recoger y dejar a sus mascotas. El optimizador debe respetar el horario de atención de la guardería, los períodos específicos de retiro y entrega para los clientes, y el horario de trabajo del conductor.
En este ejemplo, los valores de propiedad de la solicitud son los siguientes:
| Padres | Propiedad | Valor | Situación |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Representa el horario de apertura de tu guardería para perros. No se pueden realizar retiros ni entregas antes de esta hora. |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
Representa la hora de cierre de tu 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 un perro de la casa de un cliente. En este ejemplo, les dijiste a ambos clientes que estuvieran disponibles para la recogida 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 entregará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:00ZendTime: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:00ZendTime:2023-01-13T19:00:00Z |
En el siguiente diagrama, se ilustran las ventanas de tiempo que afectan esta ruta.
En esta situación, como se ilustra en el diagrama, los períodos funcionan de la siguiente manera:
- La ventana de tiempo global representa el horario de atención de la guardería para perros, y todas las demás ventanas de tiempo deben estar dentro de esta ventana de tiempo.
- Las recogidas y entregas tienen su propio
timeWindowsal principio y al final del día, respectivamente. - Las
startTimeWindowsdel vehículo le dan al operador un período en el que debe comenzar a trabajar, y lasendTimeWindowsproporcionan otro período en el que debe terminar su día. - La hora de inicio del primer
startTimeWindowy la hora de finalización del últimoendTimeWindowdefinen el horario de atención 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 optimizeTours
que incorpora los valores de los períodos del 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 con un costo determinado, lo que prioriza la optimización general por sobre el cumplimiento estricto de los plazos cuando sea beneficioso.
Las ventanas de tiempo flexibles tienen las siguientes limitaciones de uso:
- No se pueden aplicar a
globalStartTimeni aglobalEndTime, ya que no usan el tipo de mensajeTimeWindow. - Solo se aplican cuando hay un solo
TimeWindowen una lista.
Propiedades
En la siguiente tabla, se describen las propiedades de las restricciones flexibles para las ventanas de tiempo.
| Nombre de la propiedad | Formato | Descripción de la propiedad |
|---|---|---|
softStartTime |
Marca de tiempo | Especifica el comienzo del período flexible. Si se produce un evento antes de este momento, se genera un costo. |
softEndTime |
Marca de tiempo | Especifica el final de la ventana de tiempo flexible. Si se produce un evento después de este tiempo, se incurre en un costo. |
costPerHourBeforeSoftStartTime |
número | Es el costo por hora en el que se incurre cuando un evento comienza antes de la softStartTime. Esta propiedad es obligatoria cuando se usa softStartTime. Consulta el concepto clave 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 la softEndTime. Esta propiedad es obligatoria cuando se usa softEndTime. Consulta el concepto clave 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 }