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 rotas mais curtas ou vice-versa
Vehicle
- Decidir se o custo de entregar 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 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 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.
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. Não definir o parâmetropenalty_cost
de uma remessa 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.cost
representa 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 sem dimensão dos 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.
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 antecipada de todas as remessas.
Propriedades de custo da resposta da Route Optimization
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 propriedades routeCosts
e routeTotalCosts
que representam os custos desse trajeto específico.
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 } } }
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 à chave total 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 mensagens 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 do veículo LoadLimit
(REST, gRPC) têm 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 do 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 incorridas com base em quando o evento restrito ocorre em relação ao TimeWindow
.
Assim como todos os parâmetros do modelo de custo, os custos de restrição flexível são expressos nas mesmas unidades sem dimensão que outros parâmetros de custo.
As restrições de LoadLimit
são abordadas em detalhes em
Demandas e limites de carga. As restrições de TimeWindow
são abordadas em detalhes em Restrições de janela de tempo de coleta e entrega.