|
Заблокирован
|
|
Выполнение оптимизации на 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
|
|
| 08.09.2015, 21:44 | |
|
Ответы с готовыми решениями:
34
Перебор по раскрою квадрата в Visual Basic 6.0 Резак для бумаги применительно к раскрою стеклотекстолита Windows 2000 Rus VB6, VB6 Resource Editor отсутствует |
| 09.01.2016, 23:41 | |||
|
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й странице
1
|
|||
|
es geht mir gut
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
|
|
| 10.01.2016, 00:07 | |
|
m-ch, у тебя пила тоньше.
0
|
|
| 10.01.2016, 00:50 | |||
|
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 минут Я размер (ширину) реза занулил
1
|
|||
|
|
||
| 10.01.2016, 07:29 | ||
|
Мы в этой теме вроде как не пиписками меримся, а знаниями делимся.
0
|
||
| 10.01.2016, 11:04 | ||
|
Знающему человеку не составит труда реализовать его на любом языке программирования. Ссылки на методологию с использованием линейного программирования я дал в 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, и за одинаковое время алгоритм решения задачи о рюкзаке динамическим программированием находит решение как правило лучше.
0
|
||
| 03.02.2016, 02:18 | ||
|
1
|
||
|
|
||
| 03.02.2016, 08:46 | ||
|
А вот в чем преимущество линейного алгоритма от динамического? Т.к. в демо нет возможности сравнить, скажите, там быстрее считает или точнее? Экспериментировал с настойками Быстро->Очень медленно, вроде на точность расчетов не влияет? И ещё вопрос, с "Экспорт в PDF" ясно, там очевидно формируется отчет в PDF. А вот кнопка "Создать отчет" что делает ( в полной версии )?
0
|
||
| 03.02.2016, 22:37 | |||
|
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 позволяет находить оптимальное решение. Во вложении примеры получаемых раскроев методом DP и LP, а также видео, как производится раскрой. Метод LP как правило позволяет находить решение лучше, с уменьшением размера заготовки это становится более заметно, также видно как увеличивается скорость решения при уменьшении размера заготовок.
3
|
|||
|
0 / 0 / 0
Регистрация: 23.09.2021
Сообщений: 2
|
|
| 03.04.2022, 12:28 | |
|
m-ch, как с вами связаться?
0
|
|
|
0 / 0 / 0
Регистрация: 23.09.2021
Сообщений: 2
|
|
| 06.04.2022, 07:09 | |
|
m-ch, вопрос о стоимости вашей программы... в личку я пока не могу написать видимо, и нигде вашего емейла не нашел. Мой емейл - логин + собака яндекс
0
|
|
| 06.04.2022, 09:03 | |
|
smivan85, демо версия, на которую есть ссылка полностью функциональна и без ограничений
Кроме того, на excelworld, где выложена сама демо версия есть и другие мои варианты линейного раскроя, в т.ч. с открытым кодом.
0
|
|
|
0 / 0 / 0
Регистрация: 09.08.2022
Сообщений: 1
|
|
| 09.08.2022, 12:41 | |
|
SoftIce, SoftIce, а можно посмотреть код, пожалуйста?
0
|
|
| 12.08.2022, 15:01 | |
|
Yaszon, что именно Вам нужно, открытый код именно от программы SoftIce или от любого другого приложения по раскрою? Думаю, что в начале нужно оценить качество раскроя различных программ, если приложите свои исходные данные, то смогу их раскроить своей программой, сможете оценить качество раскроя
0
|
|
| 12.08.2022, 16:04 | |
|
Во вложении примеры различных раскроев, как простых наборов данных так и сложных (большое количество различных деталей и большая вариативность решений)
Если есть альтернативные программы по раскрою, то сможете оценить качество решения своих программ или тех решений, которые здесь приложены (нужно обратить внимание, что в некоторых наборах указаны размеры торцевой кромки и размеры ширины реза и последний разрез обязателен, это нужно учесть при сравнении результатов различных программ)
1
|
|
| 12.08.2022, 16:04 | |
|
Помогаю со студенческими работами здесь
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"
Извлеките архив и вы увидите. . .
|