Períodos

Las ventanas de tiempo están presentes en `ShipmentModel`, en `Shipment` en los objetos de retiro y entrega, y en `Vehicle`.

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:

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

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: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 las ventanas de tiempo que afectan esta ruta.

Varias líneas de tiempo representan el período global, los períodos de retiro y entrega, los períodos de inicio y finalización de los vehículos, y las horas de trabajo de los vehículos.

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 timeWindows al principio y al final del día, respectivamente.
  • Las startTimeWindows del vehículo le dan al operador un período en el que debe comenzar a trabajar, y las endTimeWindows 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 último endTimeWindow definen 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:

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
    }