Тугая упаковка, или Бизнес-роман о роботах, алгоритмах и о складе без людей — страница 44 из 53

Я посетил только что построенную систему в Мебейне в июле 2017 г., чтобы посмотреть, как выглядят упаковки мяса и палеты с ними, собранные вручную. Если в Бруксвилле внутри склада стояла духота ужаснее, чем снаружи, то здесь была другая проблема: с палящего солнца на улице работники попадали в зябкий холод склада, где нулевая температура казалась чуть ли не тридцатиградусным морозом.

В Мебейне мы пока собирали только пробные, крошечные палеты. Шло тестирование и доводка оборудования. Зато я увидел ручную сборку палет, очень непростую – из-за качества упаковок и требований по распределению разных категорий по высоте. Многие картонные коробки с расфасованным мясом были полупустые, и на них сверху нельзя было положить достаточный вес. Начав со стеллажей курятины и индейки, работники двигались дальше по другим категориям согласно правилам FDA. Собрать устойчивую палету в таких условиях было намного труднее, чем обычно. Многие коробки приходилось перекладывать по нескольку раз на более подходящие места, какие-то – ставить на бок (чего не предусматривала наша автоматизация). В палетах практически всегда встречались большие дыры, и некоторые коробки оказывались в таком неустойчивом положении, что почти висели. Только плотная, в несколько слоев, обертка стягивающей пленкой спасала палеты от коллапса в процессе передвижения. Для нашей автоматики это стало бы огромной проблемой, даже если бы мы планировали палеты с послойным разделением, формально удовлетворяющим требованиям FDA.

Как обычно, уметь делать палеты со строгим послойным разделением продуктов нужно было «еще вчера». Со всеми проблемами «Кока-Колы», Бруксвилла и Бетлехема моей команде до сих пор совершенно не хватало времени заняться алгоритмом для Мебейна, а теперь это стало приоритетом. Пока роботы еще не начали строить палеты с разными мясными категориями, нужно было тренироваться в планировании палет на стандартной подборке из примерно ста тридцати недавних заказов, причем каждый из них должен был представлять одну палету. Часть из них были совсем маленькие, менее десятка коробок; но были и такие заказы, которые в одну палету вмещались с трудом. Мы строили планы палет согласно текущей версии нашего алгоритма и представляли «Волмарту» результаты. Каждая палета должна была полностью соответствовать требованиям FDA. Какие-то коробки могли не попасть в такую палету при соблюдении этих правил – это называлось drain, остаток, и в нем был практический смысл. После построения основной части палеты на нее ложился слой полиэтиленовой пленки, и поверх него могли укладываться несколько коробок с рыбой и морепродуктами – они не входили в стандартную последовательность слоев. Эта процедура позволяла поместить в палету те коробки, что не удалось уложить с удовлетворением послойных требований: их вручную пришлось бы укладывать поверх пленки. Наши результаты оценивали по тому, сколько коробок попадало в остаток. Если много, автоматическое построение палет не имело смысла: все равно понадобится изрядное количество ручного труда.

В первых версиях, когда мы планировали эти сто тридцать заказов, в остаток уходило почти 40 % коробок. Мы стали думать, какие трюки применять для уменьшения остатков. Нужно было изменять приемы, используемые практически во всех компонентах алгоритма: отбор коробок в слои (сначала попробовать только одну следующую категорию, потом две, в крайнем случае – три), двумерную упаковку стеков – так, чтобы на верхней грани слоя образовалась сплошная поверхность, куда можно укладывать упаковки этой же или следующей категории, – и многое другое.

Я проводил много экспериментов с кодом на Матлабе, и в августе 2017-го мы решили, что перевод матлабовского кода в рабочий займет существенно больше времени, чем у нас было в запасе. Первоначально в качестве рабочего кода мы решили использовать мой матлабовский прототип, скомпилированный в исполняемый код. Это требовало написания непростых интерфейсов и преобразования входных и выходных данных, но Илья и Саша, уже ставшие к этому времени неоспоримыми лидерами команды, отлично справились с этим.

Некоторые палеты, получавшиеся из эталонного пакета заказов, выглядели довольно уродливыми. Но мы неуклонно, с каждым новым спринтом, уменьшали процент остатка. К октябрю 2017 г. остаток составлял всего 5 % и продолжал снижаться. Было ясно, что мы сможем успешно решить эту проблему, как и все предыдущие проблемы с палетизацией.

* * *

К этому времени ситуация в «Симботике» накалилась до предела. Проекты в Бруксвилле и Мебейне буксовали, производительность на двух складах «Кока-Колы» застряла, так и не достигнув запланированной отметки. На подходе были два почти построенных склада для новых заказчиков. Один из них – для «Албертсона», очень крупной американской сети супермаркетов, – находился в дальнем пригороде Феникса, столицы штата Аризона, другой – для сети канадских супермаркетов «Джаент Тайгер» – в пригороде Оттавы. Шли последние месяцы правления Гахагана (о чем мы тогда еще не знали), паранойя и хамство начальства становились все нестерпимее, инженеры и менеджеры продолжали массово покидать «Симботик», и на всех фронтах не хватало людей.


Рис. 10. Планы палет в Мебейне: различными оттенками серого обозначены упаковки разных типов мясной продукции, от курятины (внизу) до говядины (вверху)


Но главным проектом, требовавшим максимума усилий, оставался все-таки Бруксвилл. Каждую неделю совместно с менеджментом «Волмарта» мы вычисляли и обсуждали ключевые рабочие показатели (KPI – Key Performance Indicators). Самую большую проблему представляла пропускная способность системы (throughput), число коробок в час, проходящих через каждую входную и выходную (палетизационную) ячейки. Согласно контракту, мы должны были достичь уровня в 1600 коробок в час на входную ячейку и 1300 коробок в час на ячейку палетизации. К ноябрю 2017 г. у нас в лучшие периоды получалось менее 1100 коробок на входных ячейках и около 800 – на выходных. Показатели медленно ползли вверх, но периодически случался какой-то новый сбой, и они рушились опять.

* * *

С показателями качества палет (за что отвечала моя команда) дело обстояло гораздо лучше. Одним из факторов, ставшим для нас новым вызовом с вводом системы в Бруксвилле, был размер заказов. Если в предыдущих системах из типичных заказов получалось не более 2–3 палет, то у «Волмарта» их могло быть 10–15, а в дальнейшем – и до 20. Фактически объем некоторых заказов должен был заполнять целую фуру стандартного размера, куда обычно вмещалось 24 палеты. Несколько палет в заказах собирали вручную – из объемных упаковок, например бумажных полотенец или одноразовых пеленок, либо из упаковок, чья форма сильно отличалась от кубовидной, – цилиндрические предметы, мешки и т. п. Такие товары располагались на стеллажах ручной сборки, вне нашей автоматизированной системы.

Из-за большого объема типичного заказа для «Волмарта» было важно упаковать его в как можно меньшее число палет, чтобы заказ поместился в фуру. Поэтому главным параметром был средний объем одной палеты. В то же время «Волмарту» были важны и показатели удобства приемки (store-friendliness) – чтобы все коробки одного отдела были в одной палете и сгруппированы вместе.

В число KPI, отслеживаемых каждую неделю, входило три параметра, относящихся к палетизации:

1. Average cube – средний объем товаров в одной палете (планка была установлена в 75 кубических футов).

2. Pallets-per-Department ratio – среднее число палет, содержащих товары данного отдела. Если каждый отдел сгруппирован в одной палете (например, палета № 1 содержит отделы 1, 4, 5, палета № 2 – отделы 2, 6, палета № 3 – отделы 3, 7, 8), то этот показатель равен 1. Если же палета № 1 содержит отделы 1, 3, 4, 5, 7, палета № 2 – отделы 1, 2, 6, 8, а палета № 3 – отделы 2, 3, 4, 5, 6, 7, 8, то этот показатель равен 2, так как товары каждого отдела содержатся ровно в двух палетах. Этот показатель необходимо было минимизировать.

3. Department Adjacency – непрерывная последовательность отделов, чтобы каждая палета содержала часть этой последовательности и товары только одного отдела могли перетекать в следующую палету. Например, этому отвечало такое распределение: палета № 1 содержит отделы 1, 2, 3, палета № 2 – отделы 3, 4, 5, 6, палета № 3 – отделы 6, 7, 8. Если же палета № 1 содержит отделы 1, 2, 3, 4, палета № 2 – отделы 1, 3, 4, 5, 6, палета № 3 – отделы 5, 6, 7, 8, то непрерывная последовательность не соблюдается.

Оптимизировать все три показателя одновременно было невероятно трудно. Если максимизировать объем каждой палеты, приходится разбивать некоторые отделы между двумя палетами, и это ухудшает Pallets-per-Department. Попытка же точно следовать последовательности отделов ведет к разбивке и затрудняет получение максимального объема в каждой палете. Дополнительную сложность представляло то обстоятельство, что некоторые коробки одного отдела могут быть тяжелыми и крепкими и должны оказаться на дне палеты, а другие – легкими и хрупкими и лежать должны в верхней части. В результате в верхних слоях палеты могли оказаться комбинации упаковок из нескольких отделов. Иногда почти невозможно было добиться того, чтобы на следующую палету перетекали упаковки только одного из этих отделов. В следующей палете эти упаковки тоже должны быть наверху. И теперь нужно было уместить их все в этой палете, чтобы в следующую не перетекала ни одна из упаковок.

Первоначально я даже не рассчитывал, что нам удастся удовлетворить всем трем критериям, сохраняя при этом оптимальное распределение веса и прочности коробок в каждой палете.

Но уже к концу 2017 г. по трем показателям палетизации мы совсем чуть-чуть не достигали планок, установленных «Волмартом». Отставали мы по ним намного меньше, чем по другим KPI – производительности, плотности хранения, проценту «пропусков» (scratches) – упаковок, которые система по разным причинам не могла доставить до палетизации в день заказа.