Обработка имеет обычную и управляемую форму, пойдет как на старых решениях типа УПП, так и на новых, имеющих управляемый интерфейс.
Требования к платформе некритичны, тестировалось на 8.3.17, 8.3.18
Дополнительного ПО не требуется
Данная обработка оптимизирует размещение прямоугольников (далее деталей) в несколько (или один) крупный прямоугольник (далее - заготовка) с учетом гильотинного разреза листа. Допускается вращение деталей на 90 градусов для их более компактной укладки. Суть задачи данной обработки: расположить детали в область заготовок наиболее компактным способом так, чтобы максимизировать оставшееся пространство. Заготовок может быть сколь угодно много с разными или одинаковыми размерами. Обработка подбирает заготовки из списка самостоятельно, исходя из заданных деталей, и позволяет решать проблему копящихся остатков начатых и неиспользованных листовых материалов и создает карты кроя материала.
На скринах у нас задача: разложить 14 деталей, имея 15 заготовок разного размера. Какие заготовки выбрать? Как на них разложить детали? Вот те задачи, которые я старался решить.
Представим начальные данные:
и результат:
Алгоритм укладки деталей - метод имитации отжига (simulated annealing), подробнее о методе тут (отличие от классического метода, описанного по ссылке - здесь запоминается лучший результат из рассмотренных и именно он присутствует в печатной форме). В чем смысл данной публикации и преимущество данной обработки перед существующими работами на Инфостарте на момент публикации? Все работы по двумерной оптимизации, которые я нашел, основывались на методике жадного алгоритма, подробнее о методе тут . Процитирую первый вывод:
"Жадный алгоритм весьма быстр, позволяет найти некоторое приемлемое решение за котороткое время, но при этом часто не дает идеального результата."
Собственные опыты по раскладке с применением жадного алгоритма привели к тем же выводам: алгоритм крайне быстр, можно разложить 30+ деталей за секунды, но использование полезной площади мне показалось неоптимальным. Возможно, у некоторых авторов работ под капотом обработок присутствуют дополнительные методы оптимизации, об этом кто-то упоминал. Поэтому писал собственную обработку, основываясь на методе имитации отжига, заодно решая проблему использования деловых остатков. Старался сделать только используя 1с, не подгружая размеры деталей и заготовок из экселя и прочих внешних данных, т.к. для этих целей проще использовать спецификации.
Кому будет полезно данное решение? Всем кто работает с листовыми материалами: нарезка листового пиломатериала, стекла, листового металла и прочее. В настройках вывода на печать есть коэффициент масштаба для вывода крупных или мелких заготовок, например листы нам поставляют размером 2800*2000 мм, вывод на печать с коэффициентом масштаба "1" будет неприлично большим (рекомендуется примерно 0,07).
Подробнее насчет настроек алгоритма. Повышаем температуру при увеличении количества деталей согласно описанию на форме. Если же вам кажется, что алгоритм раскладывает неоптимально или недосчитывает, то поднимаем температуру. Так как алгоритм относится к эвристическим, то не всегда я получал абсолютно оптимальный результат раскладки материала. Поэтому два варианта: запустить алгоритм еще раз, либо, основываясь на результате, уже вручную перерисовать карту раскроя.
Для одновременного расчета разного материала предусмотрена таблица "Марки материала".
Представляет собой таблицу со списком марок. При ее непустом значении можно будет выбрать одну из марок при заполнении таблиц заготовок, деталей или виртуального склада (о нем чуть ниже).
Добавлено хранилище "бесконечных заготовок" - "Виртуальный склад". Предназначен для ввода размера заготовки (заготовок), которые будут использованы в расчетах. Например в таблице заготовок мы указываем деловые остатки материала (их размер и количество), а основной размер заготовок складского материала мы указываем один раз в виртуальном складе.
Для решения проблемы рационального использования деловых остатков предусмотрен флажок «Максимально использовать неполные листы». Суть его проще объяснить на простых примерах.
Пример 1. У нас две детали размером 500*500 и три заготовки размером 510*510, 510*510, 1010*510. Очевидно, что рациональнее будет использована площадь заготовки 1010*510. И при снятом флажке «Максимально использовать неполные листы», раскладка дает именно такой результат.
Результат:
Пример 2. Те же исходные данные, но ставим флажок «Максимально использовать неполные листы», получаем:
Действие алгоритма следующее: будут в приоритетном порядке использоваться заготовки с минимальной площадью в порядке ее возрастания. Потом происходит «утрамбовка» деталей в областях заготовок и выдается результат оптимизации.
Но алгоритм не тяготеет к использованию минимального количества заготовок, его задача максимально использовать имеющуюся полезную площадь, и для наглядности мы переходим к примеру 3.
Пример 3. Почти те же исходные данные, но заменим заготовку 1010*510 на 1100*510. То есть площадь этой заготовки будет больше суммы двух заготовок 510*510 и смотрим на исходные данные и результат:
Результат:
Добавлен вывод на форму результатов расчета. Всего на выходе мы получаем 3 таблицы: используемые заготовки (изначально заготовок может быть много, выводятся только те, которые использовались в расчетах), области занятые деталями и свободные области (это области заготовок, не занятые деталями - возвратные материалы). До этого результат расчета можно было забирать только программно и передавать результаты расчета также программно в документы. Теперь результаты можно сохранить в табличные документы (Excel), отредактировать по своему усмотрению и любой обработкой загрузки данных, коих на просторах интернета множество, загрузить результаты в документы. Подробнее о таблицах:
Используемые заготовки: списываем с остатков, грузим в документы типа "Требование-накладная"
Занятые области (детали): приходуем на остатки как готовую продукцию или полуфабрикат, грузим в "Выпуск продукции". Колонки в таблице "Верх" и "Лево" используются для построения печатной формы документа как координаты областей (т.е. Верх и Лево - это верхний левый угол, от него откладываем высоту - это движение от угла вниз и ширину - это движение от угла вправо). Можно использовать для аналогичных задач. Колонка "Принадлежит заготовке" означает на каком номере заготовки уложена эта деталь. Колонка "Область" - уникальный номер области в пределах расчета, используется как идентификатор области независимо от того к какой таблице принадлежит область. Колонка "Марка" используется для дополнительной группировки областей деталей и заготовок по маркам при расчетах и выводе на печать.
Свободные области (возвратный материал): его нужно разделить на 2 части, первую приходуем на остатки как деловые отходы, вторая - неиспользуемые отходы никак не используется, эта часть уже списана в составе заготовок. Колонки имеют такой же смысл как в описании таблиц деталей.
Сохранение таблиц имеет следующий вид:
Добавлена опция "Экспресс расчет" - тот самый жадный алгоритм, с дополнительной оптимизацией раскладки. Для тех кому скорость важнее, т.к. в общем случае расчет может длиться довольно долго (20 деталей раскладываются где то 2-2,5 минуты). Экспресс разложит за несколько секунд.
Размеры как заготовок так и деталей можно указывать в произвольном порядке. Какая-либо предварительная сортировка не требуется и на конечный результат оптимизации не повлияет.
Напоследок пример из реальной практики использования: в спецификации 22 детали. Используемый материал - лист ЛДСП 2440*1830.
Результат раскладки:
Практический вывод: если в 1 лист можно добавить детали из разных спецификаций, так и нужно делать. Тетрис из 30 деталей будет уложен плотнее, чем по отдельности 3 раза по 10 деталей.
Проверено на следующих конфигурациях и релизах:
- 1С:Комплексная автоматизация 2, релизы 2.5.13.74, 2.4.5.86
Причины купить
Причина использовать оптимизацию раскладки: при снижении обрези на 3%, при расходах на листовой материал около 20-30млн.р. в год, экономия выходит 600-900т.р.