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 o contrário - Decidir se o custo de entrega de um
Shipment
vale o valor da conclusão daShipment
- Realizar coletas e entregas em períodos somente 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 } ] } }
Vehicle
propriedade de custo
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 os períodos de transporte público, espera, visita e intervalos.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 apenas em trânsito, excluindo tempos de espera, de visita e de 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 mais curtas. Nesse exemplo, a rota mais rápida é a mais curta, então as alterações nos parâmetros de custo têm pouco efeito.
Shipment
propriedade de custo
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, usada principalmente para permitir compensações de custo entre várias opções de coleta ou entrega de um único envio.
Os parâmetros de custo Shipment
usam as mesmas unidades sem dimensão que os parâmetros de custo Vehicle
. O custo incorrido na conclusão de um Shipment
excede o custo de penalidade. O
Shipment
não está incluído no trajeto de nenhum Vehicle
e aparece na
lista skipped_shipments
na mensagem de resposta.
ShipmentModel
propriedade de custo
A mensagem ShipmentModel
(REST, gRPC) inclui uma única propriedade de custo, globalDurationCostPerHour
. Esse custo é gerado com base no tempo total necessário para que todos os veículos concluam as ShipmentRoute
s. Aumentar globalDurationCostPerHour
prioriza a conclusão anterior 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 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 dessa rota específica.
Veja 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, 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 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
da Vehicle
torna 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 são atendidas.
Por exemplo, as restrições LoadLimit
(REST, gRPC) do veículo têm
as propriedades softMaxLoad
e costPerUnitAboveSoftMax
. Juntos, eles incorrem em 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 do custo.
Da mesma forma, as restrições TimeWindow
(REST, gRPC) têm
propriedades soft_start_time
e soft_end_time
, com propriedades
cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
correspondentes
que são incorridas com base em quanto tempo o evento restrito ocorre em relação a
TimeWindow
.
Assim como em 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 outros parâmetros de custo.
As restrições LoadLimit
são abordadas com detalhes em
Demandas e limites de carga. As restrições TimeWindow
são abordadas em detalhes
em Restrições da janela de tempo de retirada e entrega.