A API Route Optimization retorna rotas para veículos na solicitação correspondente. As remessas são atribuídas a veículos ou podem ser ignoradas, dependendo das propriedades da solicitação.
Uma mensagem OptimizeToursResponse (REST, gRPC) tem duas propriedades principais de nível superior:
routes[]são os trajetos de cada veículo com as entregas atribuídas. CadaRoutecontém métricas que refletem propriedades desse trajeto individual.metricssão métricas agregadas para toda a resposta, em todos os veículos e planos de rotas. As métricas de nível superior contêm as mesmas propriedades das métricas por rota, com valores agregados em todas as rotas.
Algumas propriedades nem sempre são preenchidas, dependendo dos resultados da otimização:
skippedShipments[]lista as remessas que não são realizadas por nenhum veículo. Uma remessa pode ser ignorada se não puder ser realizada dentro das restrições especificadas ou se o custo para realizá-la exceder o custo de penalidade. Por exemplo, se a retirada ou entrega de uma remessa tiver umtimeWindowmuito estreito, talvez não seja possível ou econômico para um veículo realizar a visita durante o período necessário.validationErrors[]especifica erros que invalidam ou impossibilitam a resolução da solicitação quando osolvingModedela está definido comoVALIDATE_ONLY. No modoDEFAULT_SOLVEnormal, os erros de validação aparecem em uma mensagem de erro em vez do corpo da resposta. O modo de resoluçãoVALIDATE_ONLYpode informar vários erros de uma só vez, o que é útil para depurar solicitações rapidamente.
Propriedades da rota
Cada entrada routes[] é uma mensagem ShipmentRoute (REST, gRPC). Cada
ShipmentRoute representa a atribuição de trajeto para um veículo específico da
solicitação. As propriedades importantes de ShipmentRoute relacionadas ao Vehicle correspondente incluem:
vehicleIndexé o índice baseado em zero doVehiclena mensagem de solicitação correspondente. As respostas REST omitem essa propriedade quando o valor é zero.vehicleStartTimeé o horário em que o veículo precisa começar o trajeto.vehicleEndTimeé o horário previsto para o veículo concluir o trajeto.
Em uma resposta, routes vai aparecer assim:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Cada ShipmentRoute inclui uma lista ordenada de visits que o veículo vai concluir. Cada Visit (REST, gRPC) representa um VisitRequest
(REST, gRPC) da solicitação correspondente. As propriedades importantes de Visit
incluem:
shipmentIndexé o índice com base zero da remessa a que esta visita pertence na solicitação correspondente.isPickupé verdadeiro quando uma visita é uma retirada e falso quando é uma entrega. As respostas REST omitem essa propriedade quando o valor é "false".visitRequestIndexé o índice com base em zero doVisitRequestdeShipment.pickupsouShipment.deliveriesna solicitação correspondente que oVisitrepresenta. As respostas REST omitem essa propriedade quando o valor é zero.startTimeé o horário previsto para o início da visita.loadDemandsmapeia o tipo de carga para a quantidade de carga necessária para concluir oVisit. Os valores de carga são negativos para visitas de entrega, representando a carga que está sendo removida do veículo.
Um exemplo de Visit:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
Cada ShipmentRoute inclui uma lista ordenada de transitions que representam
viagens entre visits para um determinado veículo. As propriedades importantes da mensagem Transition (REST, gRPC) incluem:
startTimeé o horário em que o veículo vai começar a realizar a transição.travelDurationé a duração que o veículo precisa percorrer para concluir a transição.travelDistanceMetersé a distância em metros que o veículo precisa percorrer para concluir a transição.trafficInfoUnavailableindica se os dados de trânsito estão disponíveis para a transição.waitDurationrepresenta o tempo de inatividade que o veículo passa esperando antes de poder iniciar a próximaVisit. Isso pode acontecer devido àstart_timedos seguintesVisit.totalDurationé a duração total da transição, incluindo tempos de viagem, espera, pausa e atraso.vehicleLoadsmapeia o tipo de carga para a quantidade transportada pelo veículo durante essa transição.
Um exemplo de Transition:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Para mais informações sobre a relação entre vists e transitions, consulte Otimização da ordem de paradas de coleta e entrega e a documentação de referência ShipmentRoute (REST, gRPC). Para mais informações sobre as propriedades routePolyline e routeToken de uma mensagem Transition, consulte Polilinhas de transição e tokens de rota.
Propriedades de métricas
A mensagem Metrics (REST, gRPC) resume toda a solução.
Algumas propriedades importantes do Metrics incluem:
totalCosté o custo total incorrido na conclusão dos trajetos. Leia mais sobre custos em Parâmetros do modelo de custo.usedVehicleCounté o número total de veículos usados na solução. Os veículos podem ter rotas vazias quando o otimizador determina que o uso deles é desnecessário.skippedMandatoryShipmentCounté o número de envios ignorados que são "obrigatórios". Um envio obrigatório não especifica umpenaltyCostque é incorridos se o envio for ignorado. Os envios obrigatórios ainda podem ser ignorados se a performance não for viável de acordo com as restrições especificadas. Leia mais sobre custos em Parâmetros do modelo de custo.
As métricas adicionais são informadas como mensagens AggregatedMetrics (REST,
gRPC). O tipo de mensagem AggregatedMetrics é usado para a propriedade Metrics.aggregatedRouteMetrics e para a propriedade ShipmentRoute.metrics. Metrics.aggregatedRouteMetrics contém métricas agregadas em todos os ShipmentRoutes no OptimizeToursResponse. Cada propriedade ShipmentRoute.metrics contém métricas para esse ShipmentRoute específico.
As propriedades importantes de AggregatedMetrics incluem:
performedShipmentCounté o número de entregas realizadas por veículos em todo o trajeto.travelDurationé o tempo total que os veículos passam em trânsito enquanto concluem as rotas.waitDurationé o tempo total que os veículos passam esperando enquanto completam os trajetos.delayDurationé o tempo total de atraso dos veículos. Normalmente, é zero, a menos queTransitionAttributessejam usados na solicitação.breakDurationé o tempo total que os veículos passam em pausas enquanto concluem as rotas.visitDurationé o tempo total que os veículos passam realizando visitas enquanto concluem as rotas. Essa é a soma de todos os valores deVisitRequest.durationparaVisitRequests correspondentes aVisits atribuídos ao veículo aplicável.totalDurationé a duração total necessária para concluir as rotas dos veículos.travelDistanceMetersé a distância total percorrida pelos veículos ao concluir as rotas.maxLoadsmapeia os tipos de carga para o valor máximo de carga transportado pelos veículos em qualquer ponto das rotas.
Exemplo de mensagem Metrics:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
Exemplo completo
Confira um exemplo de resposta completa para a solicitação de Criar uma solicitação:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}