Вариант двухмерной упаковки бункера?

Насколько я понимаю, упаковка мусорных ведер заключается в том, что вы пытаетесь уместить объекты заранее определенного и часто разных размеров в один или несколько контейнеров или «корзин» заранее определенного фиксированного размера. У меня проблема, когда у меня есть один контейнер фиксированного размера и фиксированное количество элементов, которые должны в него поместиться. Разница в том, что мои элементы не имеют фиксированного размера, но их размер может быть увеличен до любого кратного определенного количество. Например:

Допустим, у меня есть 3 объекта или элемента, которые должны идеально поместиться в контейнер размером 280x420, и размеры объектов необходимо изменить до кратных 140.

Следовательно, он мог бы поместиться так: (или перевернуть вертикально)

+----------+----------+
| 140x140  | 140x140  |
|          |          |
|          |          |
+----------+----------+
| 280x280             |
|                     |
|                     |
|                     |
|                     |
+---------------------+

или: (или перевернуть по горизонтали)

+----------+----------+
| 140x210  | 140x420  |
|          |          |
|          |          |
|          |          |
+----------+          |
| 140x210  |          |
|          |          |
|          |          |
|          |          |
+----------+----------+

В конце концов, размеры каждого ящика будут динамически определяться на основе статистики. (Например, если один элемент имеет статистику 90%, в то время как два других имеют статистику 2% и 8%, тогда, очевидно, 90% будут иметь больший квадрат.) Однако я стараюсь не усложнять это пока что, поэтому моя главная цель сейчас - просто создать алгоритм для заполнения контейнера.

Я исследовал разные алгоритмы, но еще не придумал идеального способа попробовать это. Есть указатели? Примеры? Существующие математические или другие похожие алгоритмы?


Более сложный пример: 6 предметов, контейнер 560х420. Элемент JSON: { "0": "432", "1": "389", "2": "403", "3": "190", "4": "215", "5": "832" } Один возможный рендеринг:

+----------+----------+---------------------+
| 140x280  | 140x140  | 280x140             |
| (0,1,    | (3 or 4) | (2)                 |
|    or 2) |          |                     |
|          |          |                     |
|          +----------+---------------------+
|          | 140x140  | 280x280             |
|          | (3 or 4) | (5)                 |
|          |          |                     |
|          |          |                     |
+----------+----------+                     |
| 280x210             |                     |
| (0,1, or 2)         |                     |
|                     |                     |
|                     |                     |
+---------------------+---------------------+

person user1960364    schedule 23.07.2013    source источник
comment
Когда вы говорите «определено на основе статистики», вы имеете в виду частоту возникновения? Просто любопытно.   -  person voithos    schedule 23.07.2013
comment
Кроме того, поскольку упаковка контейнеров в целом NP-сложна, ищете ли вы точное решение или достаточно ли аппроксимации?   -  person voithos    schedule 23.07.2013
comment
Под определением на основе статистики я подразумеваю, что я буду извлекать числа из базы данных, и те, у которых числа больше, получат большие квадраты. Не совсем уверен, о чем вы спрашиваете во втором вопросе. Но в основном, самый простой способ объяснить это, если бы вы представили, что пользовательский интерфейс / начальный экран Windows 8 Metro создается динамически и имеет плитки, масштабируемые в зависимости от того, как часто пользователь использует программу (или какое-либо другое доступное число / статистику). ). Каждая плитка масштабируется в несколько раз, чтобы соответствовать сетке. (Единственная разница в том, что у него нет ограничения ширины)   -  person user1960364    schedule 23.07.2013


Ответы (1)


Еще немного покопался и обнаружил, что то, что я ищу, известно как «кладка». Немного изучил это, а затем наткнулся на Isotope, плагин для jQuery, который (надеюсь) делает именно то, что я пытаюсь сделать. Это должно быть быстрое изучение.

http://isotope.metafizzy.co/

person user1960364    schedule 24.07.2013
comment
Это 1-мерный упаковщик. Также есть wookmark и упаковка. Мое решение - упаковщик 2d-bin. - person Gigamegs; 24.07.2013