Искусство упаковки рюкзака

camping_gear-1320x742

Любая перевозка начинается с упаковки того, что мы хотим везти, в то, на чем мы собираемся ехать. Хорошо упаковать — это значит максимально заполнить полезным грузом ограниченный объем. Но идеальной упаковке всегда что-то мешает: то грузы не совмещаются, то окна не совпадают, то по времени везде не успеть… Получается, что при относительно малых объемах грузов и при наличии более строгих ограничений, проблема утилизация транспорта отходит на второй план. Но сегодня мы обратимся к случаю, когда именно грамотный выбор подвижного состава и правильная укладка являются главным фактором оптимизации.

Вот и классическая научная постановка подсказывает нам, что Задача маршрутизации транспорта (Vehicle Routing Problems, VRP) представляет собой пересечение двух изолированных задач:

  • Задача коммивояжера (Traveling Salesman Problem, TSP), где нужно обойти все заданные точки кратчайшим путем без ограничений по вместимости транспортного средства.
  • Задача об упаковке рюкзака (Bin Packing Problem, BPP), где нужно упаковать разнородные по весу и ценности грузы в ограниченный по вместимости рюкзак.

При чем обе эти задачи предполагают «мульти»-вариант постановки, то есть в общем виде маршрутов с кратчайшим путем у каждого будет более одного и доступных транспортных средств тоже несколько и они могут быть разной вместимости.

Итак, упаковка в контексте задачи маршрутизации — это объединение грузов для совместной перевозки. При чем ОТМ здесь оперирует именно грузовыми местами, а не заказами в целом. Это означает, что для более оптимальной загрузки ОТМ может разбить один заказ кратно грузовым местам по нескольким разным машинам, если это даст выигрыш в утилизации. Утилизация подвижного состава рассчитывается по двум измерениям: по весу и объему грузовых мест. В общем виде ОТМ стремится использовать максимально большие машины из доступных и максимально их утилизировать, чтобы сократить общее количество рейсов. Конечная цель оптимизации — это минимальная стоимость перевозки единицы груза при условии соблюдения всех других неденежных ограничений.

Для того, чтобы точно рассчитать утилизацию машин нужна детальная информация о грузе. В идеале нужны точные вес, объем и размеры по каждому месту. Это может стать большой проблемой при условии, что обычно у нас на входе заказы, из строк которых можно узнать только номенклатуру и количество. Но есть хорошая новость: ОТМ поддерживает вложенную упаковку и автоматический расчет грузовых мест. В ОТМ могут задаваться параметры первичной и вторичной упаковки для каждой номенклатурной позиции. Есть возможность вести варианты укладки товара на паллету в виде количества слоев и количества коробов в слое, а также есть функция формирования смешанных паллет. Это все может показаться лишним и даже может вызвать возмущение тех, кто давно выстрадал все нюансы упаковки в WMS, а им тут предлагают упрощенную версию того же самого. Но не спешите критиковать, ведь в данном случае ОТМ претендует только на примерный расчет грузовых мест, достаточный для заказа транспорта. После фактической сборки складом информацию о местах в ОТМ можно обновить и проверить загрузку машин еще раз. При должной настройке отклонений в духе «плюс минус машина» быть не должно.

Предположим, что о грузах все известно, и можно, наконец, заняться укладкой в машины. Мы будем разбирать ситуацию, когда доступны машины побольше и поменьше. Напомню, что цель оптимизации — это минимальная общая стоимость решения, поэтому в нашу модель еще нужно ввести понятие тарифа за перевозку для каждого типа машины. Тут, конечно, есть варианты. Если машины собственные, то тариф будет скорее всего приведен к километру пробега и стоимость для бОльшей машины будет больше за счет бОльшего расхода топлива. Если машины наемные, то может быть фиксированный тариф за день/за рейс независимо от пробега. В обоих случаях чем больше будет загрузка, тем меньше расходов ляжет на каждую единицу груза в каждой машине.

А теперь эксперименты!

Чтобы исключить влияние маршрута на утилизацию, то есть свести все к задаче упаковки рюкзака, мы возьмем один заказ с большим количеством одинаковых грузовых мест, которые полностью ни в одну из доступных машин не входят. При различных тарифах посмотрим какие машины выберет ОТМ и как распределит по ним эти грузовые места. Утилизацию будем рассматривать только по весу.


Исходные данные: Заказ на перевозку 11 тонн, с грузовыми местами по 100 кг. Два типа машин грузоподъемностью 10 тонн и 4 тонны в неограниченном количестве.


Пример №1. Тарифы за рейс: машина 10т — 10 000 руб.; машина 4т — 4 000 руб.

С приоритетом на пробег возможно решение из двух рейсов, а с приоритетом на стоимости ОТМ выбирает решение из трех рейсов с более низкой общей стоимостью и бОльшей утилизацией машин.

Количество рейсов 2 3
Типы машин 10т + 4т 4т + 4т + 4т
Общая стоимость 14 000 руб. 12 000 руб.
Общий пробег 13,7 км 20,5 км
Средняя утилизация 78% 92%
Утилизация по машинам 100 / 25 100 / 100 / 75

Sh_util_3


Пример №2. Тарифы за рейс: машина 10т — 10 000 руб.; машина 4т — 5 000 руб.

После изменения тарифа для машины 4т общая стоимость по обеим комбинациям машин совпадает и равна 15 000 руб. В этом случае начинает действовать приоритет по пробегу / минимизации количества машин и ОТМ выбирает решение из двух рейсов с меньшим общим пробегом.

Количество рейсов 2 3
Типы машин 10т + 4т 4т + 4т + 4т
Общая стоимость 15 000 руб. 15 000 руб.
Общий пробег 13,7 км 20,5 км
Средняя утилизация 78% 92%
Утилизация по машинам 100 / 25 100 / 100 / 75

Sh_util_2

Более сложную картину можно увидеть при загрузке машин разнородными грузами: легкими/объемными и тяжелыми/компактными. Например, овсяные хлопья в коробках и сахар в мешках. В этом случае важна оптимизация загрузки по весу и по объему именно в сочетании, что может позволить сократить количество необходимых машин за счет правильной комбинации разных грузов в каждой машине. Но этот интригующий пример, а также тонкости моделирования загрузки машины в 3D я оставлю для следующей статьи.