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 trajetos
Vehicle
mais rápidos em vez de trajetos mais curtos ou vice-versa - Decidir se o custo de exibição de uma
Shipment
vale o valor da conclusão daShipment
. - Realizar retiradas e entregas dentro de janelas de tempo somente quando isso é econômico
Veja 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 } ] } }
Vehicle
propriedades de custo
A mensagem Vehicle
(REST, gRPC) tem várias propriedades de custo:
Vehicle.cost_per_hour
: representa o custo da operação de um veículo por hora, incluindo os períodos de transporte público, espera, visita e intervalo.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 enquanto está em trânsito, excluindo os períodos de espera, visita e intervalo.
Esses parâmetros de custo permitem que o otimizador faça compensações de tempo em relação à 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 rotas mais curtas. Neste exemplo, o trajeto mais rápido é o mais curto. Portanto, as alterações 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_cost
representa o custo incorrido ao ignorar o envio.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ões que os parâmetros de custo Vehicle
. O custo incorrido quando um Shipment
exceder o custo de penalidade, o
Shipment
não será incluído na rota de nenhum Vehicle
e, em vez disso, aparecerá na
lista de 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 ShipmentRoute
s. Aumentar
globalDurationCostPerHour
prioriza a conclusão antecipada 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 propriedades routeCosts
e routeTotalCosts
que representam os custos desse trajeto específico.
Veja a resposta ao exemplo de solicitação com os 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, as 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 pulados. 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 cinco unidades, o que corresponde ao total de chaves
model.shipments.penalty_cost
na resposta de exemplo. O valor baixo de penaltyCost
do frete em comparação com os 40.0 costPerHour
e 10.0
costPerKilometer
de Vehicle
faz com que seja mais econômico pular o envio do que
concluí-lo.
Tópico avançado: custos e restrições flexíveis
Várias propriedades de mensagens OptimizeToursRequest
(REST, gRPC)
representam restrições flexíveis, que geram custos quando não
podem ser atendidas.
Por exemplo, as restrições LoadLimit
do veículo (REST, gRPC) têm as propriedades softMaxLoad
e costPerUnitAboveSoftMax
. Juntas, elas geram um custo proporcional às unidades de carga que excedem softMaxLoad
, permitindo que o limite seja excedido somente se isso fizer sentido do ponto de vista de custos.
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, incorridas com base na antecedência ou no atraso do evento restrito em relação ao TimeWindow
.
Como acontece com todos os parâmetros do modelo de custo, os custos de restrição flexível são expressos nas mesmas unidades sem dimensões que os 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 da janela de tempo de retirada e entrega.