При производстве пластиковой упаковки, полимерных пленок, профилей или листовых материалов регулярно возникает задача оптимального подбора и резки заготовок. Исходные материалы имеют фиксированные параметры (тип сырья, толщина), которые должны строго совпадать с заказом, а также геометрические размеры (ширину рулона или длину полотна), по которым необходимо выполнить раскрой. Разберем, какие математические алгоритмы лежат в основе этой задачи, как организовать архитектуру вычислений и правильно вести учет сырья и деловых отходов в 1С.
Описанная задача в теории оптимизации классифицируется как одномерная задача раскроя (1D Cutting Stock Problem, CSP) или задача упаковки в контейнеры (Bin Packing Problem). Суть задачи заключается в том, чтобы удовлетворить заданную потребность в отрезках нужной ширины, используя имеющиеся на складе рулоны и минимизируя суммарный неиспользуемый остаток (отход).
Для решения этой задачи применяются два основных класса методов:
First Fit Decreasing (первый подходящий по убыванию) или Best Fit Decreasing (наилучший подходящий). При таком подходе требуемые размеры сортируются по убыванию и последовательно укладываются в доступные остатки так, чтобы минимизировать остающийся зазор. Эти алгоритмы работают практически мгновенно и дают отклонение от абсолютного оптимума всего в несколько процентов.Рассмотрим производственные факторы, которые обязательно нужно учитывать в алгоритме расчета раскроя полимерных и рулонных материалов:
Платформа 1С является средой бизнес-логики и не содержит встроенных математических матричных решателей для задач линейного программирования. Проанализируем возможные варианты архитектуры для реализации функционала:
Разберем базовый пример реализации алгоритма раскроя полос на встроенном языке 1С по принципу заполнения первого подходящего рулона с учетом ширины реза:
// Функция производит жадный расчет раскроя рулона на полосы
Функция РассчитатьРаскройРулона(ШиринаРулона, ТаблицаПотребностей, ШиринаНожа, Кромка) Экспорт
РабочаяШирина = ШиринаРулона - (Кромка * 2);
ТекущийОстаток = РабочаяШирина;
Результат = Новый Структура;
Результат.Вставить("ИспользованныеПолосы", Новый Массив);
Результат.Вставить("ОстатокШирины", 0);
Результат.Вставить("Успешно", Ложь);
// Сортируем таблицу потребностей по убыванию требуемой ширины
ТаблицаПотребностей.Сортировать("ТребуемаяШирина Убыв");
Для Каждого СтрПотребность Из ТаблицаПотребностей Цикл
Если СтрПотребность.Количество <= 0 Тогда
Продолжить;
КонецЕсли;
ШиринаСУчетомНожа = СтрПотребность.ТребуемаяШирина + ШиринаНожа;
Пока ТекущийОстаток >= СтрПотребность.ТребуемаяШирина И СтрПотребность.Количество > 0 Цикл
Результат.ИспользованныеПолосы.Добавить(СтрПотребность.ТребуемаяШирина);
ТекущийОстаток = ТекущийОстаток - ШиринаСУчетомНожа;
СтрПотребность.Количество = СтрПотребность.Количество - 1;
КонецЦикла;
КонецЦикла;
Результат.ОстатокШирины = ?(ТекущийОстаток > 0, ТекущийОстаток, 0);
Результат.Успешно = (Результат.ИспользованныеПолосы.Количество() > 0);
Возврат Результат;
КонецФункции
Для корректной работы алгоритма раскроя в типовых или доработанных конфигурациях 1С необходимо правильно структурировать нормативно-справочную информацию и документооборот: