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 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 y globalEndTime son propiedades de ShipmentModel
  • timeWindows son propiedades de lo siguiente:
    • pickups dentro de Shipment
    • deliveries dentro de Shipment
  • startTimeWindows y endTimeWindows son propiedades de Vehicle.

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:

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.

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 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 los 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 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 y globalEndTime, ya que no usan el tipo de mensaje TimeWindow.
  • 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
    }