2D упаковка с препятствиями - PullRequest
1 голос
/ 26 марта 2010

Кто-нибудь знает эффективный алгоритм перемещения прямоугольников в квадрате, который содержит препятствия?

Прямоугольники:

  • может вращаться
  • может двигаться / телепортироваться
  • не должно сталкиваться с препятствиями (черные квадраты)

Препятствия:

  • не может быть перемещено
  • может быть добавлено куда угодно

Цель: при добавлении препятствия попытайтесь переместить прямоугольники, чтобы они не сталкивались ни с одним из препятствий.

Состояние 1 http://img440.imageshack.us/img440/6995/59737192.png

Состояние 2 http://img87.imageshack.us/img87/2336/28560269.png

Состояние 3 http://img406.imageshack.us/img406/5469/30594959.png

Состояние 4 http://img683.imageshack.us/img683/81/88927554.png

Состояние 5 http://img25.imageshack.us/img25/3657/83405570.png

1 Ответ

1 голос
/ 26 марта 2010

Взгляните на это: Динамическое программирование - Самый большой квадратный блок
По сути, учитывая прямоугольники, вы добавляете препятствие и удаляете квадрат, которому мешает препятствие.
Затем запустите связанный алгоритм (с «ограничителями», являющимися препятствиями и существующими квадратами), и если будет найдено место, которое может соответствовать квадрату размера NxN (N - большая часть прямоугольника), и добавьте прямоугольник) .
Это можно оптимизировать немного дальше, и я доверяю вам это. (По сути - прямоугольники не всегда будут располагаться в наиболее оптимальном месте. Это можно исправить, по крайней мере, до некоторой степени)
Это решение даст вам O (n) время и пространство для каждого добавленного препятствия.
Возможные модификации, которые вы также должны рассмотреть: не перестраивайте массив для каждого препятствия, но постройте его для массива пустот препятствий и изменяйте его по мере продвижения. Это сохранит прохождение всего массива для каждого препятствия.

...