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
eglobalEndTime
são propriedades deShipmentModel
timeWindows
são propriedades de:pickups
emShipment
.deliveries
emShipment
.
startTimeWindows
eendTimeWindows
são propriedades deVehicle
.
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:
- Exemplos de código que ilustram a estrutura das janelas de tempo.
- Um exemplo de cenário que mostra uma maneira de usar períodos para alcançar um objetivo de negócios.
- Um exemplo de solicitação que inclui os valores definidos no cenário de exemplo.
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.
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 osendTimeWindows
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 últimoendTimeWindow
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
eglobalEndTime
porque não usam o tipo de mensagemTimeWindow
. - 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 }