Опция равномерной загрузки
Часто основным приоритетом при планировании маршрутов является получение относительно равномерного распределения заказов по автомобилям или курьерам.
Для равномерной загрузки заказов по какому-либо признаку вы можете использовать группы балансировки balanced_groups
.
Как это работает
Балансировка может осуществляться по одному или нескольким параметрам одновременно:
custom_value
— по сумме значений пользовательских единиц измерения у заказов;hour
— по времени маршрута;km
— по километрам пробега;served_order
— по числу обслуженных заказов;stop
— по количеству остановок;unit
— по количеству мест;weight_kg
— по общему весу заказов, в кг.
Для построения решения применяются только те параметры балансировки, которые были указаны при планировании.
Можно задать несколько групп балансировки загрузки, балансировка работает независимо для каждой группы автомобилей или курьеров, подробнее см. в разделе Группы балансировки. Идентификатор группы балансировки указывается для смены на листе Vehicles в поле shifts.N.balanced_group_id
.
Настройки групп балансировки задаются на листе Options в одной строке по следующему принципу: настройки первой группы балансировки — в полях с индексом balanced_groups.0
, настройки второй группы — в полях balanced_groups.1
, и так далее. Для каждой группы указываются:
-
идентификатор группы
balanced_groups.N.id
. Это обязательный параметр (он же указывается для автомобилей в полеshifts.N.balanced_group_id
); -
размер штрафов за неравномерность маршрутов относительно друг друга (
balanced_groups.N.penalty.hour
,balanced_groups.N.penalty.stop
,balanced_groups.N.penalty.custom_value
,balanced_groups.N.penalty.km
,balanced_groups.N.penalty.served_order
,balanced_groups.N.penalty.unit
,balanced_groups.N.penalty.weight_kg
). Можно настроить балансировку по одному или нескольким параметрам. Обратите внимание, что у этих параметров есть значения по умолчанию; -
параметр
balanced_groups.N.penalty.ignore_unused_vehicles
, который определяет, как балансируется загрузка: при значенииfalse
(по умолчанию) алгоритм распределяет загрузку равномерно между всеми автомобилями в смене, у которых указана данная балансировка. В этом случае в решении может быть задействовано больше автомобилей, чем необходимо. При значенииtrue
автомобили, которые не используются в решении, не учитываются при балансировке загрузки. Это позволяет получить более оптимальное решение.
На начальных запусках задачи планирования рекомендуется не использовать балансировки загрузки. Если возникнет необходимость получить более равномерные маршруты, можно заполнить группы балансировки и использовать значения по умолчанию balanced_groups.N.penalty.hour
= 200, balanced_groups.N.penalty.stop
= 100. Затем можно постепенно менять эти настройки, ориентируясь на получаемый результат.
Примечание
При больших значениях штрафов используйте дооптимизацию последовательности.
Группы балансировки
Желательно балансировать загрузку курьеров, которые изначально находятся в равных условиях. Это может касаться различных параметров задачи: продолжительности и времени смены курьеров, плотности заказов на определенную группу курьеров, грузоподъемности, тегов и т.п. Для курьеров с разными условиями рекомендуется задавать разные группы балансировки. Например:
- Курьеры имеют разную продолжительность смены работы: у части курьеров она равна 8 часам, у другой — 12. Таких курьеров необходимо балансировать отдельно (например по количеству остановок), потому что время маршрута у них изначально будет различаться, и объективно они будут выполнять разное количество заказов.
- Курьеры выходят в утреннюю и вечернюю смену (одинаковой продолжительности) и маршрутизируются в рамках одного запроса. Допустим, что количество заказов утром и вечером неравномерно. Тогда балансировать утренних и вечерних курьеров необходимо либо отдельно, либо только по времени маршрута, потому что среднее количество заказов (и, соответственно, остановок на маршруте) у курьера утром и вечером, вероятно, будет различаться.
- Используются одинаковые автомобили, но есть много заказов в городе и мало заказов в области на разных направлениях. Такую задачу можно балансировать только по времени маршрута, потому что, скорее всего, у автомобилей, которые поедут на дальнее расстояние, получится выполнить меньше заказов.
- Используются автомобили разной грузоподъемности: легковые и грузовые. Обычно они перевозят разные по весу заказы, поэтому необходимо либо задавать разные группы балансировки на разную грузоподъемность, либо балансировать автомобили только по времени маршрута (второй вариант предпочтительнее).
- Курьеры используют разные способы передвижения: одни передвигаются на автомобиле, а другие пешком. В этом случае нужно задавать разные группы балансировки для разных способов передвижения, например по заказам.
Примечание
Использование балансировки, как правило, приводит к получению менее оптимальных маршрутов по общим метрикам решения (по итоговому показателю «Пробег»/«Время маршрута»). При увеличении штрафов за несбалансированность формируется более равномерное решение, которое достигается в ущерб оптимальности маршрутов. Если в группе балансировки только один автомобиль или курьер, балансировка будет работать некорректно — маршруты получатся неравномерными.
Опция равномерной загрузки балансирует маршруты в рамках одного конкретного запуска планирования. Если стоит задача выровнять загрузку на ресурсы в течение продолжительного периода времени (например, в течение месяца), то ее следует реализовывать вне Маршрутизации, через отдельный процесс. В этом процессе курьеры назначаются на маршруты с учетом накопленного значения, относительно которого выполняется балансировка. Например, пусть у курьеров накапливается суммарное время отработки. После планирования маршрутов в данный день курьеру, который имеет минимальное накопленное значение (суммарное время отработки), назначается самый продолжительный маршрут, и наоборот. Таким образом, выравнивание будет происходить не в рамках конкретного дня, а в течение некоторого периода, и при этом в данный конкретный день маршруты могут быть оптимальны, пусть даже и неравномерны.
Пример 1
В задаче 52 заказа и 3 курьера. Решаем задачу без балансировки.
Результат планирования:
Курьер | Количество остановок на маршруте | Пробег, км | Время маршрута |
---|---|---|---|
Курьер 1 | 19 | 50 | 10:49 |
Курьер 2 | 17 | 47,4 | 09:50 |
Курьер 3 | 16 | 35,8 | 09:04 |
Итого | 52 | 133,1 | 29:43 |
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 2
Решаем ту же задачу, что и в примере 1, но со следующими дополнениями:
-
включаем опцию балансировки;
-
задаем одну группу балансировки;
-
используем размер штрафов за несбалансированность маршрутов по умолчанию.
Результат планирования:
Курьер | Количество остановок на маршруте | Пробег, км | Время маршрута |
---|---|---|---|
Курьер 1 | 17 | 54,1 | 09:56 |
Курьер 2 | 17 | 41,9 | 09:48 |
Курьер 3 | 18 | 48,7 | 10:05 |
Итого | 52 | 144,7 | 29:49 |
Маршруты стали более равномерными относительно показателя «Количество остановок на маршруте»/«Время маршрута», но общие метрики решения (итоговый показатель «Пробег»/«Время маршрута») ухудшились относительно примера №1.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 3
Решаем ту же задачу, что и в примере 1, но со следующими дополнениями:
-
включаем опцию балансировки;
-
балансируем маршруты только по времени маршрута;
-
повышаем размер штрафов за несбалансированность маршрутов относительно значения по умолчанию.
Результат планирования:
Курьер | Количество остановок на маршруте | Пробег, км | Время маршрута |
---|---|---|---|
Курьер 1 | 17 | 47,5 | 10:09 |
Курьер 2 | 18 | 50 | 10:09 |
Курьер 3 | 17 | 52,5 | 10:09 |
Итого | 52 | 150 | 30:27 |
Теперь курьеры работают одинаковое количество времени, но общие метрики решения ухудшились еще больше. Это связано с тем, что алгоритм с повышенными штрафами за несбалансированность пытается найти решение, которое будет не столько оптимально, сколько сбалансировано.
Пример Excel ⋅ Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 4.1
Решаем ту же задачу, что и в примере 3, но доставляем только первые 30 заказов. Для этого достаточно двух курьеров, но в задаче указаны три. Параметр balanced_groups.penalty.ignore_unused_vehicles
имеет значение false
(по умолчанию), поэтому загрузка распределяется равномерно между всеми курьерами:
Курьер | Количество остановок на маршруте | Пробег, км | Время маршрута |
---|---|---|---|
Курьер 1 | 10 | 40,5 | 06:49 |
Курьер 2 | 10 | 41,9 | 06:47 |
Курьер 3 | 10 | 43,8 | 06:48 |
Итого | 30 | 126,3 | 20:25 |
Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте
Пример 4.2
То же, что в примере 4.1, но параметр balanced_groups.penalty.ignore_unused_vehicles
равен true
, поэтому при балансировке загрузки неиспользуемые автомобили игнорируются. В решении участвуют только два курьера из трех, загрузка балансируется между ними:
Курьер | Количество остановок на маршруте | Пробег, км | Время маршрута |
---|---|---|---|
Курьер 1 | 15 | 53,2 | 09:11 |
Курьер 3 | 15 | 51,8 | 09:11 |
Итого | 30 | 105 | 18:23 |
Запрос API (JSON) ⋅ Ответ API ⋅ Открыть на карте