Покриття сітки прямокутниками


15

У нас є сітка N1×N2 . У нас є колекція прямокутників на цій сітці, кожен прямокутник може бути представлений у вигляді бінарної матриці N1 -by- N2R . Ми хочемо покрити сітку тими прямокутниками.

Чи завершена версія рішення цього набору для вирішення проблеми NP?

  • Введення: Колекція C={R1,R2,,RL} прямокутників на сітці (розмір вводу: N1N2L ) і KN+
  • Вихід: Підмножина SC з |S|K і S що містять для кожної комірки щонайменше один прямокутник, що покриває її.

Наочний приклад проблеми

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

  • оптимальне покриття для деякої підпроблеми покриття першого N1n1 комірок .
  • 1D прямокутник, тобто інтервал, що охоплює залишки комірок.n1

Я не думаю, що проте DP може працювати для 2D проблеми: для 1D проблеми у вас є підпроблеми для вирішення, але для 2D у вас є ( N 1 + N 2N1підпроблеми (кількість решіток решітки Північно-Східної сітки).(N1+N2N2)

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

Будь-яка допомога чи підказка вітається.


3
Підказка: шукайте скорочення від Vertex Cover, в якому ми створюємо за | V | сітка блоків, кожен з яких являє собою 3 на 3 блок матричних елементів. Кожен ряд блоків відповідає ребру і міститиме 2 спеціально розроблені блоки, що відповідають його кінцевим вершинам. Для кожної вершини буде висота - 3 | Е | , прямокутник шириною-1, який проходить через центральний стовпчик стовпця 3-х-3-х блоків, що відповідає цій вершині. Як ви можете змусити загальну суму будь-якого дійсного покриття k -vertex точно | Е | ( | V | + 3 )|E||V|3|E|k ? (Вам знадобляться інші прямокутники.)|E|(|V|+3)+k
j_random_hacker

Я думаю, що це, мабуть, вправа на домашнє завдання, тому я поки що небажано сказати набагато більше, ніж це. Формула витрат, яку я дав, містить у собі деякі підказки. Майте на увазі, що ви можете примусити принаймні 1 з декількох прямокутників, зробивши їх єдиними прямокутниками, які охоплюють якийсь елемент матриці (корисний також окремий випадок із 1 прямокутника). FWIW, я також спробував використовувати -бі- | V | спершу сітка, де вибір вершини відповідав би "перекреслюванню" рядка та відповідного стовпця, але не міг зрозуміти, як змусити вибирати i -й стовпець, коли вибрано i -й ряд або навпаки. |V||V|ii
j_random_hacker

У мене була така ж проблема з -бі- | V | сітка. Я думаю, я бачу, яке рішення ви маєте на увазі (хоча у мене немає точно такої самої формули витрат), дивіться мою редагування. До речі, це не вправа в домашніх умовах. Це комбінаторна проблема, яка опинилася в реальній інженерній проблемі. Ми вирішуємо це за допомогою MIP, але я хотів бути впевненим, що проблема була NP (і не мала рішення для поліномів). У будь-якому випадку, якщо ви підтвердите, що рішення є правильним, ви можете поставити підказку як відповідь, і я підтверджу його (оскільки я знайшов рішення з вашою допомогою). |V||V|
Янв

1
Так, це майже саме зниження, яке я мав на увазі! :) Я зробив ваші прямокутники типу "4" трохи довше на одному кінці: там, де ваша займає 2 комірки в блоці, моя займає всі 3. Замість спеціальних прямокутників типу "тип 3" для кінцевих блоків я використовую весь верхній ряд, просто як "тип 2" прямокутники для . Нарешті, у мене є прямокутник, що займає ліві по центру та внизу ліві клітинки в межах кожного лівого кінцевого блоку (горизонтально перевернутий для кожного правого кінцевого блоку). Таким чином, ви можете охопити нижню 2 рядок усіх блоків, включаючи та між кінцевими блоками, використовуючи a або візерунок. a<j<b|==|
j_random_hacker

1
Мені подобається твій -по- 3 | V | ідея скорочення. З цим, на відміну від 3 | Е | -по- 3 | V | скорочення, можуть бути рішення з мінімальними витратами, які не відповідають обкладинці вершин, але всі такі рішення можуть бути перетворені на рівні (що мінімум) рішення витрат, використовуючи той же аргумент, що і в останньому пункті, тому це не проблема для зменшення :)|E|3|V|3|E|3|V|
j_random_hacker

Відповіді:


4

Завдяки натяку j_random_hacker, я знайшов рішення зменшити обкладинку вершини до проблеми сітки:

Складаємо -бі- | V | сітка 3-х-3 блоків, тобто 3 | Е | -по- 3 | V | сітка з вершинами, упорядкованими у вигляді стовпців { v 1 , , v N 1 } та ребрами, упорядкованими у вигляді рядків { e 1 , , e N 2 } . Ми побудуємо прямокутники на цій сітці (креслення нижче допоможе багато зрозуміти різні використовувані прямокутники)|E||V|3|E|3|V|{v1,,vN1}{e1,,eN2}

enter image description here

|V|

(ei,vj)ei=(va,vb)

  • j<ab<j
  • j=aj=b ), це покриття прямокутника 3 на 1 лівого (відповідно правого) стовпця блоку.
  • a<j<b

|E||V|прямокутників типу 2, ці прямокутники обов'язково вибирати, оскільки кожен буде єдиною кришкою для верхнього лівого (або верхнього правого) кута блоку, в якому він знаходиться.

(ei,va)(ei,vb)

  • (ei,va)(ei,vb)

2|E|

Тепер для кожного краю будуємо прямокутники типу 4, між кінцевими блоками ми маємо два прямокутники для другого ряду:

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

4|E|

Отже, тепер для покриття сітки:

  • |E|(|V|+2)|V|+4|E|

Щоб покрити для даного краю частину між крайніми кінцевими блоками, ще не накритими (другий та третій ряди ряду блоків), ми можемо використовувати:

  • чотири прямокутника типу 4.
  • один прямокутник типу 1 та два прямокутники типу 4.

Зауважте, що в будь-якому випадку нам потрібні принаймні два прямокутники типу 4.

|E|(|V|+4)+k

  • |E|(|V|+2)

  • |E|(|V|+4)+k|E|(|V|+4)+k

|E|(|V|+6)+|V|9|V||E|

|E|3|V||V|+4|E|3|E|+k

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.