Los períodos especifican el momento 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 una ruta completa.
Los períodos pueden admitir objetivos como los siguientes:
- Priorizar la finalización de retiros y entregas dentro de los plazos especificados
- Planificar rutas para que operen dentro del horario de atención general
- Garantizar que los vehículos comiencen y finalicen las rutas dentro de los plazos especificados
Estructura
Como se muestra en el diagrama, los períodos se estructuran de la siguiente manera:
globalStartTimeyglobalEndTimeson propiedades deShipmentModel.timeWindowsson propiedades de:pickupsdentro deShipment.deliveriesdentro deShipment.
startTimeWindowsyendTimeWindowsson propiedades deVehicle.
Lista de tareas de aspectos básicos
En la siguiente lista de tareas, se describe el conocimiento esencial que evita posibles errores relacionados con los períodos. Esta lista puede ayudarte a validar tu solicitud y solucionar problemas en tu respuesta.
Propiedades
En la siguiente tabla, se describen las propiedades del período global.
| Propiedad | Formato | Descripción |
|---|---|---|
globalStartTime |
Timestamp |
Es la hora más temprana para cualquier evento. |
globalEndTime |
Timestamp |
Es la hora más tardía para cualquier evento. |
En la siguiente tabla, se describen las propiedades de los períodos en envíos y vehículos.
| Padres | Propiedad | Formato | Descripción |
|---|---|---|---|
Shipment.pickups |
timeWindows |
Es un array de TimeWindow tipos de mensajes. |
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 horario de atención de un vehículo. | |
endTimeWindows |
Especifica la hora de finalización del horario de atención de un vehículo. |
En la siguiente tabla, se describen las propiedades de un TimeWindow tipo de mensaje.
| Propiedad | Formato | Descripción |
|---|---|---|
startTime |
String (formato RFC3339 UTC "Zulu") | Es el inicio de un período. |
endTime |
String (formato RFC3339 UTC "Zulu") | Es el final de un período. |
Ejemplos
En esta sección, se abarcan tres tipos de ejemplos:
- **Muestras de código** que ilustran la estructura de los períodos
- Una situación de ejemplo 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": [ ... ] } }
Períodos de retiros y entregas
En el siguiente ejemplo de código, se muestra la estructura de los períodos en los retiros y las 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 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 retirar y dejar perros de dos casas diferentes, y los propietarios tienen los mismos períodos de retiro y entrega. 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 atención del conductor.
En este ejemplo, los valores de las propiedades de la solicitud son los siguientes:
| Padres | Propiedad | Valor | Situación |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Representa la hora 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 entregas y los retiros deben completarse antes de esta hora. |
Shipment.pickups |
timeWindows |
startTime:2023-01-13T07:30:00Z |
Define el período aceptable para retirar un perro de la casa de un cliente. En este ejemplo, les dijiste a ambos clientes que estuvieran disponibles para el retiro 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 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: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 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 para perros, y todos los demás períodos deben estar dentro de este período.
- Los retiros y las entregas tienen sus propios
timeWindowsal inicio y al final del día, respectivamente. - Los
startTimeWindowsdel vehículo le dan al operador del vehículo un período en el que debe comenzar a trabajar, yendTimeWindowsproporciona otro período en el que debe finalizar 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 de la situación 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
Los períodos se pueden usar como restricciones flexibles si se definen 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 plazos cuando es beneficioso.
Los períodos flexibles tienen las siguientes limitaciones de uso:
- No se pueden aplicar a
globalStartTimeyglobalEndTime, ya que no usan el tipo de mensajeTimeWindow. - Solo son aplicables cuando hay un solo
TimeWindowen una lista.
Propiedades
En la siguiente tabla, se describen las propiedades de restricción flexible para los períodos.
| Nombre de la propiedad | Formato | Descripción de la propiedad |
|---|---|---|
softStartTime |
Marca de tiempo | Especifica el inicio del período flexible. Si ocurre un evento antes de esta hora, se genera un costo. |
softEndTime |
Marca de tiempo | Especifica el final del período flexible. Si ocurre un evento después de esta hora, se genera un costo. |
costPerHourBeforeSoftStartTime |
número | Es el costo por hora que se genera cuando un evento comienza antes de 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 costos. |
costPerHourAfterSoftEndTime |
número | Es el costo por hora que se genera 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 costos. |
Muestra de código
En el siguiente ejemplo, se muestra la estructura de las propiedades de restricción flexible de un
TimeWindow tipo de mensaje:
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }