Сообщение 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
представляет собой стоимость пропуска отправки. Если не задать параметрpenalty_cost
отправки, отправка будет обязательной , что означает, что отправка будет пропущена только в том случае, если ее невозможно завершить с учетом указанных ограничений. -
Shipment.VisitRequest.cost
представляет собой стоимость конкретного самовывоза или доставки, используемую в основном для обеспечения компромисса между несколькими вариантами самовывоза или доставки для одной отправки.
Параметры стоимости Shipment
используют те же безразмерные единицы, что и параметры стоимости Vehicle
. Стоимость, понесенная при завершении Shipment
, превышает стоимость штрафа, Shipment
не включается ни в один маршрут Vehicle
и вместо этого отображается в списке skipped_shipments
в ответном сообщении.
Свойства стоимости ShipmentModel
Сообщение ShipmentModel
( REST , gRPC ) включает в себя единственное свойство стоимости, globalDurationCostPerHour
. Эта стоимость взимается на основе общего времени, необходимого для завершения всеми транспортными средствами своих ShipmentRoute
s. Увеличение globalDurationCostPerHour
отдает приоритет более раннему завершению всех поставок.
Свойства стоимости ответа оптимизации маршрута
Сообщение OptimizeToursResponse
( REST , gRPC ) имеет свойства стоимости, которые представляют собой затраты, понесенные в процессе завершения ShipmentRoute
s. Свойства 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
доставки по сравнению с 40,0 costPerHour
и 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
подробно рассматриваются в разделе Ограничения по времени окна вывоза и доставки .