Задача оптимизации раскроя (Cutting Stock Problem) является классической задачей комбинаторной оптимизации. В рамках производственного учета 1С она часто сводится к поиску такого способа нарезки сырья, который минимизирует количество отходов при соблюдении потребностей в заготовках. Давайте разберем, как подступиться к этой задаче, избежав ловушек «полного перебора».
Не пытайтесь решить всё одной сложной формулой. Первый шаг — это формирование «библиотеки» возможных вариантов нарезки для каждого имеющегося типоразмера хлыста. Мы должны перебрать комбинации заготовок, которые физически помещаются в длину хлыста.
На этом этапе мы не смотрим на общее количество заказов. Мы просто отвечаем на вопрос: «Если у нас есть хлыст длиной L, какие наборы заготовок {l1, l2, ... ln} мы можем из него получить?». Для каждого такого набора мы вычисляем остаток (отход). Обязательно сохраняйте эти варианты в табличной модели, так как они станут основой для дальнейших расчетов.
Когда у нас есть список всех допустимых схем раскроя, задача превращается в поиск интенсивности использования каждой схемы. Нам нужно решить, сколько раз применить схему №1, №2 и так далее, чтобы полностью покрыть потребность в деталях и минимизировать общую длину отходов.
Рассмотрим применение метода линейного программирования (ЛП). В среде 1С можно использовать решение задачи ЛП через симплекс-метод. Поскольку встроенные функции платформы для СЛАУ (систем линейных алгебраических уравнений) решают иную задачу, для поиска оптимума лучше использовать специализированные алгоритмы.
Важное замечание про целочисленность: Симплекс-метод дает дробный результат (например, «использовать схему 5.4 раза»). Поскольку мы не можем отрезать 0.4 хлыста, необходимо применять методы целочисленного программирования, такие как метод ветвей и границ. Это позволяет «отсекать» невыполнимые варианты и приходить к целому количеству хлыстов.
Если математическая точность требует слишком много времени, а заказы поступают динамически, используйте эвристические подходы. Это даст «достаточно хорошее» решение за миллисекунды.
Приступая к разработке, помните о следующих производственных факторах, которые математика часто упускает:
ШиринуРеза (ширину пропила). Каждый рез отнимает 3-5 мм материала, что при большом количестве заготовок критически влияет на результат.Для реализации вычислений, если объем данных велик, рассмотрите использование внешних библиотек (на Python или C++), которые можно вызывать через COMОбъект или HTTP-сервисы. Написанный на «чистом» языке 1С полный перебор вариантов на больших выборках может значительно замедлить работу системы.
Пример структуры данных для хранения вариантов раскроя:
// Пример структуры данных (Таблица значений)
// ВариантРаскроя (Количество заготовок 1, Количество заготовок 2, Отход, ИндексСхемы)
Начните с малого: реализуйте простую эвристику, проверьте ее на реальных примерах, и только если качество раскроя вас не устроит — усложняйте систему до целочисленного программирования.