Страницы: 1 2 След.
RSS
Как разложить фрукты по ящикам, vba
 
Здравствуйте!
подскажите, каким макросом можно разложить фрукты по ящикам
т.е. поменять колонки местами



Спасибо
 
Где данные? По схеме не понятно из чего что получить.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
данные в файле
нужно упаковать все фрукты в наименьшее количество ящиков
в разные ящики помещаются только определенные фрукты (какие куда помещаются обозначены "X" в таблице "есть")
решением является - ящики 2+3 (два ящика)
но не 3 + 4 + 5 (тоже все помещается, но это три ящика)
Изменено: KUDRIN - 27.06.2014 16:29:01
 
В каком файле данные? В Книга1 та же схема, что и у Вас на скриншоте и всё.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
данные - в файле табличка "есть" и в сообщениях #1 и #3
какие данные требуются дополнительно?
 
Не понимаю. Товар по ящикам непонятной ёмкости в непонятном кол-ве кто-то условно раскидывает иксами. Исходя из Вашей логики:
1) ищем ящик с макс кол-ом Х;
2) ищем ящик с остальными фруктами.
У меня пока всё. (предполагаю, что пример не соотв. действ. и придётся после решения по данному примеру искать решение по реальному - могу ошибаться, простите)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan пишет:
Товар по ящикам непонятной ёмкости в непонятном кол-ве кто-то условно раскидывает иксами.
количество каждого товара 1 шт
в ящик1 помещается фрукт1 и фрукт5
в ящик2 помещаются фрукты 2 3 5 6
и т.д.
никто условно не раскидывает, уже есть исходные данные - какой фрукт в какой ящик помещается (или наоборот - в какой ящик помещаются какие фрукты)
осталось только выбрать конкретные ящики (минимальное количество ящиков), в сумме в которые поместятся все фрукты
прошу прощения, если изначально описал задачу непонятно
Изменено: KUDRIN - 27.06.2014 17:02:21
 
Смысл задачи понял.
Какие ограничения по исходным данным?
Сколько различных фруктов и ящиков может быть?

Если фруктов не более 30, то описание ящика вписывается в Long с дальнейшими бинарными операциями, что сильно упрощает решение.
Если ящиков не более 20-25, то можно решить полным перебором всех сочетаний.

Еще вопрос, если ящики перекрывают друг друга (одни и теже фрукты находятся в разных ящиках) допустимо ли их совместое использование?
Изменено: MCH - 27.06.2014 18:58:33
 
а какие могут быть ограничения?
есть только "X" или ""
фруктов 200, ящиков 1500
(таким образом прямой перебор сочетаний наверное будет долгим, хотя если его построить на коллекции - может быть в разы быстрее получится)
на последний вопрос ответ "да"
Изменено: KUDRIN - 27.06.2014 19:09:22
 
Цитата
KUDRIN пишет: фруктов 200, ящиков 1500
При таких ограничениях не знаю какой алгоритм применить. Нужно думать в сторону динамического программирования.

При малых, смогу реализовать перебором. Если решение находится быстро (в несколько ящиков), то его можно будет использовать и до 50-100 ящиков. ЧИСЛКОМБ(100;5) = 75287520 - нормальное число для перебора за разумное время.
 
Пример решения 30 фруктов на 40 ящиков
 
МСН спасибо! хорошенький такой вариант, хоть и с переполнением если фруктов > 61
Изменено: KUDRIN - 27.06.2014 22:19:40
 
Цитата
KUDRIN пишет: если фруктов > 61
2^61 не влезает в переменную типа Long (в текущей реализации можно использовать не более 31 фрукт), решается делением на несколько чисел, код немного увеличится
Изменено: MCH - 29.06.2014 20:10:10
 
MCH, а как работает вот этот код:
Код
 maxBox = maxBox Or arrbox(i)
в чем его суть?
А, всё, разобрался, бинарное сложение
Изменено: hohlick - 27.06.2014 21:19:16 (дошло)
F1 творит чудеса
 
Цитата
JayBhagavan пишет:
1) ищем ящик с макс кол-ом Х;
2) ищем ящик с остальными фруктами.
сделал на массивах по этому алгоритму.
код очень топорный, не вылизанный еще. для начала хотя бы работает
в Вашем примере, МСН, находит 8 ящиков, вместо 6 идеальных. http://s020.radikal.ru/i713/1406/d0/4d26f6b0f5ac.png
в моей реальной табличке на 195 фруктов и 1216 ящиков нашлось 20 ящиков
Изменено: KUDRIN - 27.06.2014 22:34:24
 
Реализовал решение для более 31 фрукта, можно использовать 100 и более фруктов
Изменено: MCH - 27.06.2014 23:08:38
 
круто!
в AR72 нет фруктов63 :)
 
Сползло при копировании, файл перезалил
 
спасибо за помощь, МСН     (теперь на фруктах100 нет Х)
интересно, сколько будет считаться
160 фруктов и 1200 ящиков уже 20 минут считает. ради интереса оставлю на пару часов или на ночь
---
за восемь часов не закончил считать
Изменено: KUDRIN - 28.06.2014 07:51:45
 
Выложите реальные исходные данные, может найдется какое нибудь еще решение
 
пожалуйста - реальные данные http://rghost.ru/56613177 (700 кб)
в первом столбце количество ящиков. есть нули (т.е. нет крестиков изначально).
для проверки макросов пока просто удалял эти строки либо доделывал костыль по пропуску таких строк
Изменено: KUDRIN - 27.06.2014 23:59:10
 
Сделал "жадным" алгоритмом на своих данных (кнопка "Go2"), на каждом шаге выбираем наилучший ящик, который максимально добавляет новые фрукты
Скорость существенно увеличилась, но не факт, что будет найдено оптимальное решение

Чуть позже адаптирую под реальные данные
Изменено: MCH - 28.06.2014 12:43:46
 
"Жадный алгоритм" на реальных данных: https://yadi.sk/d/LkyvuGJWVC5Dj
считает достаточно быстро, находит 17 ящиков
Изменено: MCH - 28.06.2014 11:50:49
 
отличная работа МСН
есть чему поучиться, спасибо!
 
немного поправил вывод (избавился от формул). Ссылку сверху обновил
 
совершенно не в упрёк нынешней администрации (они и так трудятся как "рабы на галерах" (с)) :)
но не кажется ли вам, что как-то подзабросили мы Копилку идей?
и что это решение МСН вполне её достойно.
так же, впрочем, как многие другие решения многих других форумчан...

что нужно сделать, чтобы Копилка ожила?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Нужно предлагать))
 
По поводу решений, достойных "Копилки":
Тут так устроено, что отдельное сообщение нельзя перенести в "Копилку". Для этого нужно создать ТЕМУ, а вот уже саму тему переместить можно.
 
Цитата
KUDRIN пишет: за восемь часов не закончил считать
"Жадный" алгоритм нашел решение из 17 ящиков
Чтобы перебрать все сочетания 17 из 1216 (ЧИСЛКОМБ(1216;17) = 6,98246317507125E+37) потребуется чуть больше времени
Я даже чисел таких не знаю
 
Цитата
MCH пишет: "Жадный" алгоритм нашел решение из 17 ящиков
да, спасибо - изучаю код Вашего макроса
стал разбираться почему различие между 20 и 17 ящиками, оказалось у меня ошибка в коде #15, пару строк там надо добавить
Изменено: KUDRIN - 29.06.2014 20:11:22
Страницы: 1 2 След.
Наверх