Когда люди с трудом выиграли соревнование с алгоритмом — оптимальный раскрой листа металла

hynnfnd60eth8hfy3bm62teiaxa.png

Берём 6 рулонов металла с предыдущего передела, разматываем в печи отжига, получаем стендовую партию из 6 рулонов электротехнической стали с почти одинаковой структурой. Нужно обрезать их до товарных рулонов.

Правила игры такие:

  • На металле появляются дефекты, чаще всего по краям, но и в середине попадаются тоже. Их в рулон пускать нельзя.
  • Дефекты нужно вырезать, но на один итоговый рулон допускается не больше трёх швов.
  • Итоговые рулоны могут быть разной ширины, но не меньше определённой длины.


То есть мы можем обрезать сталь по краям, если дефект попался у кромки, и получить тонкий рулон без изъянов. Или вырезать участок с дефектом и получить широкий рулон, но со швами.

Задача — оптимально разложить заказанные рулоны примерно по 3,5 тонны в стендовой партии из рулонов по 9 тонн длиной 4,5–5 километров. Перевалка станины на разную ширину стоит денег, и часто это дороже, чем вернуть 200–300 метров стали назад в переплавку.

То есть задача сводится к тому, чтобы за минимум шагов получить максимум полезного металла. Мы называли это «Каждый сам себе Пикассо», потому что каждый мастер резал в соответствии со своей личной и сугубо субъективной картиной мира. Нам казалось, что до оптимизации там ой, как далеко.

В обычной истории мы бы полгода «бодались», потом придумали бы интеграцию и робот стал бы говорить «человекам», как раскраивать. Но тут всё пошло несколько иначе и началось странное.
8kxevmpsdvzkgg4yvb9lrgiutui.png

Как происходил процесс исторически


Человек стоит и ВНИМАТЕЛЬНО смотрит на выезжающий из печи рулон. В руках у него бумага, на которой он записывает те дефекты, которые видит. Задача — построить карту дефектов по рулону, чтобы потом можно было выложить её перед мастером-резчиком.

Дефекты бывают вот такие:

akilfkuttsfiigmlvllozg_czuu.png
Развод по кромке (несмываемый след термостойкого покрытия), если он недалеко от края, то можно просто уменьшить ширину полосы, а обрезанную с края ленту с дефектами пустить в переплавку. Такой дефект чаще всего повторяется несколько раз на протяжении сотни метров.

xvlunj9ubiapqesd29er9g71zh8.png
Разовый дефект. Если такой будет доходить до середины, то придётся вырезать кусок металла. Здесь он локализован по краю, то есть можно обойтись и обрезкой с уменьшением ширины листа.

216_uvfljcpwetg0umegobb27ca.png
Разовый дефект: его можно вырезать поперечно или обрезать по краю

nafucod8xnrz32yproccotmcduo.png
А вот это неприятная штука, дефект ближе к центру рулона, причём, судя по характеру, не разовый. Такая борозда может попортить метров 50 рулона спокойно, и по краю тут не обрезать, скорее всего, все 50 метров уедут в переплавку.

Получается нечто вот такое:

l1uf-a7mnskriazrlbg7xpdu5f4.png

Это уже интерфейс нашего софта для резки металла, но на бумаге 50 лет назад чертилось нечто подобное. На этой схеме видно, что поперечные дефекты вырезаются, кромочные дефекты отмечаются и объединяются в кластеры. Как видите, у нас слева есть возможность делать самый широкий лист, дальше кромочный дефект растёт, затем есть участок с дефектом с двух сторон сразу (там лист придётся делать узким) и т.п.

Мастера смотрят заказ и решают, как расположить нужное на листе.

Дальше режут это в реальном мире.

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

«Давайте попробуем» — немного наивно сказали мы и пошли внедрять математику на производство.

93umvdoz37yjezeg4dvv8sug-ae.png

Задача


Первое, что нам нужно, — это составить правильную карту дефектов. Человека, который смотрит на металл, уже давно нет. На его месте камера глубины, то есть устройство, которое проецирует лазерную полоску на проезжающий металл.

ycyoomt9b9dxv8i14itfixaucom.png

Если полоска строго прямая, значит и металл строго прямой. Если полоска с геометрическими искажениями, значит и металл тоже с геометрическими искажениями. Вот как это видно:

mvowdura1_in9etviwfehvsqy7s.png
Также каждый дефект фотографируется, примеры таких фото вы видели выше

Первая проблема была с этой самой машиной. Дело в том, что она при фотографировании дефекта пытается понять, что это, на эвристиках, которые поставлялись by design в эпоху 386DX. Шучу, конечно, но нейросетей тогда не было, там довольно простое дерево решений. В итоге машина часто путает дефекты и выдаёт точность около 87%. Этого недостаточно. То есть часть дефектов просто скрывается от машины, а часть ложноположительные, то есть она предлагает резать не очень точно. АСККП могла принять за дефект любую соринку или тень, случайно оказавшуюся на полосе.

Собственно, именно в этом месте были проблемы со внедрением: алгоритм не поможет, если нельзя принять творческое решение во время резки. А оно, увы, было нужно.

Сейчас мы вытаскиваем из машины сырые фотографии, делаем переклассификацию нейросетью и получаем более высокую точность картографирования. Сзади модель на Питоне, железо — пара GPU-серверов. Точность старой модели на агрегате выпрямляющего отжига была 80–87% в зависимости от партии, после наших апдейтов —90–95%.

На 1 рулон около 100 тысяч изображений дефектов, это около 30 минут. Забрать картинки, определить дефект (расположение и классификацию, объединить, нанести на карту) — получается 3 часа на стендовую партию. Это была довольно долгая часть, но к лету мы выкатили релиз, удобный для резчиков.

На этом они нам сказали спасибо, потому что рассчитывать вручную стало действительно удобно: карте машины стало можно доверять.

Мы же пошли делать следующий шаг.

Если вы обратите внимание, многие дефекты лежат рядом друг с другом. На карте дефектов их удобнее объединять, чтобы обрабатывать дефекты сразу кластерами. Например, два поперечных дефекта с разницей 10 метров листа — это совершенно точно один большой, а не два разных. Условно, есть некоторые пороги, вроде того, что мы считаем, что 100 метров для самых неприятных поперечных дефектов — предельный разнос для кластеризации и т.п.

После этого мы получаем ту самую карту, и по ней уже решаем оптимизационную задачу:

  • Нужно получить заказ — из стендовой партии сделать готовую к отгрузке электротехническую сталь в рулонах. Есть параметры этих рулонов. Как правило, сначала обрабатывается самый широкий рулон (выбираются все годные для него участки), затем всё более и более узкие.
  • При резке стали перевалка станины (изменение ширины реза) означает затраты. Соответственно, один из оптимизационных параметров — так распределить 6 рулонов стендовой партии по порядку, чтобы можно было максимально долго использовать одну и ту же станину. Наша граница — максимум 4 перевалки станины за стендовую партию. И минимизация перевалки рулонов (это тоже имеет цену).
  • Далее определяется количество швов на рулон: чем их меньше, тем лучше.


Итоговая задача может не иметь решения (дефекты или входные условия по количеству швов не позволяют собрать рулоны оптимально), и тогда оператор может переиграть заказ, сдвинув что-то из него на другую стендовую партию и взяв что-то из следующего заказа в эту партию. Но чаще всего решение находится, вопрос лишь в том, сколько металла резчик пустит в переплавку (для нас это потери). Наша цель — не больше 75 килограммов на тонну.

wpracoqgd41l0uradhkufl9iqvo.png

Вот так это выглядит в интерфейсе:

5nof5ehn3vi14dgrqegzxzoz_fc.png

Здесь, как видите, уже понятно, какие куски куда идут и как их распределять:

nyqzly5yd6unolwlmbqmpeuqhhw.png

Сталь приходит шириной 1040 мм, обрезается по краям и получается лист от 1010 до 960 мм.

Обрезать по краям приходится в любом случае, так как это предусмотрено технологией (технологическая обрезь).

Собственно, сама борьба идёт за расходный коэффициент. Мы после внедрения очень радовались, что снизили расходный коэффициент на 4%, то есть сэкономили больше 10 миллионов рублей за год точно (но сверху вниз и снизу вверх ещё не считали, это примерная оценка).

А потом мы остановили ту часть ИТ, которая считала раскрой.

Как люди победили машину


Внедрения на производстве вообще-то почти всегда встречают сопротивление рабочих на местах. Они не понимают ИТ-решения, не любят их и считают, что сами сделают лучше. Конечно, есть ситуации, когда рабочие сами просят ИТ-решение (у нас такое было несколько раз с особо опасными операциями, где лишний контроль буквально может спасти чью-то жизнь), где-то понимают ассистирующие механики, которые не мешают делать работу, но что-то подсказывают. Вот пример с вычерпыванием «ложкой» ковша стали.

Здесь программа покусилась на самое святое в работе резчика — его тридцатилетний опыт, позволяющий делать то, что не могут простые смертные.

Мастера решили доказать бездушной машине, что она ещё сосунок.

Люди стали реально соревноваться с моделью.

Расходный коэффициент у людей после внедрения резко уменьшился. Они поняли смысл задачи и начали последовательно улучшать свои показатели. Важно понимать, что у людей результаты стали получаться лучше на отдельных рулонах, но не на всей стендовой партии. Когда режется стендовая партия из 6 материнских рулонов, то там очень много комбинаций размеров станин, сварных швов, ширины подрезки по краям — и здесь уже точно быстрее справится только модель. Мы, конечно, были очень удивлены, потому что модель демонстрирует математическое совершенство, а люди на такое в теории не очень-то способны.

Был риск, что люди начнут заматывать дефекты в рулоны, чтобы показать лучший расходный коэффициент, мы этого опасались. Но оказалось, что мастера решили обыграть машину по своим правилам. Во-первых, они лучше разбирались с дефектами и могли классифицировать их лучше автоматического комплекса. Существенного выигрыша это не дало, но они поняли, что в чём-то превосходят софт. Второй аспект — машина не знает про какие-то оставшиеся «сэкономленные» куски металла с прошлых стендовых партий (незавершённое производство), возможность распределять заказ между партиями и другие лайфхаки людей с инженерным опытом, серьёзно поспоривших с воплощением Терминатора.

4 месяца 50% стендовых партий мы резали по алгоритму, 50% — по мастерам. Иногда бывали и «перевесы» в логике 70% на 30% в пользу модели, иногда бывало и наоборот. На партиях с небольшим количеством дефектов с точки зрения расхода металла они шли с машиной примерно на равных, но по скорости модель, безусловно, опережала человека — вычисляла гораздо быстрее человека. А вот там, где приходилось справляться с нестандартными историями, софт показывал себя хуже, так как «Терминатор» не всегда знает о всех внешних факторах. Так люди и стали работать рука об руку с искусственным интеллектом, не вступая в «конфликт», а наоборот используя его как некий автопилот, помощник для повышения эффективности в работе.

Итог — у нас 5 агрегатов резки и, соответственно, 5 старших резчиков — каждый порежет металл по-разному, в зависимости от опыта, уровня компетенций и даже настроения. Но всегда спросит у «старшего брата», имею в виду модель ИИ, правильно ли его решение по порезке стендовой партии и максимально эффективно ли оно. На всех агрегатах увеличился выход 1 сорта трансформаторной стали, снизился износ ножей, и экономия выросла до дополнительных 4,5 килограмма трансформаторной стали на тонну.

© Habrahabr.ru