Janelas de tempo

As janelas de tempo estão presentes em "ShipmentModel", em "Shipment" nos objetos de coleta e entrega e em "Vehicle".

As janelas de tempo especificam o horário dos eventos em uma rota. Esses eventos podem incluir o início e o fim do trajeto de um motorista, horários programados de retirada e entrega ou a duração de um trajeto inteiro.

As janelas de tempo podem oferecer suporte a objetivos como:

  • Priorizar a conclusão de retiradas e entregas dentro de períodos especificados.
  • Planejar rotas para operar dentro do horário de funcionamento geral.
  • Garantir que os veículos comecem e terminem os trajetos dentro de períodos especificados.

Estrutura

Conforme mostrado no diagrama, as janelas de tempo são estruturadas da seguinte maneira:

Lista de verificação de fundamentos

A lista de verificação a seguir descreve o conhecimento essencial que evita possíveis erros relacionados a janelas de tempo. Essa lista pode ajudar você a validar sua solicitação e solucionar problemas na resposta.

Propriedades

A tabela a seguir descreve as propriedades da janela de tempo global.

Propriedade Formato Descrição
globalStartTime Timestamp O horário mais cedo para qualquer evento.
globalEndTime Timestamp O horário mais tarde para qualquer evento.

A tabela a seguir descreve as propriedades da janela de tempo em remessas e veículos.

Com filhos Propriedade Formato Descrição
Shipment.pickups timeWindows Matriz de TimeWindow tipos de mensagem. Especifica intervalos de tempo para uma retirada de remessa.
Shipment.deliveries timeWindows Especifica intervalos de tempo para uma entrega de remessa.
Vehicle startTimeWindows Especifica o horário de início da programação de funcionamento de um veículo.
endTimeWindows Especifica o horário de término da programação de funcionamento de um veículo.

A tabela a seguir descreve as propriedades de um TimeWindow tipo de mensagem.

Propriedade Formato Descrição
startTime String (formato UTC "Zulu" RFC3339) O início de uma janela de tempo.
endTime String (formato UTC "Zulu" RFC3339) O fim de uma janela de tempo.

Exemplos

Esta seção aborda três tipos de exemplos:

Amostras de código

As seções a seguir mostram exemplos de código de diferentes tipos de janelas de tempo.

Janelas de tempo globais

O exemplo de código a seguir mostra a estrutura das janelas de tempo globais:

{
  "model": {
    "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ",
    "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ",
    "shipments": [ ... ],
    "vehicles": [ ... ]
  }
}

Janelas de tempo de retiradas e entregas

O exemplo de código a seguir mostra a estrutura das janelas de tempo nas retiradas e entregas de uma remessa:

{
  "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": [ ... ]
  }
}

Janelas de tempo do veículo

O exemplo de código a seguir mostra a estrutura das janelas de tempo de um veí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"
          }
        ]
      }
    ]
  }
}

Exemplo de cenário

Esta seção usa um cenário de negócios de uma creche para cães. O exemplo otimiza os trajetos para buscar e deixar cães de duas casas diferentes, e os proprietários têm as mesmas janelas de tempo de retirada e entrega. O otimizador precisa respeitar o horário de funcionamento da creche, as janelas de retirada e entrega específicas para os clientes e o horário de trabalho do motorista.

Para este exemplo, os valores de propriedade na solicitação são os seguintes:

Com filhos Propriedade Valor Cenário
ShipmentModel globalStartTime 2023-01-13T07:00:00Z Representa o horário de abertura da creche para cães. Nenhuma retirada ou entrega pode acontecer antes desse horário.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Representa o horário de fechamento da creche para cães. Todas as retiradas e entregas precisam ser concluídas até esse horário.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Define a janela aceitável para buscar um cão na casa de um cliente. Neste exemplo, você pediu aos dois clientes que ficassem disponíveis para retirada entre 7h30 e 9h.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Define a janela aceitável para deixar um cão na casa de um cliente. Neste exemplo, você informou aos dois clientes que os cães seriam deixados entre 17h e 18h30.
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
Define a janela aceitável para o veículo começar (7h às 7h15) e terminar (17h às 17h15).
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

O diagrama a seguir ilustra as janelas de tempo que afetam esse trajeto.

Várias linhas do tempo representam a janela de tempo global, as janelas de tempo de coleta e tempo de entrega, as janelas de tempo de início e término do veículo e o horário de trabalho do veículo.

Nesse cenário, conforme ilustrado pelo diagrama, as janelas de tempo funcionam da seguinte maneira:

  • A janela de tempo global representa o horário de funcionamento da creche para cães, e todas as outras janelas de tempo precisam estar dentro dessa janela.
  • As retiradas e entregas têm suas próprias timeWindows no início e fim do dia, respectivamente.
  • As startTimeWindows do veículo oferecem ao operador um período em que ele precisa começar a trabalhar, e endTimeWindows oferecem outro período em que ele precisa terminar o dia.
  • O horário de início da primeira startTimeWindow e o horário de término da última endTimeWindow definem o horário de funcionamento do veículo, que, nesse caso, é o mesmo da janela de tempo global.

Exemplo de solicitação

O exemplo a seguir mostra a estrutura de uma solicitação optimizeTours que incorpora os valores de janelas de tempo do cenário de exemplo.

{
  "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"
          }
        ]
      }
    ]
  }
}

Janelas de tempo flexíveis

As janelas de tempo podem ser usadas como restrições flexíveis definindo softStartTime e softEndTime em um tipo de mensagem TimeWindow. Isso permite que o otimizador se desvie da janela de tempo especificada a um custo especificado, priorizando a otimização geral em vez da adesão estrita aos períodos quando for benéfico.

As janelas de tempo flexíveis têm as seguintes limitações de uso:

Propriedades

A tabela a seguir descreve as propriedades de restrição flexível para janelas de tempo.

Nome da propriedade Formato Descrição da propriedade
softStartTime Carimbo de data/hora Especifica o início da janela de tempo flexível. Se um evento ocorrer antes desse horário, um custo será gerado.
softEndTime Carimbo de data/hora Especifica o fim da janela de tempo flexível. Se um evento ocorrer após esse horário, um custo será gerado.
costPerHourBeforeSoftStartTime número O custo por hora gerado quando um evento começa antes do softStartTime. Essa propriedade é obrigatória ao usar softStartTime. Consulte o conceito-chave do modelo de custo para saber mais sobre como implementar custos.
costPerHourAfterSoftEndTime número O custo por hora gerado quando um evento termina após o softEndTime. Essa propriedade é obrigatória ao usar softEndTime. Consulte o conceito-chave do modelo de custo para saber mais sobre como implementar custos.

Exemplo de código

O exemplo a seguir mostra a estrutura das propriedades de restrição flexível de um TimeWindow tipo de mensagem:

    {
      "softStartTime": "SOFT_START_TIME",
      "softEndTime": "SOFT_END_TIME",
      "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME,
      "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME
    }