A mensagem OptimizeToursRequest
(REST, gRPC) contém várias
propriedades relacionadas a
custos. Juntos, esses parâmetros de custo 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
Vehicle
mais rápidas em vez de rotas mais curtas ou vice-versa - Decidir se o custo de entrega de um
Shipment
vale o valor da conclusão doShipment
- Fazer coletas 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 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 o tempo de transporte, espera, visita e pausa.Vehicle.cost_per_kilometer
: representa o custo por quilômetro percorrido pelo veículo.Vehicle.cost_per_traveled_hour
: representa o custo de operar um veículo somente durante o trânsito, excluindo os tempos de espera, visita e pausa.
Esses parâmetros de custo permitem que o otimizador faça compensações entre tempo e distância percorrida. Os custos incorridos pela 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. Nesse exemplo, a rota mais rápida é a mais curta, então as mudanças nos parâmetros de custo têm pouco efeito.
Propriedades de custo Shipment
A mensagem Shipment
(REST, gRPC) também tem vários parâmetros de custo:
Shipment.penalty_cost
representa o custo incorrido ao pular o envio.Shipment.VisitRequest.cost
representa o custo de uma retirada ou entrega específica, usado principalmente para permitir trocas de custo entre várias opções de retirada ou entrega para um único envio.
Os parâmetros de custo Shipment
usam as mesmas unidades adimensionais dos parâmetros de custo
Vehicle
. Se o custo incorrido de um Shipment
exceder o custo da multa, o
Shipment
não será incluído em nenhuma rota de Vehicle
e, em vez disso, vai aparecer na
lista skipped_shipments
na mensagem de resposta.
Propriedades de custo ShipmentModel
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 ShipmentRoute
s. Aumentar
globalDurationCostPerHour
prioriza a conclusão mais rápida de todos os envios.
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 ShipmentRoute
s.
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 as propriedades routeCosts
e routeTotalCosts
, que representam os custos para essa rota específica.
Confira uma resposta ao exemplo de solicitação 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 } } }
No exemplo de resposta, 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 remessas foram
ignoradas.
Neste exemplo, apenas model.shipments[1]
na solicitação de exemplo é ignorada.
model.shipments[1]
tem um custo de penalidade de 5 unidades, que corresponde à chave
model.shipments.penalty_cost
total na resposta de exemplo. O baixo
penaltyCost
do envio em comparação com o costPerHour
de 40,0 e o costPerKilometer
de 10,0
do Vehicle
tornam mais econômico pular o envio do que
concluí-lo.
Tópico avançado: custos e restrições flexíveis
Várias propriedades de mensagem OptimizeToursRequest
(REST, gRPC)
representam restrições flexíveis, que são restrições que geram um custo quando
não podem ser atendidas.
Por exemplo, as restrições de LoadLimit
do veículo (REST, gRPC) têm as propriedades softMaxLoad
e costPerUnitAboveSoftMax
. Juntos, eles geram 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 de custo.
Da mesma forma, as restrições TimeWindow
(REST, gRPC) têm propriedades soft_start_time
e soft_end_time
, com cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
correspondentes que são incorridos com base no tempo em que o evento restrito ocorre em relação ao TimeWindow
.
Como todos os parâmetros do modelo de custo, os custos de restrição flexível são expressos nas mesmas unidades adimensionais que outros parâmetros de custo.
As restrições LoadLimit
são abordadas em detalhes em
Limites e demandas de carga. As restrições de TimeWindow
são abordadas em detalhes
em Restrições de horário de retirada e entrega.