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 um trajeto. Esses eventos podem incluir o início e o fim do trajeto de um motorista, horários programados de coleta e entrega ou a duração de um trajeto inteiro.

Os períodos podem ajudar com objetivos como:

  • Priorize a conclusão de retiradas e entregas dentro dos períodos especificados.
  • Planeje rotas para operar dentro do horário comercial geral.
  • Verifique se os veículos iniciam e terminam as rotas dentro dos períodos especificados.

Estrutura

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

  • globalStartTime e globalEndTime são propriedades de ShipmentModel
  • timeWindows são propriedades de:
    • pickups em Shipment.
    • deliveries em Shipment.
  • startTimeWindows e endTimeWindows são propriedades de Vehicle.

Lista de verificação do Essentials

Propriedades

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

Propriedade Formato Descrição
globalStartTime Timestamp O horário mais antigo de qualquer evento.
globalEndTime Timestamp O horário mais recente de qualquer evento.

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

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

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

Propriedade Formato Descrição
startTime String (formato UTC "Zulu" RFC3339) O início de um período.
endTime String (formato UTC "Zulu" RFC3339) O fim de um período.

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 períodos.

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 para retiradas e entregas

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

{
  "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 dos intervalos 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 cachorros. O exemplo otimiza rotas para buscar e deixar cachorros em duas casas diferentes, e os proprietários têm as mesmas janelas de horário de coleta e entrega. O otimizador precisa respeitar o horário de funcionamento da creche, os horários específicos de coleta e entrega para 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 sua creche para cachorros. 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 cachorros. Todas as retiradas e entregas precisam ser concluídas até esse horário.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Define o período aceitável para buscar um cachorro na casa de um cliente. Neste exemplo, você pediu que os dois clientes estivessem disponíveis para retirada entre 7h30 e 9h.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Define o período aceitável para deixar um cachorro na casa de um cliente. Neste exemplo, você informou aos dois clientes que os cachorros seriam entregues 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 o período 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 essa rota.

Várias linhas do tempo representam a janela de tempo global, as janelas de tempo de coleta e 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 no diagrama, as janelas de tempo funcionam da seguinte maneira:

  • A janela de tempo global representa o horário de funcionamento da creche para cachorros, e todas as outras janelas de tempo precisam estar dentro dela.
  • As retiradas e entregas têm seus próprios timeWindows no início e no fim do dia, respectivamente.
  • Os startTimeWindows do veículo dão ao operador um período em que ele precisa começar a trabalhar, e os endTimeWindows fornecem outro período em que ele precisa terminar o dia.
  • O horário de início do primeiro startTimeWindow e o horário de término do último endTimeWindow definem o horário de funcionamento do veículo, que, neste caso, é o mesmo que o período global.

Exemplo de solicitação

O exemplo a seguir mostra a estrutura de uma solicitação optimizeTours que incorpora os valores de períodos 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

Os intervalos de tempo podem ser usados como restrições flexíveis definindo softStartTime e softEndTime em um tipo de mensagem TimeWindow. Isso permite que o otimizador se desvie do período especificado a um custo especificado, priorizando a otimização geral em vez da adesão estrita aos prazos quando isso for benéfico.

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

  • Elas não podem ser aplicadas a globalStartTime e globalEndTime porque não usam o tipo de mensagem TimeWindow.
  • Elas só são aplicáveis quando há um único TimeWindow em uma lista.

Propriedades

A tabela a seguir descreve as propriedades de restrição flexível para intervalos 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, será cobrado um custo.
softEndTime Carimbo de data/hora Especifica o fim da janela de tempo flexível. Se um evento ocorrer depois desse horário, será cobrado um custo.
costPerHourBeforeSoftStartTime número O custo por hora incorrido quando um evento começa antes do softStartTime. Essa propriedade é obrigatória ao usar softStartTime. Consulte o conceito-chave Modelo de custo para saber mais sobre como implementar custos.
costPerHourAfterSoftEndTime número O custo por hora incorrido quando um evento termina após o softEndTime. Essa propriedade é obrigatória ao usar softEndTime. Consulte o conceito-chave 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 tipo de mensagem TimeWindow:

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