Períodos

Los períodos están presentes en `ShipmentModel`, en `Shipment` en los objetos de retiro y entrega, y en `Vehicle`.

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:

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

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: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.

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 del vehículo, y las horas de trabajo del vehículo.

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 timeWindows al inicio y al final del día, respectivamente.
  • Los startTimeWindows del vehículo le dan al operador del vehículo un período en el que debe comenzar a trabajar, y endTimeWindows proporciona otro período en el que debe finalizar 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 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:

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
    }