|
0 / 0 / 0
Регистрация: 15.04.2022
Сообщений: 4
|
|
Разрезы прямоугольника на детали без отходов15.04.2022, 13:29. Показов 3915. Ответов 24
Метки динамическое программирование, рекуррентая формула, рекуррентное уравнение, рекуррентные соотношения (Все метки)
Необходимо разрезать прямоугольник размера x × y на детали прямоугольной формы размера x1 × y1 и x2 × y2, чтобы отходы были минимальными. Возможны только вертикальные и горизонтальные разрезы. Т. е. после первого разреза получается два прямоугольника, которые впоследствии также можно разрезать.
Формат входных данных На входе содержится шесть целых чисел x, y, x1, y1, x2, y2 (1 ≤ x, y ≤ 300, 1 ≤ x1, x2 ≤ x, 1 ≤ y1, y2 ≤ y). Формат выходных данных Выведите минимальную сумму площадей остатков. Пример входных данных 10 10 2 9 3 4 Ответ 10 Помогите пожалуйста решить, я понимаю примерно что нужно делать но не могу даже составить рекуррентное соотношение. Задача должна решаться через динамическое программирование.
0
|
|
| 15.04.2022, 13:29 | |
|
Ответы с готовыми решениями:
24
Построить третье изображение детали по двум данным, дать разрезы, построить натуральный вид наклонного сечения Два прямоугольника заданы координатами своих вершин. Определите, параллельны ли стороны одного прямоугольника сторонам другого прямоугольника. Нахождение количества точек внутри прямоугольника, на границе прямоугольника, вне прямоугольника |
| 15.04.2022, 21:09 | |
|
Количество повторов 1й и 2й детали может быть любой?
На сколько я понял, то нужно реализовать гильотинный раскрой (от края до края) Прямоугольники можно поворачивать? Посмотрите решение похожей задачи во вложении, оно как раз реализовано с помощью динамического программирования Количество деталей может быть более 2х
1
|
|
|
383 / 280 / 112
Регистрация: 28.04.2015
Сообщений: 1,726
|
|
| 16.04.2022, 04:59 | |
|
m-ch, привет!
ты ведь большой мастак в графах, думал, что не пропустишь эту тему и предложишь какое-нибудь хорошее решение: Два наименьших остовных дерева зы: нет, так нет)) а Венгерский алгоритм обязательно обсудим (если у тебя будет желание, разумеется, это обсуждать в принципе)...
0
|
|
|
0 / 0 / 0
Регистрация: 15.04.2022
Сообщений: 4
|
|
| 16.04.2022, 14:35 [ТС] | |
|
Что вы имеете ввиду под повторами деталей. Как я понял ваш вопрос, то наш изначальный прямоугольник можно разбить хоть на сто деталей допустим 1-ого вида и тогда отходов 0. А можно разбить на 5 деталей 1-ого вида, на 6 деталей 2-ого вида и останется площадь которую мы не сможем никак разбить на нужные нам детали и это будут отходы которые нам нужны(минимальные).Прямоугольники можно поворачивать
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|||
| 18.04.2022, 06:39 | |||
|
Как насчет вот такого способа разреза? Тут все разрезы: вертикальные и горизонтальные. Однако первый разрез ведется не от края до края (негильотинный разрез), то есть после него НЕ получается два прямоугольника. Так можно или нельзя?
0
|
|||
|
0 / 0 / 0
Регистрация: 15.04.2022
Сообщений: 4
|
|
| 19.04.2022, 21:54 [ТС] | |
|
Если есть есть возможность разрезать без отходов то режем на наши фигуры, если же не получится разрезать только на наши фигуры, то нужно минимизировать отходы. Разрезы должны быть от края до края.
0
|
|
| 19.04.2022, 22:04 | |
|
mr_wow3, Вы смотрели мое решение, оно не подходит?
Если есть только два вида деталей, то можно упростить решение, в моем примере можно использовать до 20 различных прямоугольных деталей, с возможностью их поворачивать, использовать любое их количество, алгоритм старается сократить отходы, вплоть до нуля. Потестируйте на различных размерах исходного прямоугольника и различных деталях
0
|
|
|
0 / 0 / 0
Регистрация: 15.04.2022
Сообщений: 4
|
|
| 19.04.2022, 22:10 [ТС] | |
|
Я посмотрел архив, но там же только документ эксель, если вы о нем то спасибо за наглядный пример, но я все же не знаю как это запрограммировать.
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 19.04.2022, 22:26 | ||
|
Для точного решения этой задачи не существует эффективных алгоритмов, то есть придется делать перебор. Перебор делается, например, через известный алгоритм попарного слияния. Хотя, тот факт, что деталей всего две (с поворотами - четыре), может упрощать решение.
0
|
||
| 20.04.2022, 06:08 | |
|
mr_wow3, в документе .xlsm есть макрос написанный на VBA. Который производит расчёт, если нажать на кнопку «нажми» то происходит пересчёт (макросы должны быть разрешены), кода в документе на несколько десятков строк.
Если изменить исходные данные и нажать пересчёт, то модель пересчитается. TheCalligrapher, если задачу свести к динамическому программированию, то это избавит от полного перебора и можно найти одно из эффективных решений, в данном случае как раз и состоит сложность как реализовать динамическое программирование. Исходная задача не требует построения схемы раскроя и используется всего две детали, что упрощает подход к решению, нужно найти только минимальные отходы, думаю что задачу можно свести к динамическому программированию,учитывая, что размеры прямоугольников целые числа не более 300
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 20.04.2022, 07:20 | ||
|
Жизнеспособность тут проистекает из того факта, что размер поля всего 300 на 300. То есть можно ожидать, что и перебор пройдет за приемлемое время.
0
|
||
| 20.04.2022, 09:10 | |
|
У меня в реализации используется гильотинный раскрой (от края до края), при этом исходный прямоугольник разрезается на полосы (либо горизонтальные, либо вертикальные). Каждая подзадача (полоса) решается рюкзаком через динамическое программирование с минимизацией отходов, и далее происходит итоговое решение также рюкзаком, когда мы из полос набираем нужный исходный прямоугольник с минимизацией отходов.
Например, возьмем паллет 1200х800 (в дюймах это будет 47х31), а также детали (коробки) 3х17, 5х13, 7х11 (все размеры простые числа, для того, чтобы детали хуже комбинировались друг с другом) Во вложении пример их укладки по алгоритму описанному выше (в документе все работает и пересчитывается при нажатии на кнопку). Отходы на прямоугольник 47х31 составили 20 квадратных единиц (потери 1,37%). Предполагаю, что если применять не гильотинный раскрой, как приведен в 5м сообщении, то можно получить более оптимальное решение (но не обязательно). Остается вопрос, сколько требуется времени, чтобы найти более оптимальное решение перебором?
1
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 20.04.2022, 22:17 | ||
|
Особенностью данной задачи является то, что количество требуемых деталей для раскроя/коробок для размещения неограниченно. Это сразу дает нам возможность в процессе перебора методом попарного слияния воспользоваться следующим замечательным наблюдением: если у нас есть два частичных решения одинакового внешнего размера WxH, но в одном решении внутренние отходы меньше, чем в другом, то решение с большим внутренним отходом мы может сразу исключить из дальнейшего рассмотрения. Правильность данного утверждения очевидна: какое бы финальное размещение мы не получили, если у нас есть возможность "вынуть" из этого размещения некое подразмещение и заменить его на другое подразмещение такого же размера, но с меньшим внутренним отходом, то качество финального решения от этого только улучшится. То есть на каждом этапе перебора для каждого размера частичного решения WxH нас интересует только одно - "самое лучшее" - найденное на данный момент частичное решение. Это существенно сужает перебор. Написал несложную С++ программку такого перебора. Вашу задачу 47х31, 3х17, 5х13, 7х11 решает мгновенно. Отход в найденном мною лучшем решении - 8 (см. ниже). А вы говорите, что у вас получилось 20. Это плохо.
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|
| 21.04.2022, 04:11 | |
|
Если для тех же ваших размеров коробок взять палетту 79x57, то возможно идеальное безотходное заполнение. Ваш же Эксель не находит этого решения и оставляет отход 5.
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|
| 21.04.2022, 04:40 | |
|
... ну или, если отбросить общие части наших решений, ваш алгоритм не умеет находить безотходное решение для 40x57. И далее: 40x44, 26x44... Все эти варианты допускают идеальное заполнение, но ваш алгоритм его не видит.
0
|
|
| 21.04.2022, 06:12 | |
|
TheCalligrapher, у Вас получились очень хорошие решения, поделитесь кодом и/или описанием алгоритма
Свой метод я описал, он не идеален, но позволяет достаточно быстро решать с приемлемым результатом. Относительно гильотинного раскроя, есть задачи, которые можно решать только так, например, резка стекла. То что у Вас получилось - мне очень понравилось, учитывая, что расчет происходит быстро. Есть ли у Вас примеры реализации двумерного раскроя с ограниченным количеством деталей?
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||||||||||||
| 22.04.2022, 00:12 | ||||||||||||
|
Все возможные гильотинные раскрои/упаковки получаются из исходного набора прямоугольников через горизонтальную и вертикальную композицию этих прямоугольников. Композиция охватывается новым прямоугольником, а попавший внутрь отход считается безвозвратно потерянным. Новые прямоугольники добавляются к исходным и точно так же равноправно с ними участвуют в формировании все новых, больших и больших горизонтальных и вертикальных композиций, пока они удовлетворяют ограничениям (на размер или на количество деталей). Так мы переберем все возможные гильотинные раскрои. В этом и заключается основной скелет алгоритма. А далее начинаются оптимизации перебора. В некоторых узких кругах этот алгоритм называют "алгоритмом Ванга" в честь автора статьи: P. Y. Wang "Two Algorithms for Constrained Two-Dimensional Cutting Stock Problems" https://www.jstor.org/stable/170624 --- Вот вариант моего кода, который выдает только размер отхода в найденном оптимальном решении, но держит само решение в тайне. Это С++ с незначительным использованием С++20 ( #include <bit> и оператор сравнения == по умолчанию. Фактически использование С++20 можно легко устранить.)Вход берется из стандартного входного потока в формате: <W палетты> <H палетты> <N коробок> <W коробки 1> <H коробки 1> <W коробки 2> <H коробки 2>... Только отход
Вот более расширенный вариант того же кода, который может выдавать решение в файл в формате GDSII-текстовый (если сделано #define DUMP_GDS). Такие файлы можно смотреть при помощи смотрелки KLayout (https://www.klayout.de). Также, иерархическая структура геометрии в файле отражает иерархию попарного слияния блоков в процессе работы алгоритма.С формированием GDS файла
0
|
||||||||||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
|
| 22.04.2022, 02:42 | |
|
Работа продолжается...
Существенной оптимизацией на практических примерах, как показал эксперимент, является проверка того, не помещается ли в область внутреннего отхода (заштрихована на рисунках из статьи) очередной свежесозданной композиции какая-нибудь из исходных коробок. Если помещается, то очевидно, что такую композицию рассматривать дальше нет никакого смысла. За счет этой модификации на примере 150 150 3 3 17 5 13 7 11 я получаю ускорение где-то в 5-6 раз. А задача 300 300 3 3 17 5 13 7 11 у меня теперь решается где-то 5 минут (нулевой отход). Тут, кстати, можно хорошо применить многопоточность.
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 22.04.2022, 02:50 | ||
|
0
|
||
| 22.04.2022, 02:50 | |
|
Помогаю со студенческими работами здесь
20
Вероятность случайно выбраной детали без дефектов Посоветуйте литературу по выполнению прямоугольной изометрии детали, эскиза детали Сделать линию без прямоугольника вокруг Разрезы Найти минимальную площадь прямоугольника из данного набора (без массива) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|