Сообщение OptimizeToursRequest
( REST , gRPC ) содержит ряд свойств, связанных со стоимостью . Вместе эти параметры стоимости представляют модель стоимости запроса. Модель затрат отражает многие цели оптимизации запроса высокого уровня, такие как:
- Приоритет более быстрых маршрутов
Vehicle
над более короткими маршрутами или наоборот - Принятие решения о том, соответствуют ли затраты на доставку
Shipment
стоимостиShipment
завершения. - Выполнение самовывоза и доставки в пределах временных окон только тогда, когда это экономически эффективно.
Посмотреть пример запроса с указанием стоимости
{ "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
Сообщение Vehicle
( REST , gRPC ) имеет несколько свойств стоимости:
-
Vehicle.cost_per_hour
: представляет стоимость эксплуатации транспортного средства в час, включая время в пути, ожидание, посещение и перерыв. -
Vehicle.cost_per_kilometer
: представляет стоимость километра пути, пройденного транспортным средством. -
Vehicle.cost_per_traveled_hour
: представляет стоимость эксплуатации транспортного средства только во время пути, исключая время ожидания, посещения и перерыва.
Эти параметры стоимости позволяют оптимизатору найти компромисс между временем и пройденным расстоянием. Затраты, понесенные оптимизированным маршрутом, отображаются в ответном сообщении как metrics.costs
:
По мере увеличения costPerHour
оптимизатор пытается найти более быстрые маршруты, которые могут не быть самыми короткими . В этом примере самый быстрый маршрут оказывается самым коротким, поэтому изменения в параметрах стоимости малоэффективны.
Свойства стоимости Shipment
Сообщение Shipment
( REST , gRPC ) также имеет несколько параметров стоимости:
-
Shipment.penalty_cost
представляет собой стоимость, понесенную в результате пропуска отгрузки. -
Shipment.VisitRequest.cost
представляет стоимость конкретного получения или доставки, используемую в первую очередь для обеспечения компромисса между несколькими вариантами получения или доставки для одной отправки.
В параметрах стоимости Shipment
используются те же безразмерные единицы, что и в параметрах стоимости Vehicle
. Затраты, понесенные при Shipment
превышают стоимость штрафа, Shipment
не включается ни в один маршрут Vehicle
и вместо этого отображается в списке skipped_shipments
в ответном сообщении.
Свойства стоимости ShipmentModel
Сообщение ShipmentModel
( REST , gRPC ) включает одно свойство стоимости globalDurationCostPerHour
. Эти затраты рассчитываются исходя из общего времени, необходимого всем транспортным средствам для прохождения своих ShipmentRoute
. Увеличение globalDurationCostPerHour
отдает приоритет более раннему завершению всех поставок.
Свойства стоимости ответа на оптимизацию маршрута
Сообщение OptimizeToursResponse
( REST , gRPC ) имеет свойства стоимости, которые представляют затраты, понесенные в процессе выполнения ShipmentRoute
. Свойства metrics.costs
и metrics.totalCost
представляют количество единиц затрат, понесенных по всем маршрутам в ответе. Каждая запись routes
имеет свойства routeCosts
и routeTotalCosts
, которые представляют затраты для этого конкретного маршрута.
Посмотреть ответ на пример запроса со стоимостью
{ "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 } } }
В примере ответа metrics.costs
верхнего уровня:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
Значение model.shipments.penalty_cost
представляет собой затраты, понесенные из-за пропущенных поставок. Свойство skippedShipments
перечисляет, какие поставки были пропущены.
В этом примере пропускается только model.shipments[1]
в примере запроса. model.shipments[1]
имеет штрафную стоимость в 5 единиц, что соответствует общему ключу model.shipments.penalty_cost
в примере ответа. Низкая penaltyCost
доставку по сравнению со costPerHour
40,0 за час и 10,0 costPerKilometer
у Vehicle
делает пропустить доставку более рентабельной, чем завершить ее.
Расширенная тема: затраты и мягкие ограничения
Некоторые свойства сообщения OptimizeToursRequest
( REST , gRPC ) представляют мягкие ограничения , которые представляют собой ограничения, которые влекут за собой затраты, когда они не могут быть удовлетворены.
Например, ограничения LoadLimit
транспортного средства ( REST , gRPC ) имеют свойства softMaxLoad
и costPerUnitAboveSoftMax
. Вместе они влекут за собой затраты, пропорциональные единицам нагрузки, превышающим softMaxLoad
, что позволяет превысить предел только в том случае, если это имеет смысл с точки зрения затрат.
Аналогично, ограничения TimeWindow
( REST , gRPC ) имеют свойства soft_start_time
и soft_end_time
с соответствующими cost_per_hour_before_soft_start_time
и cost_per_hour_after_soft_end_time
, которые возникают в зависимости от того, насколько рано или поздно происходит ограниченное событие по отношению к TimeWindow
.
Как и все параметры модели стоимости, затраты с мягкими ограничениями выражаются в тех же безразмерных единицах, что и другие параметры стоимости.
Ограничения LoadLimit
подробно рассматриваются в разделе «Требования и ограничения нагрузки» . Ограничения TimeWindow
подробно рассматриваются в разделе «Ограничения окон времени получения и доставки» .