A mensagem OptimizeToursRequest (REST, gRPC) contém várias propriedades relacionadas a custos. Juntos, esses parâmetros representam o modelo de custo da solicitação. O modelo de custo captura muitos dos objetivos de otimização de alto nível da solicitação, como:
- Priorizar rotas mais rápidas em vez de mais curtas ou vice-versa
Vehicle - Decidir se o custo para entregar um
Shipmentvale o valor da conclusão doShipment - Fazer retiradas e entregas dentro de janelas de tempo apenas quando isso for econômico
Confira um exemplo de solicitação com custos
{ "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 5.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Propriedades de custo do Vehicle
A mensagem Vehicle (REST, gRPC) tem várias propriedades de custo:
Vehicle.cost_per_hour: representa o custo de operação de um veículo por hora, incluindo tempos de trânsito, espera, visita e descanso.Vehicle.cost_per_kilometer: representa o custo por quilômetro percorrido pelo veículo.Vehicle.cost_per_traveled_hour: representa o custo de operação de um veículo apenas durante o trânsito, excluindo tempos de espera, visita e descanso.
Esses parâmetros de custo permitem que o otimizador faça compensações entre tempo e distância percorrida. Os custos da rota otimizada aparecem na mensagem de resposta como metrics.costs:
À medida que costPerHour aumenta, o otimizador tenta encontrar rotas mais rápidas, que podem não ser as mais curtas. Neste exemplo, a rota mais rápida é a mais curta, então as mudanças nos parâmetros de custo têm pouco efeito.
Shipment propriedades de custo
A mensagem Shipment (REST, gRPC) também tem vários parâmetros de custo:
Shipment.penalty_costrepresenta o custo incorrido ao pular o envio. Não definir o parâmetropenalty_costde uma entrega a torna obrigatória, o que significa que ela só será ignorada se não puder ser concluída devido às restrições especificadas.Shipment.VisitRequest.costrepresenta o custo de uma retirada ou entrega específica, usado principalmente para permitir compensações de custo entre várias opções de retirada ou entrega para uma única remessa.
Os parâmetros de custo Shipment usam as mesmas unidades adimensionais que os parâmetros de custo Vehicle. Se o custo incorrido para concluir um Shipment exceder o custo da penalidade, o Shipment não será incluído em nenhuma rota de Vehicle e vai aparecer na lista skipped_shipments na mensagem de resposta.
ShipmentModel propriedades de custo
A mensagem ShipmentModel (REST, gRPC) inclui uma única propriedade de custo, globalDurationCostPerHour. Esse custo é incorrido com base no tempo total necessário para que todos os veículos concluam as ShipmentRoutes. Aumentar globalDurationCostPerHour prioriza a conclusão antecipada de todas as remessas.
Propriedades de custo da resposta da otimização de rotas
A mensagem OptimizeToursResponse (REST, gRPC) tem propriedades de custo que representam os custos incorridos no processo de conclusão de ShipmentRoutes.
As propriedades metrics.costs e metrics.totalCost representam o número de unidades de custo incorridas em todas as rotas na resposta. Cada entrada routes tem propriedades routeCosts e routeTotalCosts que representam os custos da rota específica.
Confira uma resposta à solicitação de exemplo com custos
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:28:22Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "startTime": "2023-01-14T00:08:55Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:21:21Z", "detour": "572s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:05:00Z" }, { "travelDuration": "496s", "travelDistanceMeters": 1893, "waitDuration": "0s", "totalDuration": "496s", "startTime": "2023-01-14T00:13:05Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:25:31Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111 }, "routeTotalCost": 52.441111111111113 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:28:22Z", "totalCost": 57.441111111111113, "costs": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111, "model.shipments.penalty_cost": 5 } } }
Na resposta de exemplo, os metrics.costs de nível superior são:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
O valor model.shipments.penalty_cost representa o custo incorrido devido a
envios ignorados. A propriedade skippedShipments lista quais envios foram
ignorados.
Neste exemplo, apenas model.shipments[1] na solicitação de exemplo é ignorado.
model.shipments[1] tem um custo de penalidade de 5 unidades, que corresponde ao total da chave model.shipments.penalty_cost na resposta de exemplo. O baixo penaltyCost da remessa em comparação com os 40,0 costPerHour e 10,0 costPerKilometer do Vehicle torna mais econômico pular a remessa do que concluí-la.
Tópico avançado: custos e restrições flexíveis
Várias propriedades de mensagem OptimizeToursRequest (REST, gRPC) representam restrições suaves, que são restrições que incorrem em um custo quando não podem ser satisfeitas.
Por exemplo, as restrições do veículo LoadLimit (REST, gRPC) têm propriedades softMaxLoad e costPerUnitAboveSoftMax. Juntos, estes acarretam um custo proporcional às unidades de carga que excedem softMaxLoad, permitindo que o limite seja excedido apenas se isso fizer sentido do ponto de vista do custo.
Da mesma forma, as restrições TimeWindow (REST, gRPC) têm propriedades soft_start_time e soft_end_time, com correspondentes cost_per_hour_before_soft_start_time e cost_per_hour_after_soft_end_time que são incorridas com base em quão cedo ou tarde o evento restrito ocorre em relação ao TimeWindow.
Assim como todos os parâmetros do modelo de custo, os custos das restrições flexíveis são expressos nas mesmas unidades adimensionais que os demais parâmetros de custo.
As restrições LoadLimit são abordadas em detalhes em Demandas e Limites de Carga. As restrições TimeWindow são abordadas em detalhes em Restrições de janela de tempo de coleta e entrega.