Покрытие сетки прямоугольниками

15

У нас есть сетки. У нас есть набор прямоугольников на этой сетке, каждый прямоугольник может быть представлен как двоичная матрица -by- . Мы хотим накрыть сетку этими прямоугольниками.N 1 N 2 RN1×N2N1N2р

Является ли версия решения этого набора проблем NP-полной?

  • Ввод: коллекция прямоугольников на сетке (размер ввода: ) иN 1 N 2 L K N +Сзнак равно{р1,р2,...,рL}N1N2LКN+
  • Вывод: Подмножество с и содержащее для каждой ячейки хотя бы один прямоугольник, покрывающий ее.| S | K SSС|S|КS

Наглядный пример проблемы

Я обнаружил, что одномерный случай ( ) может быть решен за полиномиальное время с помощью динамического программирования: любое оптимальное покрытие будет объединениемN2знак равно1

  • оптимальное покрытие для некоторой подзадачи покрытия первых ячеек .N1-N1
  • одномерный прямоугольник, то есть интервал, охватывающий оставшиеся ячеек.N1

Однако я не думаю, что DP может работать для двумерной задачи: для одномерной задачи вам нужно решить подзадач, но для 2D у вас есть \ binom {N_1 + N_2} {N_2} подзадач (количество северо-восточной решетки). дорожки на сетке).( N 1 + N 2N1(N1+N2N2)

Я думаю, что проблема может быть NP, но я не уверен (хотя это кажется сложнее, чем P), и мне не удалось найти полиномиальное сокращение от NP-полной задачи (3-SAT, Vertex Cover, ...)

Любая помощь или подсказка приветствуется.

Yann
источник
3
Подсказка: ищите сокращение от Vertex Cover, в котором мы создаемпосетка блоков, каждый из которых представляет собой блок элементов матрицы 3 на 3. Каждый ряд блоков соответствует ребру и будет содержать 2 специально разработанных блока, соответствующих его вершинам конечной точки. Для каждой вершины будет высота -прямоугольник ширины 1, который проходит через центральный столбец столбца 3 × 3 блоков, соответствующих этой вершине. Как вы можете заставить сумму любого действительного покрытия вершины стоить ровно ? (Вам понадобятся другие прямоугольники.)| V | 3 | E | к | E | ( | V | + 3 ) + k|E||V|3|E|К|Е|(|В|+3)+К
j_random_hacker
Я думаю, что это, вероятно, домашнее задание, поэтому я не очень хочу сейчас говорить намного больше. У формулы стоимости, которую я дал, есть некоторые подсказки в этом. Имейте в виду, что вы можете задать по крайней мере 1 из нескольких прямоугольников, сделав их единственными прямоугольниками, которые покрывают некоторый элемент матрицы (особый случай 1 прямоугольника также полезен). FWIW, я также пытался использоватьпосначала сетка, где выбор вершины соответствовал бы «вычеркиванию» строки и соответствующего столбца, но не мог понять, как заставить столбец быть выбранным при выборе строки или наоборот. | V | я я|В||В|яя
j_random_hacker
У меня была такая же проблема спосетка. Я думаю, что вижу, какое решение вы имеете в виду (хотя у меня нет точно такой же формулы затрат), см. Мое редактирование. Кстати, это не домашнее задание. Это комбинаторная проблема, возникшая в реальной инженерной проблеме. Мы решаем это с помощью MIP, но я хотел убедиться, что проблема была в NP (и не имела полиномиального решения). В любом случае, если вы подтвердите, что решение действительно, вы можете указать подсказку в качестве ответа, и я проверю его (поскольку я нашел решение с вашей помощью). | V ||В||В|
Ян
1
Да, это почти то сокращение, которое я имел в виду! :) Я сделал ваши прямоугольники типа 4 немного длиннее на одном конце: там, где ваши занимают 2 ячейки в блоке, мои занимают все 3. Вместо специальных прямоугольников типа 3 для конечных блоков я использую весь верхний ряд, просто как прямоугольники типа 2 для . Наконец, у меня есть прямоугольник, занимающий центральную левую и нижнюю левую ячейки внутри каждого левого конечного блока (перевернутый по горизонтали для каждого правого конечного блока). Таким образом, вы можете покрыть 2 нижних ряда всех блоков, включая и между конечными блоками, используя шаблон или . a<j<б|==|
j_random_hacker
1
Мне нравится твояматрица с размерностьюидея сокращения. С этим, в отличие отматрица с размерностьюсокращение, могут быть решения с минимальными затратами, которые не соответствуют покрытиям вершин - но все такие решения могут быть превращены в решения с одинаковой (минимальной) стоимостью, используя тот же аргумент, что и в вашей последней точке, так что это не проблема для сокращения :)3 | V | 3 | E | 3 | V ||Е|3|В|3|Е|3|В|
j_random_hacker

Ответы:

4

Благодаря подсказке j_random_hacker, я нашел решение, чтобы уменьшить покрытие вершин для решения Grid:

Мы делаем по | V | сетка из 3х3 блоков, т.е. 3 | E | по 3 | V | сетка с вершинами, упорядоченными в виде столбцов { v 1 , , v N 1 }, и ребрами, упорядоченными в виде строк { e 1 , , e N 2 } . На этой сетке мы построим прямоугольники (рисунок ниже поможет понять, какие прямоугольники используются)|Е||В|3|Е|3|В|{v1,...,vN1}{е1,...,еN2}

введите описание изображения здесь

|В|

(ея,vJ)еязнак равно(va,vб)

  • J<aб<J
  • Jзнак равноaJзнак равноб
  • a<J<б

|Е||В|

(ея,va)(ея,vб)

  • (ея,va)(ея,vб)

2|Е|

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

  • Один идет от центральной площади первого блока к центрально-левому квадрату второго блока.
  • Один идет от центрально-правой площади первого блока к центральной площади второго блока.
  • И те же два прямоугольника для третьего ряда.

4|Е|

Итак, теперь, чтобы покрыть сетку:

  • |Е|(|В|+2)|В|+4|Е|

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

  • четыре прямоугольника типа 4.
  • один прямоугольник типа 1 и два прямоугольника типа 4.

Обратите внимание, что в любом случае нам нужно как минимум два прямоугольника типа 4.

|Е|(|В|+4)+К

  • |Е|(|В|+2)

  • |Е|(|В|+4)+К|Е|(|В|+4)+К

|Е|(|В|+6)+|В|9|В||Е|

|Е|3|В||В|+4|Е|3|Е|+К

Yann
источник