Упаковка кусков данных разного размера в несколько корзин - PullRequest
3 голосов
/ 23 декабря 2010

РЕДАКТИРОВАТЬ: Кажется, что эта проблема называется "проблема режущего материала"

Мне нужен алгоритм, который дает мне (пространство) оптимальное расположение кусков в лотках.Одним из способов было бы поместить большие куски в первую очередь.Но посмотрите, как этот алгоритм не работает в этом примере:

Chunks        Bins
-----------------------------
AAA BBB CC DD (       ) (   )

Algorithm     Result
-----------------------------
biggest first (AAABBB ) (CC )
optimal       (AAACCDD) (BBB)

«Самый большой сначала» не может вписаться в DD.Может быть, это поможет построить таблицу следующим образом:

Size 1: ---
Size 2: CC, DD
Size 3: AAA, BBB

Size 4: CCDD
Size 5: AAACC, AAADD, BBBCC, BBBDD
Size 6: AAABBB

Size 7: AAACCDD, BBBCCDD
Size 8: AAABBBCC, AAABBBDD
Size 10: AAABBBCCDD

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

Это, в основном, вариант проблемы bin-pack . Эта проблема, как известно, является NP-трудной, поэтому не ожидайте найти эффективный оптимальный алгоритм для сложных случаев (т. Е. Со многими объектами и ячейками).

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

Это довольно легко реализовать: просто возьмите первый объект, а затем рекурсивно перезапустите алгоритм с первым объектом, размещенным в каждом из бинов по очереди (т.е. вычитая размер объекта из доступного пространства бина). Наконец, вам просто нужно отследить лучшее из найденных «решений» и вернуть его в качестве окончательного ответа, как только вы попробуете все комбинации.

Вы также можете ускорить выполнение этого алгоритма:

  • Считать все объекты одинакового размера эквивалентными
  • Сокращение дерева поиска (то есть возврат рано из ветви), если вы не можете превзойти текущее лучшее решение, например. когда вы уже нашли идеальную посадку

Обновлено на основе комментариев к размеру проблемы

Учитывая, что, похоже, у вас есть очень большое количество блоков, вы можете попробовать следующее:

  • Подберите самые большие 10-20 кусков, используя исчерпывающий поиск, как указано выше
  • Распределите остаток, используя метод наибольшего соответствия
2 голосов
/ 24 декабря 2010

Микера прав: эта множественная проблема Рюкзак (вариант проблемы упаковки в мусорное ведро) составляет NP hard .

Вот несколько вариантов (скопировано из моего ответа на аналогичный вопрос):

  • Грубая сила, а еще лучше - ветвление и переплетНе масштабируется (вообще!), Но найдет для вас оптимальное решение (хотя, вероятно, не в наших жизнях).

  • Детерминированный алгоритм: сортируйте куски по наибольшему размеру и проходите черезэтот список один за другим и назначьте ему лучшее оставшееся место.Это закончится очень быстро, но решение может быть далеко от оптимального (или выполнимого). Вот хорошая картинка, показывающая пример того, что может пойти не так. Но если вы хотите, чтобы все было просто, это путь.

  • Метаэвристика, начинаяиз результата детерминированного алгоритма.Это даст вам очень хороший результат в разумные сроки, лучше, чем люди придумали.В зависимости от того, сколько времени вы уделяете этому и сложности проблемы, это может быть или не быть оптимальным решением.Существует несколько библиотек, таких как Drools Planner (java с открытым исходным кодом).

1 голос
/ 23 декабря 2010

Общий лучший алгоритм для этой проблемы еще не существует (см. проблема упаковки бинов ). Вы можете найти несколько разных подходов в Википедии и / или поиск в Google «проблемы с упаковкой в ​​мусорное ведро», и, возможно, «проблема с рюкзаком» также может помочь.

0 голосов
/ 23 декабря 2010

Алгоритм Дональда Кнута Dancing Links быстр в поиске решений проблем "точного покрытия".

...