Алгоритм организации прямоугольников в фиксированном прямоугольном контейнере - PullRequest
6 голосов
/ 25 февраля 2011

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

Задача состоит в том, чтобы собрать как можно меньше культур и заполнить весь контейнер (без пробелов).

Кто-нибудь сталкивался с алгоритмом, который делал бы что-то подобное?Любые ссылки, псевдокод высоко ценится.

Оставил вопрос общим, но я хотел бы применить его для организации фотографий на странице фиксированного размера.

Большое спасибо

Ответы [ 3 ]

5 голосов
/ 26 февраля 2011

Первый запуск с определением Алгоритм наилучшего соответствия :

  • Порядок прямоугольников от большого до малого в зависимости от размера

  • Возьмите первый прямоугольник и поместите его в контейнер, если он подходит

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

  • Если контейнер еще не заполнен, пройдите неиспользуемые прямоугольники в том же порядке, но на этот раз попробуйте обрезать.

Так вот, это не будет идеально. Вы можете попасть в ситуацию, аналогичную двум оставшимся решениям на этом изображении, где вы обрежете элемент «без пробела», даже если он не нужен:

enter image description here

Итак, во-вторых, добавьте метаэвристический алгоритм к результату первого, например Табу поиска или Имитация отжига . Если вы ищете библиотеку с открытым исходным кодом, чтобы сделать это для вас, взгляните на этот .

3 голосов
/ 25 февраля 2011

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

Рассмотрим только небольшое количество «макетов» для объединения небольшого числа прямоугольников в один большийrectangle. Затем рекурсивно рассмотрите способы объединения этих новых прямоугольников в еще большие прямоугольники, используя те же самые несколько макетов, пока не останется только один прямоугольник.

Это не гарантирует оптимального решения, потому чтонекоторые подмножества фотографий ограничены, чтобы сформировать прямоугольники в конечном решении.Но кажется вероятным, что это даст решения приемлемого качества.

Например, для 3 прямоугольников A, B и C рассмотрим следующие 4 макета:

A
B
C

ABC

AB   (i.e. A appears on the left)
AC

AA   (i.e. A appears on the top)
BC

Кадрирование будет происходить тольков первом туре, когда мы объединяем группы из 3 фотографий.Для этого шага каждое подмножество из 3 фотографий должно быть рассмотрено для каждого из 4 приведенных выше макетов, и для каждого из них должно быть определено оптимальное масштабирование и кадрирование с учетом того, что получаемый прямоугольник может быть увеличен или уменьшен последующими шагами .(Хороший выбор критерия оптимальности должен иметь свойство, чтобы идеальное количество масштабирования и обрезки для каждого из A, B и C при конкретной компоновке не зависело от того, насколько масштабируется результирующий прямоугольник, поэтому это не должно бытьпроблема.)

Последующие раунды объединения будут вести себя аналогично, но без учета обрезки.Для полного решения, раунд 2 будет включать в себя попытку объединить все наборы из 3 прямоугольников, созданных раундом 1, в котором все 9 фотографий различны, однако следование этому подходу приведет к экспоненциальному увеличению.Достаточно сохранить только несколько лучших аранжировок для каждого набора фотографий.Обратите внимание, что важно, чтобы каждая фотография появлялась как минимум в одном из прямоугольников, полученных в каждом раунде.

0 голосов
/ 25 февраля 2011

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

Я переопределю проблему, основываясь на комментариях. Нам дается прямоугольник размера X размером x и N прямоугольников разных размеров. Мы хотим полностью покрыть прямоугольник X N прямоугольниками. Нам разрешается изменять размеры изображений пропорционально исходным размерам. Мы хотим минимизировать количество областей, покрытых N прямоугольниками, которые также не охватывают область прямоугольника X.

Вот одна идея:

  • Если мы сможем найти упаковку, которая пропорциональна оригинальному размеру, мы можем просто увеличить или уменьшить ее и подогнать прямоугольник, и все готово
  • Учитывая некоторый алгоритм упаковки бинов, выполните двоичный поиск, чтобы найти минимальную постоянную масштабирования для X, чтобы мы могли упаковать все прямоугольники в бин.
  • Расширять и обрезать отдельные прямоугольники, пока пространство не будет заполнено

Не уверен, как это будет, но что-то попробовать.

...