Стоимость перевозки определяет затраты или штрафы, которые несет транспортное средство в зависимости от перевозимого груза между пунктами приема и выдачи грузов. Вы можете настроить эти затраты в зависимости от расстояния поездки с помощью costPerKilometer , продолжительности поездки с помощью costPerTraveledHour или использовать оба параметра одновременно.
Настройте затраты на загрузку для достижения следующих целей:
- Учитывайте также затраты на топливо, которые увеличиваются с весом груза.
- Избегайте маршрутов с тяжело нагруженными транспортными средствами на большие расстояния.
- Учитывайте износ транспортного средства, вызванный перевозкой тяжелых грузов.
Характеристики
Укажите стоимость загрузки в свойстве loadLimits объекта Vehicle . Как и все другие параметры стоимости, стоимость загрузки использует безразмерные относительные единицы измерения.
Стоимость загрузки можно определить, используя следующие свойства:
| Свойство | Тип | Описание |
|---|---|---|
costPerKilometer | Объект | Содержит объект типа LoadCost для расчета транспортных расходов на основе пройденных километров. |
costPerTraveledHour | Объект | Содержит объект типа LoadCost для расчета транспортных расходов на основе отработанных часов, за исключением времени ожидания, посещений и перерывов. |
LoadCost
Тип сообщения LoadCost определяет транспортные расходы на перевозку конкретного груза. Он позволяет установить пороговое значение нагрузки, а затем указать различные ставки стоимости за единицу груза как ниже, так и выше этого порога.
Объект LoadCost содержит следующие параметры конфигурации:
| Параметр | Тип | Описание |
|---|---|---|
loadThreshold | строка (формат int64) | Уровень нагрузки, при котором изменяется скорость расчета стоимости. Значение по умолчанию — 0 . |
costPerUnitAboveThreshold | Число | Стоимость, применяемая к каждой единице нагрузки, превышающей loadThreshold . Значение по умолчанию — 0 . |
costPerUnitBelowThreshold | Число | Стоимость, применяемая к каждой единице нагрузки, не превышающей или равной пороговому loadThreshold . Значение по умолчанию — 0 . |
Согласование стоимости груза с объемом перевозок.
Затраты на перевозку груза начисляются, когда перевозимый транспортным средством груз соответствует типу loadDemands грузов на его маршруте. Типы грузов представляют собой произвольные строки, такие как вес или объем. Для получения более подробной информации о настройке типов грузов см. раздел «Типы грузов» .
Примеры
В этом разделе рассматриваются три типа примеров:
- Примеры кода , иллюстрирующие структуру затрат на загрузку.
- Пример сценария , демонстрирующий один из способов использования затрат на загрузку для достижения бизнес-цели.
- Пример запроса , включающий значения, установленные в примере сценария.
Примеры кода
В следующем примере показано, как структурировать стоимость перевозки со всеми доступными параметрами конфигурации. В этом примере используется costPerKilometer , но вы можете заменить его на costPerTraveledHour чтобы рассчитывать затраты на основе продолжительности поездки, а не расстояния.
{
"model": {
"vehicles": [{
"loadLimits": {
"LOAD_TYPE": {
"maxLoad": "MAX_LOAD",
"costPerKilometer": {
"loadThreshold": "LOAD_THRESHOLD",
"costPerUnitAboveThreshold": COST_ABOVE,
"costPerUnitBelowThreshold": COST_BELOW
}
}
}
}]
}
}
Пример сценария
В этом разделе описывается сценарий, в котором необходимо оптимизировать расход топлива, при этом количество потребляемого топлива пропорционально расстоянию и весу груза. Поскольку транспортные средства потребляют больше топлива при перевозке более тяжелых грузов, следует планировать маршруты, которые в первую очередь доставляют более тяжелые грузы.
Чтобы настроить такое поведение, вы можете сконфигурировать запрос таким образом, чтобы он накладывал штрафы на транспортные средства, перевозящие тяжелые грузы на большие расстояния. В этом примере используйте следующие значения свойств в вашем запросе:
| Родитель | Свойство | Тип | Ценить | Сценарий |
|---|---|---|---|---|
loadLimits | тип нагрузки | нить | weightKg | Определяет тип отслеживаемой грузоподъемности. В этом примере для обозначения веса груза в килограммах используется weightKg . |
loadLimits | maxLoad | нить | 100 | Максимальная грузоподъемность транспортного средства. |
costPerKilometer | loadThreshold | нить | 15 | Устанавливает базовый пороговый уровень загрузки. При весе груза свыше 15 кг начисляется штраф за расход топлива, рассчитываемый исходя из нагрузки. |
costPerKilometer | costPerUnitAboveThreshold | число | 1 | Выступает в качестве коэффициента стоимости топлива. За каждый пройденный километр каждый килограмм груза, превышающий порог в 15 кг, влечет за собой 1 единицу стоимости. |
loadDemands | amount | нить | Партия 1: 50Отправка 2: 10Отправка 3: 80 | Указывает вес груза для каждой из ваших трех отправок. |
В этом сценарии заданные вами значения будут иметь следующие последствия:
- Оптимизатор маршрутов располагает грузы таким образом, чтобы сначала доставлять самые тяжелые посылки. Он планирует доставку грузов весом 80 кг и 50 кг в начале маршрута, чтобы минимизировать пройденное расстояние при большой загрузке.
- Оптимизатор располагает ваши маршруты таким образом, чтобы минимизировать расстояние, пройденное с тяжелым грузом. Чтобы увидеть, как эти настройки влияют на ваши маршруты, вы можете увеличить значение
costPerUnitAboveThresholdс1до5Увеличивая штраф за вес, вы заставляете оптимизатор работать еще интенсивнее, чтобы минимизировать расстояние, пройденное с более тяжелым грузом, что может изменить последовательность выгрузки или распределить грузы между несколькими транспортными средствами.
Пример запроса
В следующем примере показана структура базового запроса optimizeTours , включающего значения стоимости загрузки из примера сценария:
{ "model": { "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": "50" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "penaltyCost": 30.0, "loadDemands": { "weightKg": { "amount": "10" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": "80" } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": "100", "costPerKilometer": { "loadThreshold": "15", "costPerUnitAboveThreshold": 1 } } } } ] } }
Формулы для расчета
Оптимизатор рассчитывает стоимость загрузки, используя следующие формулы.
Полный расчет порогового значения
Если вы укажете значения costPerUnitAboveThreshold и costPerUnitBelowThreshold , то для сумм загрузки, превышающих и не превышающих loadThreshold , будут рассчитываться отдельные транспортные расходы. Формула выглядит следующим образом:
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
+ min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold
Например, используя значения из примера запроса , где значение costPerUnitBelowThreshold равно 2 , если транспортное средство проезжает 10 километров с грузом 50, расчет будет следующим:
max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units
Расчет выше порогового значения
Если указать только costPerUnitAboveThreshold , то расчет будет частным случаем полной формулы порогового значения. Поскольку стоимость ниже порога равна нулю, вторая половина полной формулы также равна нулю. Формула выглядит следующим образом:
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
Например, используя значения из примера запроса , где loadThreshold равно 15 , а costPerUnitAboveThreshold равно 1 , если транспортное средство проезжает 10 километров с грузом 50, расчет будет следующим:
max(50 - 15, 0) * 10 * 1 = 350 cost units
Расчет ниже порогового значения
Симметрично, если указать только costPerUnitBelowThreshold , расчет будет еще одним частным случаем полной формулы порогового значения, где стоимость выше порога равна нулю. Формула выглядит следующим образом:
cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold