Страницы: 1
RSS
Линейный раскрой макросом VBA
 
Встал вопрос, возможно ли создать средствами эксель оптимизацию по раскрою линейных материалов.
Чтобы было понятнее  даю исходные данные примера:
Имеются детали с указанием их длин в столбец  2500, 900, 2200 ....
Исходная длина заготовки =3000
Задача: сколько целых полотен по 3000 уйдет на раскрой деталей  2500, 900, 2200 ?
Причем, программы по раскрою , понятно что существуют и в них присутствуют карты в графическом виде. От эксель требуется только нахождение целых полотен по количеству без карт.
 
http://forum.msexcel.ru/index.php/topic,11124.0.html
 
Задачу линейного раскроя можно решать разными способами:
1. Полный перебор, как правило, не возможно реализовать в реальных условиях.
2. Самый эффективный способ - целочисленное линейное программирование. В качестве инструмента можно использовать Solver.
Но здесь есть ряд ограничений - необходимо найти все варианты сложения исходных деталей, не превышающих размер заготовок (а вариантов может быть несколько тысяч или сотен тысяч). Ограничение Solver'a - 200 изменяемых ячеек.
3. "Жадный" алгоритм. У данного алгоритма есть вариации, основное достоинство - высокая скорость. Применим для быстрой оценки раскроя, либо когда скорость важнее оптимизации.
4. Решать как частный случай задачи о рюкзаке (сумма подмножеств) и выбор наилучшего варианта из имеющихся.
5. Генетический алгоритм и алгоритм муравьиной колонии. Ничего про эти алгоритмы сказать не могу, т.к. их не изучал.

Реализовал собственный алгоритм линейного раскроя, который основан на решении задачи о рюкзаке методом целочисленного динамического программирования. Производится генерация различных вариантов раскроя в зависимости от сортировки исходных деталей и заготовок и выбор наилучшего решения.
К достоинству можно отнести - достаточно эффективный результат по сравнению с "жадным" алгоритмом, а также при сравнении с результатом других программ линейного раскроя.

Примеры получаемых раскроев можно посмотреть здесь: https://yadi.sk/d/B_fg089lhsMk4
Если будет заинтересованность в алгоритме, то можете обратиться ко мне в личку.

Тесты эффективности различных специализированных программ линейного раскроя есть здесь: http://forum-okna.ru/index.php?showtopic=35118

Приложите полный перечень раскраиваемых деталей в виде файла. Раскрою своей программой. Сможете оценить эффективность.
Если нужно определить только количество исходных заготовок без карт раскроя, то программу можно адаптировать и сделать в виде функции, возвращающей значение.
Изменено: MCH - 03.02.2016 20:16:42
 
Я хочу объяснить цель только в рамках своей узкой задачи.
Сейчас сотрудничаю с фирмой по производству мебели. Задача была поставлена по оптимизации кухонных столешниц длиной 3 и 4 метра в основе. При просчете дизайнер рисует кухню , где максимальное количество деталей в раскрое не превышает 5-6 штук. Но как правило - 90% случаев до 3-х деталей. На эснове этого, можно конечно все гораздо быстрее разложить врукопашную, но это одна из тех многих точек внимания , которую нужно убрать из ручного ввода. Ньюансов и так предостаточно . Дизайнер скидывает кухонную деталировку и нажимает кнопочку расчитать,  далее макрос выполняет работу по выводу итогов. У меня и так к экселю подключена программа оптимизации раскроя, в которую автоматом вгружаются детали для оптимизации (полотна). Я просто подумал, что профили можно реализавть и макросом, тем самым упростив работу людей.
 
Если у Вас расчет раскроя автоматизирован, то зачем тогда делать дополнительный расчет?
Можно сделать быструю оценку, сколько максимально нужно заготовок используя "жадный" алгоритм.
Реализуется очень просто, работает быстро, гарантированно потребуется заготовок не более, чем расчитал "жадный" алгоритм.
Учитывая, что у Вас 5-6 деталей, то алгоритм, как правило, будет выдавать оптимальный результат.
Для реализации примера выложите данные в виде файла в том виде, как они у Вас храняться и какой должен получится результат.
 
 видео пример
https://drive.google.com/file/d/0BxrfsCg1fMBOR3p4cUJFZlZVRDA/view?usp=sharing

Мне кажется не очень удобен способ , запуска сторонней программы а затем возникает необходимость внесения данных в поля. Думал подключить сюда еще и автоит скрипт, но пока знаний не хватает в нем.
Если вас не затруднит, можно более подробно о "жадном алгоритме"
Изменено: Sla_0412 - 30.09.2015 23:07:44
 
Пример реализации "жадного" алгоритма для задачи линейного раскроя.
Он не самый эффективный, но очень быстрый
 
Реализацию программы по линейному раскрою на базе Excel выложил здесь: http://www.excelworld.ru/forum/3-21304-1
 
Спасибо вам. В любом случае интересно.
 
Здравствуйте уважаемые профессионалы, у меня один большой (для меня большой) вопрос.

Имеется готовый макрос, взялся его усовершенствоваться, но мозгов к сожалению на всё не хватает..   Что-то получилось улучшить и внедрить, что-то получилось улучшить, но внедрить не получается.. а что-то даже не понимаю, потихоньку изучаю (Уокенбах Дж. - Excel 2010. Профессиональное программирование на VBA - 2012), но время как всегда не ждёт.

1. Необходимо разложить по полочкам что в этом макросе и как работает (могу показать до куда я разобрался, не много :)) .

2. Глобальное (основное) усовершенствование программы заключается в следующем (как вы наверное поняли это задача линейного раскроя) Есть арматура в виде заготовок фиксированной длины (готовое решение как раз только их и использует), а нужно научить программу использовать остатки (обрезки) по определённым условиям. Начитался много тем и не только на этом форуме, народ пишет что самый оптимальный вариант это заставить "Поиск решения" (некий модуль SOLVER) думать над оптимальным вариантом обозначив начальные условия (естественно всё макросом)

если это большой запрос для бесплатной помощи, можно обсудить величину "спасибо"
 
Сливочный, использованный Вами макрос использует "жадный" алгоритм при решении задачи линейного раскроя, он не эффективный и может привести к большому проценту отходов.
Ссылка на мою реализацию линейного раскроя есть в 8м сообщении данной темы.
Там решены многие вопросы: можно использовать как неограниченное кол-во заготовок, так и остатки со склада
применяются разные методы и алгоритмы, которые показывают хорошую эффективность на реальных данных.

PS: Вы мне так и не ответили на мое письмо в почте.
 
Цитата
MCH написал: Пример реализации "жадного" алгоритма для задачи линейного раскроя GreedyAlgo.xlsm  (16.18 КБ)
Все работает пока не вводишь значения ширины реза ((
Или я что то не так делаю?
 
Все правильно считает, вы детали 12000мм не сможете сделать из заготовки 12000мм при ширине реза 1мм
т.к. нужны заготовки как минимум 12001мм, поэтому данные детали пропускаются
В коде заложен алгоритм, что для изготовления каждой детали ее нужно отпилить от заготовки и каждый рез обязателен.
Чтобы игнорировать последний рез (не обязательность последнего реза), то достаточно к размеру заготовки прибавить ширину реза и формула будет иметь вид:
Код
=GreedyAlgo(A8:A11;B8:B11;B2+B3;B3;B4)

или уберите из кромки ширину реза:
Код
=GreedyAlgo(A8:A11;B8:B11;B2;B3;B4-B3)


Но повторюсь, "жадный" алгоритм считает не эффективно на реальных данных, лучше для раскроя применять другие алгоритмы
Изменено: MCH - 18.12.2016 12:58:50
 
Еще этот алгоритм, по той же самой причине, видимо, не понимает когда рез всего один и заготовка режется на две ровные части.
Изменено: elnino - 18.12.2016 13:47:46
 
Цитата
elnino написал:
Еще этот алгоритм, по той же самой причине, видимо, не понимает когда рез всего один и заготовка режется на две ровные части.
из заготовки 12000 не возможно сделать две по 6000 если на рез уходит несколько мм (если ширину реза и кромки прировнять к нулю, тогда возможно)
 
Нет, я имею ввиду, что если нужно разрезать 12м на 2 ровные части с шириной реза 2мм, то получится в реальной жизни два куска по 5999мм.
Но алгоритм считает что от каждого куска нужно отрезать по 2мм.
Таким образом для этой задачи он заложит две заготовки.
Другая ситуация, более реальная. Есть несколько деталей длиной 2158, 149, 856, 5148, 516, 896, 2265. Невооруженным глазом сразу не сообразить, что с учетом резов 2мм, получится ровно труба 12000мм (2158+2+149+2+856+2+5148+2+516+2+896+2+2265=12000), однако алгоритм к каждой детали добавит по 2мм и заложит две заготовки вместо одной. И это проблема не жадного алгоритма, а его конкретной реализацией, как я понимаю.

MCH, а в вашем алгоритме учтен этот момент?
Изменено: elnino - 19.12.2016 01:35:11
 
Цитата
elnino написал:
а в вашем алгоритме учтен этот момент?
В алгоритме заложено, что последний рез обязателен, но я описал, как обойти это ограничение, нужно просто добавить к размеру заготовки ширину реза
Соответственно получится:
2158+2+149+2+856+2+5148+2+516+2+896+2+2265+2=12000+2
Это математическое решение необязательности последнего реза (когда последний рез необязательный или его можно совместить с кромкой).

Если рассудить логически, то пила, как правило, режет автоматически и какая ей разница, сколько ей отрезать в конце от заготовки 2мм, 1мм или 0мм (сделать рез в воздухе)
таким образом будут допустимым следующие решения:
5999+2+5999+0=12000
5999+2+5998+1=12000
5998+2+5998+2=12000

Данный математический подход можно применить в любом алгоритме линейного раскроя
 
shk, Вы прорекламироваться зашли? Можно, но с разрешения администратора. Без разрешения нарываетесь на бан.
 
при этих исходных:
Цитата
Исходная длина заготовки =3000
Задача: сколько целых полотен по 3000 уйдет на раскрой деталей  2500, 900, 2200 ?
требуется 3 заготовки
если например, 2500 нужно А шт. 2200 нужно В шт., а 900 нужно С шт.
то всего заготовок нужно
А + В + Целое((С+2)/3)
и считается это устно без Excel
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, дата сообщения (перед моим) какая?
 
да, уж... не слабо
а для информации: по истечении скольких лет НЕЛЬЗЯ писать в тему? в т.ч. если это решение по существу заданного вопроса
решения ведь не только для автора, а для всех, кто столкнулся с аналогичным вопросм и нашел на форуме ответ на него
Изменено: Ігор Гончаренко - 19.06.2017 15:53:50
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
и считается это устно без Excel
Не всегда можно устно сосчитать в более сложных примерах:
Если не принимать во внимание что тема старая, то простой пример из Википедии:
Сколько заготовок размером 5600 мм нужно для изготовления следующих деталей (ширина реза равна нулю):
размер - количество
1380 - 22
1520 - 25
1560 - 12
1710 - 14
1820 - 18
1880 - 18
1930 - 20
2000 - 10
2050 - 12
2100 - 14
2140 - 16
2150 - 18
2200 - 20
Скрытый текст
Изменено: MCH - 19.06.2017 15:53:58
 
Пиши хоть через 100 лет. Два основных условия: чтобы форум существовал и чтобы желающий писать дожил до этого срока :)
 
Приветствую всех. Раз уж тема снова всплыла. Задам в ней вопрос. Существует много программ где нет встроенного раскрой прямоугольных деталей. Более того данные зачастую передаются через Excel в программы раскроя. По опыту вижу, что у Excel нет никаких противопоказаний для того, чтобы таковая программа была реализована прямо в нем. (Кроме конечно того, такая программа станет бесплатным достоянием общественности.)
В противовес -автор мог бы себя прорекламировать. Так почему же такой программы до сих пор нет?
 
Цитата
Sla_0412 написал:
Excel нет никаких противопоказаний для того, чтобы таковая программа была реализована прямо в нем
Excel удобен тем, что в него удобно вносить данные и получать результат, и то, что VBA относительно не сложный язык программирования, но достаточно медленный.
Для того чтобы сделать программу нужно качественный и эффективный алгоритм, скорее всего поэтому и нет программ по раскрою реализованных в Excel (нужно проделать большую работу по созданию и реализации алгоритма раскроя, а также упираемся в скорость вычисления, нужно задействовать многопоточность и более быстрые языки программирования, если решение основано на переборах).
 
Не уверен что дело в времени. По опыту-  использовал Базис раскрой, Новый Раскрой-Pro100,  
PaneCut. Первые две-делают раскрой практически моментально. Третья о-очень медленно. Сравнивал деталировку    Раскрой-Pro100 vs PaneCut. Закладывал одну и туже деталировку. Думал что PaneCut выиграет. Однако при детальном рассмотрении выиграл   Раскрой-Pro100. Думаю, тут главное алгоритм.
 
Сообщение andris krusines удалено [МОДЕРАТОР]

andris krusines, здесь форум по обмену знаниями, а не реклама ХЗ какой программы
Если ваш алгоритм хорош, то поделитесь им тут - есть MCH, который давно и прочно зарекомендовал себя отличным специалистом в этой области. Есть и другие знающие люди - они проверят (если им не лень) и дадут заключение

Если не поделитесь алгоритмом, то это 100%ный маркер мягко говоря "некачественного" продукта, а человек, решивший такого "кота в мешке" приобрести сильно пожалеет
А самое смешное, то такие "авторы" даже понять не могут, что именно с их "продуктом" не так, если вообще обнаружат проблему без обратной связи :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх