681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
Задача оптимального раскроя17.07.2021, 13:10. Показов 10930. Ответов 30
Метки вариант задачи о рюкзаке (Все метки)
У меня возникла реальная задача - написать программу для станка раскроя ткани. Ткань в рулоне ширины W, рулон разматывают на стол длины H в несколько заходов. Нужно оптимальным образом нарезать ортогональными резами N прямоугольных кусков размером (wi, hi). Особенность ножа в том, что он не совсем аккуратно режет углы, т.е. каждый разрез делается с запасом на небольшое расстояние d=5...8 мм в начале реза и на расстояние d в конце реза. Поэтому между прямоугольниками по обоим сторонам делается зазор величиной d и в результате сетка из полосок ткани толщиной d выбрасывается.
Чтобы не мучаться с этим дополнительным усложнением (d) будем считать, что нож все-таки режет идеально и зазоры между кусками не делаются, а все размеры кусков увеличиваются на величину d, прогоняются через оптимизационный алгоритм, а затем несложным алгоритмом результат оптимальной раскройки преобразуется в раскрой с зазорами. Итак, фактически прямоугольники wi, hi нужно уложить в неограниченное количество рюкзаков размерами W, H. При этом нужно минимизировать потери ткани. При этом у последнего "рюкзака" часть неразрезанной (неиспорченной разрезами) ткани, оставшейся с рулоном, не является потерей. Станок отрезает эту часть ткани поперек и она сматывается обратно в рулон. Добавлено через 1 час 35 минут Два варианта алгоритма: 1. прямоугольники можно поворачивать на 90 градусов 2. нельзя поворачивать (направленный рисунок на ткани)
0
|
17.07.2021, 13:10 | |
Ответы с готовыми решениями:
30
Поиск оптимального раскроя Задача оптимального подбора оборудования Задача оптимального раскроя: распил досок |
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
18.07.2021, 13:11 [ТС] | |
Рисунок
Ткань отматывается из рулона ширины W и кладется на стол длины H. Нож режет с запасом на длину d, в связи с чем образуются полоски шириной d на выброс. Если длина или ширина двух кусков ткани совпадает, то можно сделать рез без зазора (см. рисунок). После разреза всех кусков ткани делается крайний рез (см. рисунок), рулон снова разматывается и выполняется следующий раскрой. Варианты оптимизационной задачи: 1. Критерий оптимизации - минимальная площадь потерь ткани / критерий оптимизации Б - минимизация площади + минимизация количества резов (минимизация взвешенной функции двух переменных). 2. Перед размоткой рулона делается крайний рез / Не делается крайний рез. 3. Прямоугольники можно поворачивать / прямоугольники нельзя поворачивать.
0
|
фрилансер
![]() 6334 / 5473 / 1108
Регистрация: 11.10.2019
Сообщений: 14,567
|
|
18.07.2021, 17:20 | |
Mikhaylo, можно попробовать генетический алгоритм. Хотя, может есть и аналитические способы раскроя
0
|
![]() |
|
19.07.2021, 12:55 | |
В реальном производстве, как я понимаю, есть понятие карты раскроя. Ее можно составить один раз в любой бесплатной программе - таких имеется предостаточно. Например, по такой карте можно заранее распилить фанеру для изготовления шкафов - причем может оказаться так, что для оптимального распила понадобится несколько карт и небольшой склад заготовок.
Вопрос - зачем нужна собственная программа? Насколько я понимаю, ткань режется не просто так на платочки - а для шитья из нее готового изделия. Зачем нужно в оперативном режиме отрисовывать карты раскроя? PS: задача NP-полная, строгого быстрого решения у нее нет - поэтому люди до сих пор на ее оптимизации кандидатские и докторские защищают.
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
19.07.2021, 16:10 [ТС] | |
Мне нужно написать программу для станка.
В принципе можно рассмотреть алгоритмы полного перебора. Исчерпывающе про мою задачу написано в википедии: https://ru.m.wikipedia.org/wik... 0%BE%D1%8F Думаю, надо рассмотреть метод ветвей и границ.
0
|
![]() |
||||||
19.07.2021, 16:40 | ||||||
Вот еще можно посмотреть, мне показалось интересным:
Задача упаковки прямоугольников: точный алгоритм на базе матричного представления https://cyberleninka.ru/articl... stavleniya Добавлено через 4 минуты 10! = 3628800 11! = 39916800 12! = 479001600 Не думаю... Добавлено через 11 минут Да, вот еще... Пример надуман, но все же:
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
19.07.2021, 19:47 [ТС] | |
vantfiles,
Надо перебирать только характерные точки. В самом начале только две характерные точки - верхний и левый углы ткани (на рисунке). В вашем случае квадратик может размещен в одной из четырех точек. Можно выбирать всегда верхнюю левую точку, так как без разницы. Добавлено через 6 минут Если я сейчас не ошибаюсь, каждый прямоугольник удаляет одну или в лучшем случае две характерные точки (занимает их место) и добавляет три или в лучшем случае две новые точки. То есть число характерных точек растет линейно.
0
|
![]() |
||||||
20.07.2021, 09:12 | ||||||
Нет комментариев... я волнуюсь... Вы поняли, что я имел в виду? Иногда бывает, что лучше подождать - и сделать одну карту вместо двух:
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
20.07.2021, 09:34 [ТС] | |
На производстве задания раскроя могут поступать в реальном времени, да. Это пускай эксплуатанты сами решают, подождать или нет.
На самом деле потери ткани - это важно, но я видел горы этой ткани, которую выбрасывают. Так что надо помимо экономии потерь ткани, надо производительность станка обеспечить. Кстати, вторая задача - задача оптимальной траектории ножа, я еще не формулировал эту задачу, но она существует...
0
|
![]() |
|
20.07.2021, 23:00 | |
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
21.07.2021, 04:54 [ТС] | |
vantfiles, это уже другая задача.
ЗАДАЧА #2. Пусть первый оптимизационный алгоритм выдал оптимальную раскладку (layout), которую мы видим на рисунке. Следует разработать алгоритм, который выдаст оптимальный маршрут ножа ЧПУ-станка. Есть особенности: 1. Нож не может резать в направлении слева направо (ось X), так как ткань с левой стороны не удерживается. 2. Справа ткань удерживается рулоном, поэтому, если выполнить некоторый рез по ширине рулона (ось Y), то впоследствии слева от этого реза резать ткань вдоль оси X уже не получится, ткань в этой части рулоном уже не будет удерживаться. 3. Резы по ширине рулона (ось Y) можно выполнять без ограничений. Нужно минимизировать время. По оси X скорость перемещения равна Vx, по оси y - Vy. Добавлено через 9 минут Начальное положение ножа - в крайней левой точке стола (X=0) и в любом нужном положении по оси Y, т.е., пока ткань раскладывают на столе, нож уже будет готов. Нож можно перемещать одновременно по обеим осям.
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14.08.2021, 16:13 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Значит так. Я тут самостоятельно продвинулся. Изучил несколько монографий, статей и докторских диссертаций.
И эту статью на Хабре в первую очередь: https://habr.com/ru/post/136225/ (Про двумерную упаковку: offline алгоритмы) В общем вывод такой: есть методы перебора, которые находят глобальный оптимум, но работают с экспоненциальной сложностью. Этот вариант отсеялся, так как такие алгоритмы работают порядка минут при количестве прямоугольников 15-20. Есть еще алгоритмы на основе генетического алгоритма. Они ищут локальные оптимумы, и при этом тоже довольно тяжелые (порядка минут). Остались эвристические алгоритмы (см. псевдокод в статье на Хабре, ссылка выше). Я написал на Пайтоне. Исходные условия:
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
1. Сортировка по высоте Кликните здесь для просмотра всего текста
2. Вычисление коэффициента эффективности использования ткани Кликните здесь для просмотра всего текста
3. Визуализация Кликните здесь для просмотра всего текста
0
|
11.01.2022, 09:26 | |
Mikhaylo, Можете ответить, какая у Вас эффективность раскроя для первого набора данных (% заполнения или длина полосы)?
Реализовано вращение элементов? Реализован гильотинный раскрой (от края до края)? PS: Реализовывал схожую задачу, решение выкладывал на excelworld (прямую ссылку не даю, т.к. запрещено правилами текущего форума) Можно найти по фразе: "Двумерный раскрой / Двумерная упаковка, 2DSP" С текущим набором данных алгоритм справляется не очень хорошо (на мой взгляд), нужно менять подход к решению Выкладываю то, что получилось раскроить своим алгоритмом. Если убрать мелкие детали, то раскрой производится очень быстро, а уже мелкие детали раскраиваем из остатков
0
|
11.01.2022, 11:03 | |
У ТС реализован "жадный алгоритм", он достаточно быстрый на любом языке, перебора там нет (если за основу взяты алгоритмы с habr)
0
|
681 / 555 / 74
Регистрация: 20.09.2014
Сообщений: 3,638
|
|
13.01.2022, 06:48 [ТС] | |
Проект близится к завершению. Реализован только модифицированный алгоритм FCNR, хотя еще планировал алгоритм блочной упаковки. Оперативной памяти не хватает (специфика железа).
1. Эффективность 75-95%, это сильно зависит от ширины ткани и конкретных изделий. 2. У нас для FCNR достаточно повернуть все изделия по длинной стороне вдоль полосы. 3. Гильотинный принцип реза не требуется, так как у нас ткань. Представьте себе, режем шторы на окна. Практика показывает, что у нас изделия делятся условно на три группы размеров: большие, средние и маленькие. Изделия часто по несколько штук одинаковые, поэтому обычно укладка происходит достаточно ровно, но все же бывают случаи, когда жадность укладки мешает реализовать очевидную оптимальную укладку. В этом случае можно заморочаться - убрать часть изделий из укладки и тогда вроде получается. Но это потери времени, потеря производительности.
0
|
13.01.2022, 06:48 | ||||||
Помогаю со студенческими работами здесь
20
Алгоритм оптимального раскроя Задача раскроя прямоугольников Задача выбора варианта раскроя Задача раскроя с учетом комплектации Задача раскроя, максимизировать количество целевых прямоугольников Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть.
Дело в том, что я. . .
|
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
|
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
|
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
|
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
|
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
|
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
|
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
|
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
|
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
|