Возвращение к проблеме с упаковкой

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

Подводя итог тому, что мне нужно сделать, предположим, что у меня есть пространство, подобное следующему:

+------------+---------+------------+
| 0          | 1       | 2          |
|            |         |            |
|            |         |            |
|            |         |            |
+------------+---------+------------+
| 3          | 4       | 5          |
|            |         |            |
|            |         |            |
+------------+---------+------------+
| 6          | 7       | 8          |
|            |         |            |
|            |         |            |
|            |         |            |
+------------+---------+------------+

в котором каждая угловая ячейка имеет размер 4x4, а центральная - 3x3 (так что остальные - 3x4 и 4x3). Затем у меня есть набор элементов для размещения внутри этих блоков, которые могут варьироваться от 1x1 до 3x3 (я не думаю, что 4x4 пока нужен, но это не должно ничего менять). Конечно, эти элементы не могут пересекать линии и должны полностью лежать в одном блоке.

Как лучше их распределить? Предполагая, что я предпочитаю не склеивать их все вместе, если в этом нет необходимости (например, не размещать два элемента вместе, если вокруг достаточно места, чтобы разместить их по отдельности). Я ищу простой алгоритм, в том числе потому, что ситуация довольно ограничена.

Дополнительный вопрос: предполагая наличие других блоков в дополнение к этим 9 (возможно, другим 3-4), как я могу расставить приоритеты для них по сравнению с новыми? (Я имею в виду, что просто не использует дополнительный блок, пока не будет достигнут порог заполнения).

Конечно, я ищу общую идею, никакой реализации :)


person Jack    schedule 23.12.2010    source источник
comment
Разрешается ли/желателен ли поворот элементов, если он дает лучшие результаты?   -  person Jon    schedule 23.12.2010
comment
нет, на самом деле это запрещено.. если размещаемый элемент имеет размер 2x3, то он должен быть размещен именно так, а не 3x2..   -  person Jack    schedule 23.12.2010
comment
Как выглядит вероятностное распределение типов блоков (1x1, 2x2, 3x3 и, возможно, 4x4)? От этого зависит оптимальное решение. И, таким образом, нужно ли рассматривать блоки 4x4 или нет, действительно влияет на оптимальное решение.   -  person Flinsch    schedule 23.12.2010
comment
У меня есть фиксированные наборы элементов, но не все они будут размещены внутри макета. Просто чтобы вы понимали: это здания города, и этот макет является макетом города, конечно, я знаю список всех доступных зданий, но не знаю, какие из них будут внутри конкретного города (поскольку они зависят от того, что игрок строит там).   -  person Jack    schedule 23.12.2010


Ответы (1)


Эта 2D-задача Bin Packing выглядит как NP hard.

Вот пара ваших вариантов:

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

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

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

person Geoffrey De Smet    schedule 23.12.2010
comment
По бонусному вопросу: смоделируйте базовые блоки как жесткие ограничения, а эти бонусные блоки — как мягкие ограничения. - person Geoffrey De Smet; 23.12.2010
comment
Можете ли вы обновить ссылку на Вот красивая картинка, показывающая пример того, что может пойти не так? - person tommy.carstensen; 26.05.2015
comment
Это очень важно для проблемы с упаковкой LEGO, над которой я работаю. Я заменяю кирпичи и пластины 1x1 на более крупные кирпичи и пластины, чтобы снизить стоимость. Спасибо за отличный пример! - person tommy.carstensen; 27.05.2015