Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
Заблокирован

Выполнение оптимизации на VB6.0 по раскрою

08.09.2015, 21:44. Показов 8877. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу помощи.

Научите, пожалуйста, бегло решать оптимизационные задачи на раскрой материалов с помощью Visual Basic 6.0

Условия. На рынке имеется неограниченное количество досок, длиной 350 см. Нам нужно подсчитать оптимальную закупочную партию для выполнения заказа, чтобы отходы, оставшиеся обрезки — были минимальные.
По принципу одного дня: купили, распилили и продали. Нет склада, где хранить обрезки — поэтому все остатки вывозятся на свалку, как мусор.
По заказу клиента нужны следующие заготовки:
1) длина заготовки № 1 = 185 см, количество — 127 штук;
2) длина заготовки № 2 = 165 см, количество — 178 штук;
3) длина заготовки № 3 = 143 см, количество — 335 штук;
4) длина заготовки № 4 = 87 см, количество — 526 штуки;
5) длина заготовки № 5 = 26 см, количество — 958 штуки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2015, 21:44
Ответы с готовыми решениями:

Перебор по раскрою квадрата в Visual Basic 6.0
Здравствуйте! Пожалуйста, помогите составить программу на перебор в Solver Excel. Написать программу для раскроя квадрата на...

Резак для бумаги применительно к раскрою стеклотекстолита
Дикий, может быть даже тупой вопрос: собсно, сабж! Кто-нибудь реально пробовал? Плотность листового текстолита ~160..200 г/м2 (при...

Windows 2000 Rus VB6, VB6 Resource Editor отсутствует
В Windows 2000 Rus + SP3 проинсталлировал Visual Studio 6 + MSDN Full (вся студия на 6 CD-R). В VB6 “Add-In Manager” всего три компонента,...

34
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
09.01.2016, 23:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Willi2001 Посмотреть сообщение
Потребуется досок l=350: 127 + 51 + 162 + 141 + 16 + 1 = 498 штук
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Считал чуть меньше 3-х минут, долго данные вводил в программу. Расчет ТС верный!
Решение в 498 заготовок - не самое оптимальное, данные исходные детали можно уложить в 497 заготовок:
185 + 87 + 26*3 = 350 (остаток 0) - 26 повторений
185 + 165 = 350 (остаток 0) - 101 повторение
87*4 = 348 (остаток 2) - 125 повторений
165 + 26*7 = 347 (остаток 3) - 77 повторений
143*2 + 26*2 = 338 (остаток 12) - 167 повторений
143 + 26*7 = 325 (остаток 25) - 1 повторение

Итого: 26+101+125+77+167+1= 497 заготовок

Решал своей программой по раскрою (реализовано на VBA в Excel)
На решение потребовалось примерно полминуты, из которых 29 секунд - ввод данных и 1 секунда - поиск решения.
Все полученные схемы во вложении, а также видео, как производится расчет.
Данная задача имеет множество разных решений (для 497 заготовок), одно из которых я выложил. В данном варианте производится максимизация остатка от последней заготовки.

На текущий момент реализовал алгоритм решения задачи линейного раскроя с помощью динамического программирования (DP), в основе которого решение задачи "сумма подмножеств" или "задача о рюкзаке", когда "рюкзаков" много.
Также реализовал решение методом целочисленного линейного программирования (LP) на базе метода Гилмора-Гомори
Данный способ (линейное программирование) позволяет найти оптимальное решение, которое не всегда находится динамическим программированием.

Нашел тему на форуме по окнам, по сравнению различных программ по линейному раскрою:
http://forum-okna.ru/index.php?showtopic=35118

По результатам расчетов на тестовых данных, мои алгоритмы обошли все упомянутые там специализированные программы, свои результаты выложил на 5й странице
Вложения
Тип файла: rar CSP_m-ch.rar (516.2 Кб, 32 просмотров)
1
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.01.2016, 00:07
m-ch, у тебя пила тоньше.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
10.01.2016, 00:50
Цитата Сообщение от Catstail Посмотреть сообщение
Важен алгоритм. Опиши его, а программа в данном случае второстепенна.
Если задачу рескроя не сводить к "жадному" алгоритму или тривиальному "задача о рюкзаке", то методы ее решения уже давно сформулированы и описаны:
http://citeseerx.ist.psu.edu/v... 1&type=pdf
http://www.dcc.fc.up.pt/~fdabr... report.pdf
В основе - целочисленное линейное программирование, которое основывается на концепции Контаровича.

Здесь сложным моментом является построение LP модели и дальнейшее ее решение.
Если основываться на методе Гилмора-Гомори, то необходимо найти рациональные (оптимальные по Парето) схемы раскроя, алгоритм не сложный, но таких схем может быть очень много, десятки тысяч (или миллионы и более), если используются заготовки большого размера и нужно изготовить много различных деталей малого размера, поэтому данный способ не всегда применим.

При реализации метода Валерио де Карвальо (когда вместо схем раскроя составляются возможные дуги) столкнулся со сложностью, при построении LP модели из несколько десятков тысяч переменных на ее решение уходят минуты или десятки минут. В качестве решателя LP модели использую библиотеку lpsolve (она имеет достаточно удобный API и может запускаться из различных приложение написанных на различных языках программирования).
При этом, если полученную модель в виде файла mps подсунуть в коммерческий Gurobi Optimization (в качестве демонстрации можно воспользоваться бесплатно: http://www.neos-server.org/neo... i/MPS.html)
То на решение данной модели уходят секунды.

Добавлено через 6 минут
Цитата Сообщение от SoftIce Посмотреть сообщение
у тебя пила тоньше.
Ну, да.
Я размер (ширину) реза занулил
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.01.2016, 07:29
Цитата Сообщение от m-ch Посмотреть сообщение
мои алгоритмы обошли все упомянутые там специализированные программы
Ну и где они, хваленые ваши алгоритмы?
Мы в этой теме вроде как не пиписками меримся, а знаниями делимся.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
10.01.2016, 11:04
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну и где они, хваленые ваши алгоритмы?
Программа (в том виде как она есть) продается, но могу дать подробное описание алгоритма.
Знающему человеку не составит труда реализовать его на любом языке программирования.

Ссылки на методологию с использованием линейного программирования я дал в 23 посте
Достаточно наглядное описание на русском языке есть здесь: http://al-vo.ru/spravochnik-ex... excel.html

Для указанных данных есть 18 вариантов рациональных схем раскроя:
Кликните здесь для просмотра всего текста
185+165 = 350
185+87+26+26+26 = 350
87+87+87+87 = 348
165+26+26+26+26+26+26+26 = 347
87+26+26+26+26+26+26+26+26+26+26 = 347
143+87+87+26 = 343
185+26+26+26+26+26+26 = 341
165+87+87 = 339
87+87+87+26+26+26 = 339
26+26+26+26+26+26+26+26+26+26+26+26+26 = 338
143+143+26+26 = 338
165+143+26 = 334
143+87+26+26+26+26 = 334
165+87+26+26+26 = 330
165+165 = 330
87+87+26+26+26+26+26+26 = 330
185+143 = 328
143+26+26+26+26+26+26+26 = 325

Во вложении составленная модель, которая решается с помощью "Поиск решения" в Excel

Альтернативные алгоритмы:
Серия "жадных" алгоритмов на примере задачи об упаковки в контейнеры (принципиально от задачи раскроя не отличается):
Next Fit Algorithm
Кликните здесь для просмотра всего текста
Алгоритм очень прост, и в большинстве случаев даст наихудшие результаты из всех рассматриваемых алгоритмов.
Суть алгоритма в следующем:
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент влезает в контейнер, идем на шаг 3. Если элемент не влезает в контейнер, идем на шаг 2.

То есть мы кладем элементы в контейнер, и если некий элемент уже не влазит, берем новый контейнер.
Можно придумать алгоритм и похитрее, но у этого алгоритма есть один плюс - он не требует просмотра прошлых контейнеров. Это может оказаться полезным, если, например, контейнеры к нам подъезжают по конвейеру.

First Fit Algorithm
Кликните здесь для просмотра всего текста
Суть алгоритма в следующем:
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент влезает в контейнер, идем на шаг 3. Если элемент не влезает в контейнер, проверяем остальные контейнеры по порядку. Если находится контейнер с достаточным количеством свободного места, кладем элемент в контейнер и идем на шаг 4, иначе идем на шаг 2.

То есть кладем элементы в контейнер, и если элемент уже не влазит, пытаемся найти подходящий контейнер среди уже частично заполненных. Если места не находим, берем новый контейнер.

Worst Fit Algorithm
Кликните здесь для просмотра всего текста
Суть алгоритма в следующем:
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент влезает в контейнер, идем на шаг 3. Если элемент не влезает в контейнер, берем частично заполненный контейнер с максимумом свободного места. Если элемент влазит в контейнер, кладем элемент в контейнер и идем на шаг 4, иначе идем на шаг 2.

То есть кладем элементы в контейнер, и если элемент уже не влазит, пытаемся положить его в наименее заполненных контейнер. Если это сделать не удается, берем новый контейнер.

Best Fit Algorithm
Кликните здесь для просмотра всего текста
Суть алгоритма в следующем:
1. Берем новый элемент
2. Берем новый контейнер.
3. Кладем элемент в контейнер.
4. Берем следующий элемент.
5. Если элемент влезает в контейнер, идем на шаг 3. Если элемент не влезает в контейнер, берем частично заполненный контейнер с минимумом свободного места, но в который еще можно положить данный элемент. Если такой контейнер находится, идем на шаг 3, иначе идем на шаг 2.

То есть кладем элементы в контейнер, и если элемент уже не влазит, пытаемся положить его в наиболее заполненных контейнер, но в котором еще есть достаточно места для этого элемента. Если это сделать не удается, берем новый контейнер.

Также надо упомянуть и о том, что для каждого алгоритма есть вариант с предварительной сортировкой элементов по уменьшению - First Fit Decreasing, Best Fit Decreasing и т.п. То есть все тоже самое, только элементы берутся, начиная с самого крупного.

"Жадные" алгоритмы достаточны просты в реализации, работают очень быстро, но дают, как правило, не оптимальное решение.

Применение алгоритма "Задачи о рюкзаке" ("Сумма подмножеств")
Кликните здесь для просмотра всего текста
Берете брусок и находите вариант его оптимального распила (чтобы минимизировать остаток). Это задача о рюкзаке. Распиливаете брусок, перерассчитываете количество еще не сделанных деталей. Опять берете брусок, находите его оптимальный распил с использованием еще не сделанных деталей, ... и т.д., пока не будут получены все детали. Если есть остатки, то процедуру начинать с самого короткого бруска.
Данный способ в большинстве случаев дает результат лучше чем "жадный" алгоритм, но тоже не гарантирует оптимальное решение. Рационально данную задачу решать динамическим программированием.
Алгоритм решения подбора слагаемых под нужную сумму выкладывал здесь.

Для улучшения результата можно производить сортировки и перемешивание деталей и многократно производить решение, после чего выбрать наилучший результат из имеющихся решений.


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

Сам данный способ не реализовывал, поэтому не могу рассказать о нюансах, но учитывая, что данные методы реализованы в программах Окнософт:cutting и WinCalc, и за одинаковое время алгоритм решения задачи о рюкзаке динамическим программированием находит решение как правило лучше.
Вложения
Тип файла: xlsx SolverMS.xlsx (91.2 Кб, 55 просмотров)
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
03.02.2016, 02:18
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну и где они, хваленые ваши алгоритмы?
Demo-версию выложил здесь: https://www.cyberforum.ru/post8704132.html
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.02.2016, 08:46
Цитата Сообщение от m-ch Посмотреть сообщение
Demo-версию выложил здесь
Спасибо, интересно было посмотреть.
А вот в чем преимущество линейного алгоритма от динамического? Т.к. в демо нет возможности сравнить, скажите, там быстрее считает или точнее?
Экспериментировал с настойками Быстро->Очень медленно, вроде на точность расчетов не влияет?
И ещё вопрос, с "Экспорт в PDF" ясно, там очевидно формируется отчет в PDF.
А вот кнопка "Создать отчет" что делает ( в полной версии )?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
03.02.2016, 22:37
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А вот в чем преимущество линейного алгоритма от динамического?
В основе динамического алгоритма - решение задачи о рюкзаке методом целочисленного динамического программирования. Реализовать данные метод очень легко.
1. Берем первую заготовку
2. Динамическим программированием подбираем детали сумма которых меньше или равна размеру заготовки с определенным допуском погрешности.
3. Исключаем из перечня детали, которые использовали.
4. Берем следующую заготовку и переходим на п. 2
и т.д. пока не закончатся заготовки или детали.
Данный метод, как правило, намного лучше "жадного" алгоритма.
Результат раскроя сильно зависит от сортировки заготовок и деталей, поэтому с помощью перемешивания запускаем решение несколько раз и выбираем лучший вариант.
Метод "Быстро" отличается от "Медленно" количеством итераций (попыток решения).
Как правило способ "Медленно" и "Очень медленно" находит решение лучше чем при "Быстром" способе.
Данные метод не гарантирует нахождения оптимального раскроя, но хорошо справляется с задачей для реальных данных (в оконном производстве), когда заготовка имеет большой размер (6 или 6,5 метров), а детали небольшой (от 0,5 метра до 2х метров).

Алгоритм с использованием линейного программирования основан на методологии Л.В. Кантаровича (Канторович Л.В., Залгаллер В.А. "Рациональный раскрой промышленных материалов")
Принцип решения: составляем все возможные рациональные (оптимальные по Парето) схемы раскроя. Здесь также применяем динамическое программирование.
Далее строим lp-модель с указанием в качестве целевой функции минимизацию количества используемых заготовок. Решать систему можно как встроенным в Excel инструментом "Поиск решения" (решать не очень удобно, т.к. стандартный Solver имеет большие ограничения на количество переменных), так и сторонними библиотеками: http://sourceforge.net/projects/lpsolve, https://projects.coin-or.org/Cbc, http://www.gurobi.com/
Как результат, будет найдено оптимальное решение (использование наименьшего количества заготовок). Можно также автоматизировать максимизацию полезного остатка от последней заготовки.
Данные способ хорошо работает при небольшом размере заготовок и достаточно большом размере деталей (20% - 30% от размера заготовки).
Ограничение метода - при малом размере деталей относительно заготовки, может быть огромное количество схем раскроя (несколько сотен тысяч или миллионов), что не позволит найти решение системы либо на решение уходит очень много времени, но в данном случае с задачей раскроя хорошо справляется динамическое программирование.
Сочетание методов DP и LP позволяет находить оптимальное решение.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
А вот кнопка "Создать отчет" что делает ( в полной версии )?
На кнопку "Создать отчет" пока не повешен макрос, т.к. требования у всех разные, приходится индивидуально подходить к составлению отчетов.

Во вложении примеры получаемых раскроев методом DP и LP, а также видео, как производится раскрой.
Метод LP как правило позволяет находить решение лучше, с уменьшением размера заготовки это становится более заметно, также видно как увеличивается скорость решения при уменьшении размера заготовок.
Вложения
Тип файла: zip CSP.zip (5.74 Мб, 49 просмотров)
3
0 / 0 / 0
Регистрация: 23.09.2021
Сообщений: 2
03.04.2022, 12:28
m-ch, как с вами связаться?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
03.04.2022, 16:45
smivan85, какой вопрос? Можете написать мне в личку
0
0 / 0 / 0
Регистрация: 23.09.2021
Сообщений: 2
06.04.2022, 07:09
m-ch, вопрос о стоимости вашей программы... в личку я пока не могу написать видимо, и нигде вашего емейла не нашел. Мой емейл - логин + собака яндекс
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
06.04.2022, 09:03
smivan85, демо версия, на которую есть ссылка полностью функциональна и без ограничений
Кроме того, на excelworld, где выложена сама демо версия есть и другие мои варианты линейного раскроя, в т.ч. с открытым кодом.
0
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 1
09.08.2022, 12:41
SoftIce, SoftIce, а можно посмотреть код, пожалуйста?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
12.08.2022, 15:01
Yaszon, что именно Вам нужно, открытый код именно от программы SoftIce или от любого другого приложения по раскрою? Думаю, что в начале нужно оценить качество раскроя различных программ, если приложите свои исходные данные, то смогу их раскроить своей программой, сможете оценить качество раскроя
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
12.08.2022, 16:04
Во вложении примеры различных раскроев, как простых наборов данных так и сложных (большое количество различных деталей и большая вариативность решений)
Если есть альтернативные программы по раскрою, то сможете оценить качество решения своих программ или тех решений, которые здесь приложены (нужно обратить внимание, что в некоторых наборах указаны размеры торцевой кромки и размеры ширины реза и последний разрез обязателен, это нужно учесть при сравнении результатов различных программ)
Вложения
Тип файла: xlsx CSP_LP_cut_Wizard.xlsx (207.5 Кб, 30 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2022, 16:04
Помогаю со студенческими работами здесь

Контроль длины Label. А также VB6 Portable vs VB6 Installed.
Исходя из заголовка темы, вопроса 2: 1.) Как определить, что в Label уже не хватает места для Caption? Длина букв разная. Например,...

Возможно ли: выполнение подпрограммы в отдельном процессе, одновременное выполнение двух подпрограмм?
Всех приветствую :handshake: Пример @echo off call :PROG1 call :PROG2 exit /b :PROG1

Как ускорить выполнение кода? (Получение цвета пикселя, сравнение и выполнение действия)
Всем привет. Нужна консультация экспертов) Программа такая. Есть пиксель на экране, в нем то появляется яркий цвет, то темный (лампочка...

Ставлю задержку на выполнение действий в цикле - задержка ставится почему то на выполнение всего скрипта
Здравствуйте! Код элементарный: $s = $_POST; $s = preg_replace('/ {2,}/',' ',$s); for ($i = 0; $i < strlen($s);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru