Обобщение алгоритма для плитки домино?

на этот предыдущий вопрос ОП задал следующую задачу:

учитывая прямоугольную сетку, где некоторые квадраты пусты, а некоторые заполнены, какое наибольшее количество домино 2x1, которые могут быть помещены в мир так, что никакие два домино не перекрываются и домино не находится на заполненном квадрате?

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

мой вопрос является обобщением этого раньше:

дали прямоугольная сетка, где некоторые квадраты пусты, а некоторые заполнены, каково наибольшее количество M x N домино (для данного M и N), которые могут быть помещены в мир так, что никакие два домино не перекрываются и никакое домино не находится на заполненном квадрате?

Я не вижу, как преобразовать это в проблему соответствия, как это было сделано в предыдущем случае. Однако я также не вижу никакой конкретной причины, по которой эта проблема сразу будет NP-трудной, поэтому может быть полиномиальное временное решение проблема.

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

спасибо!

5 ответов


эта проблема определенно NP-трудна, и я могу это доказать. Существует сокращение от 3-SAT до этой проблемы. В частности, это сокращение от 3-SAT до подзадачи этой проблемы, в которой домино-1x3. Могут также быть другие сокращения для других конкретных размеров, но это определенно работает.

по сути, в этой редукции мы будем использовать позиции домино для кодирования true или false. В частности, я собираюсь принять ту же нотацию, что и другое решение, которое заключается в том, что я буду использовать звездочки для обозначения открытых пространств на сетке. Я также буду использовать наборы из трех заглавных букв для представления домино и строчных букв для представления "сигналов", которые являются пробелами, которые могут или не могут быть заполнены в зависимости от состояния системы.

чтобы встроить проблему 3-SAT в это пространство, нам понадобится набор того, что я назову гаджетами, которые позволяют только определенным состояниям быть возможными. Большинство из этих гаджетов будут иметь фиксированный количество домино в них. Исключением будут гаджеты, которые представляют собой предложения, которые будут иметь одно дополнительное домино, если предложение истинно (удовлетворено), но не когда оно ложно (неудовлетворено). Мы можем соединить эти устройства, используя пути. Вместе это позволит нам построить схему 3-SAT. У нас будет базовое количество домино, так как каждый путь и гаджет будут принимать стандартное количество домино, мы можем добавить их, чтобы получить базовый номер k, а затем каждый гаджет предложения может иметь один дополнительный домино, если это правда, поэтому, если все предложения могут быть сделаны истинными (и, следовательно, выражение удовлетворено) и есть n предложений, то максимальное количество домино будет n+k. Если нет, то максимальное число будет меньше n+k. Это основная форма сокращения. Далее я опишу гаджеты и приведу примеры.

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

****

это может быть покрыто одним домино, как

AAA* or *AAA

очевидно, что это не может быть покрыто 2 домино и покрытие его 0 домино никогда не будет максимальным. Для моих целей мы рассмотрим выступ для представления значения " false "и отсутствие выступа для представления"true". Таким образом, мы можем рассматривать эту часть как несущую два сигнала:

x**y

и в этом случае только один из x или y будет быть покрытым, поэтому мы можем рассматривать сигналы как x и логическое не x. Для наших целей то, что покрыто, ложно, то, что не покрыто, истинно. Затем, мы можем передать сигналы просто через прямые можем изогнутые пути. Если у нас есть

x*****y

у нас снова будет ровно два домино и в результате либо x, либо y будут покрыты, но не оба.

***y
*
*
x

будет иметь точно такое же поведение. Таким образом, мы можем использовать это для создания длинных и изогнутых путей в длины которых кратны 3. Однако не все длины, которые мы могли бы использовать, являются инкрементами 3, поэтому нам нужен дополнительный гаджет для перемещения на другое расстояние. Я называю это гаджет fiddler, и его единственная цель-переместить сигнал на несколько неравномерные расстояния, чтобы сделать соединение успешным. Свой входной сигнал приходит от x и выход идет к y и он просто передает такой же сигнал вперед. Выглядит это так:

 ***y
 *
**x

он всегда содержит ровно два домино и является заполняется одним из следующих двух способов:

 BBB*     ABBB
 *        A   
AAA      *AX  

если мы собираемся моделировать 3-SAT, однако, нам нужно больше, чем это. В частности, нам нужен какой-то способ моделирования положений. Для этого у нас есть гаджет, где можно упаковать одно дополнительное домино, если предложение истинно. Предложение будет истинным, если один или несколько его входных данных истинны. В этом случае это означает, что мы можем упаковать одно дополнительное домино, когда хотя бы один из входов не выступает. Это будет выглядеть это:

*x*y*
  *
  z

если мы добавим путь к каждому для ясности, то это выглядит так:

 * *
 * *
 * *
*****
  *
  ****

если x, y и z все ложные, то все они будут иметь выступы, и он будет заполнен, как это:

 A B
 C D
 C D
*C*D*
  *
  EEEF

где остальные домино A, B и F продолжают путь вниз где-то. Если хотя бы один из входов истинен, то мы можем упаковать одно дополнительное домино (G) следующим образом:

 C B         A D         A B
 C D         C D         C D
 C D    or   C D    or   C D
GGGD*       *CGGG       *CGD*
  *           *           G
  EEEF        EEEF        GEEE

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

 C D
 C D
 C D
*****
  *
  *EEE

и, как вы можете видеть, мы можем вставить только одно дополнительное домино в пустое пространство, а не два.

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

y*** ***z
   * *
   ***
   ***
    x

в этом гаджет x-это вход, а Y и z-выходы. В этом гаджете мы всегда можем упаковать 5 домино. Если x выступает, чем упаковка 5 домино всегда будет требовать покрытия y и z, а также. Если x не выступает, то покрытие y и z не требуется. Упаковка, где x не выступает, выглядит следующим образом:

yAAA BBBz
   C D  
   CED 
   CED  
    E 

когда x выступает (мы используем X для обозначения конца домино, выступающего в пространство x), максимальная упаковка обязательно охватывает как y, так и z:

AAAC DBBB
   C D
   C*D
   EEE
    X

я возьму на себя минуту, чтобы отметить, что можно было бы упаковать это с пятью домино, когда x не выступает таким образом, что y или z выступают. Однако это приведет к тому, что термины, которые могут быть истинными (не выступающими), станут ложными (выступающими). Разрешение некоторым терминам (не переменным, а фактическим терминам в предложениях) отличаться по значению только тем, что становится ложным без необходимости, никогда не приведет к возможности удовлетворить неудовлетворительное в противном случае выражение. Если наше выражение 3-SAT было (x | y / z) & (!x / y/!z) тогда позволяя и x и !если x будет ложным, это только усложнит дело. Если бы мы допустили, чтобы оба конца чего-то были истинными, это привело бы к неправильным решениям, но мы не делаем этого в этой схеме. Чтобы сформулировать это с точки зрения нашей конкретной проблемы, излишнее выступание никогда не приведет к тому, что больше домино сможет быть упаковано позже.

С путями и этими тремя гаджетами мы теперь можем решите плоскую 3-SAT, которая была бы подзадачей 3-SAT, где, если мы нарисуем граф, где термины и предложения являются вершинами, и есть ребро между каждым термином и каждым предложением, которое содержит этот термин, что граф является плоским. Я считаю, что planar 3-SAT, вероятно, NP-hard, потому что planar 1-in-3-SAT, но в случае, если это не так, мы можем использовать гаджеты для пересечения сигналов. Но это действительно довольно сложно (если кто-то видит более простой способ, пожалуйста, дайте мне знать), поэтому сначала я собираюсь сделать пример решения planar 3-SAT с этой системой.

Итак, простая плоская проблема 3-SAT будет (x | y / z) & (!x / y/!Зет.) Очевидно, что это выполнимо, используя любое назначение, где Y истинно или несколько других назначений. Мы построим нашу проблему домино таким образом:

    *******
    *     *
    *     *
 ****   ***
 *       *
***      ****
  *         *
  *         *        
  * ******* *
  * *     * *
  * *     * *
 *z*x*   *****
   *       *
   **** ****
      * *
      ***
      ***
       *
       *
       *           
       y

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

сложение общего количества домино из гаджеты и пути у нас есть 1 сплиттер (5 домино), два скрипача (2 домино каждый), и в общей сложности 13 регулярных путей, в общей сложности 5 + 2*2 + 13 = 22 домино гарантировано, даже если условия не могут быть выполнены. Если они могут быть, тогда у нас будет еще 2 домино, которые могут быть заполнены в общей сложности 24. Одна оптимальная упаковка с 24 домино выглядит следующим образом:

    QRRRSSS
    Q     T
    Q     T
 OPPP   *UT
 O       U
*ON      UVVV
  N         W
  N         W        
  M IIIJJJK W
  M H     K X
  M H     K X
 *zGH*   LLLX*
   G       *
   GEEE FFF*
      B D
      BCD
      BCD
       C
       A
       A
       A

эта плитка содержит 24 домино, поэтому мы можем знать, что исходное выражение является удовлетворительным. В этом случай, плитка соответствует сделать y и x истинным и Z ложным. Обратите внимание, что это не единственная плитка (и не единственное удовлетворительное назначение булевых значений), но что нет другой плитки, которая увеличит количество плиток за 24, поэтому это максимальная плитка. (Если вы не хотите считать все домино, вы можете отметить, что я использовал каждую букву, кроме Y и Z.)

если бы максимальная плитка содержала либо 22, либо 23 домино, то мы знали бы, что один из клаузулы не были удовлетворены (GGG и/или lll домино не могли быть размещены), и поэтому мы знали бы, что исходное выражение не было удовлетворительным.

чтобы быть уверенными, что мы можем это сделать, даже если planar 3-SAT не NP-hard, мы можем построить гаджет, который позволяет путям пересекаться. Этот гаджет, к сожалению, большой и сложный, но это самый маленький, который я смог понять. Сначала я опишу детали, а потом все устройство.

кусок 1: точка пересечения. X и y-входы. А,B,и C-выходы. Их нужно будет комбинировать с помощью других гаджетов, чтобы фактически передавать x и y на противоположную сторону друг от друга.

   ***c
   *
  ***
  * *
  * *
  * *
  ***
  ***
 ax*yb

этот гаджет всегда будет соответствовать ровно 7 доминошек. Возможны четыре комбинации ввода. Если ни один вход не выступает (оба значения true), то выход не будет выступать, и он будет заполнен, как в (tt1) или (tt2) ниже. Если только вход x выступает, то только c будет выступать, как в (ft) под. Если только вход y выступает, то либо выход a, либо c будет выступать, как в (tf) ниже. И если вход x и y оба выступают, то выход c выступает, как в (ff) ниже.

 (tt) AAAc         (ft) AAAc         (tf) AAAc         (ff) BAAA     
      *                 *                 *                 B        
     BBB               BBB               BBB               CBD       
     C D               C D               C D               C D       
     C D               C D               C D               C D       
     C D               C D               C D               E G       
     EEE               EEE               EEE               EFG       
     FFF               FFF               FFF               EFG       
    aGGGb             aXGGG             GGGYb             aXFYb      

я не включил возможность того, что в сценариях (ft) или (tf), что c может быть охвачен вместо a или b. Это возможно в рамках этого гаджета, но в сочетании с другими гаджетами для формирования полного кроссовера, если бы это было так, это никогда не привело бы к большему количеству условия удовлетворены, поэтому мы можем исключить его. Имея это в виду, мы можем затем наблюдать, что в этом случае значение входного x равно значению B & c, а вход y равен значению a & c (обратите внимание, что это было бы логично или скорее логично, и если бы выступ считался истинным, а не ложным). Поэтому нам просто нужно разделить c, а затем использовать логический и гаджет для подключения соедините значения c с a и b соответственно, и тогда мы успешно завершим наш перейти.

логическое и наш простой гаджет до сих пор, и это выглядит так:

  ****
  *
 x*y

вы действительно можете заметить, что есть один встроенный в верхнюю часть гаджета crossover point. Этот гаджет всегда будет содержать ровно 2 домино. Один будет наверху, чтобы служить выходом. Другой служит переключателем, который будет горизонтально ориентирован, только если оба x и y истинны (не выступающие) и вертикально ориентированы иначе, как мы можем видеть в следующие диаграммы:

 BBB*     ABBB     ABBB     ABBB
 *        A        A        A   
AAA      XAy      xAY      XAY  

таким образом, мы можем завершить кроссовер, разделив c, а затем добавив два из этих ворот, один для a & c и один для b & C. Все это вместе требует также добавления некоторых гаджетов fiddler и выглядит так:

             ******* ****
             *     * *  *
             *     ***  *
            ***    *** ***
              *     *  *
           ****     *  ****
           *        *     *
           *     ****     *
          ***    *       ***
            *   ***      *
         ****   * *      ****
    y    *      * *         *    x
    *    *      * *         *    *
    * ****      ***         **** *
    ***         ***            ***
      **********x*y*************

я не собираюсь заполнять примеры для этого. Вы должны сделать это сами, если хотите увидеть это в действии. Итак, ура! Теперь мы можем делать произвольные 3-SAT. Я должен воспользоваться моментом, чтобы отметить, что делать это будет полиномиальное преобразование времени, потому что даже в худшем случае мы можем просто сделать большую сетку со всеми переменными и их противоположностями сверху и всеми членами сбоку и сделать o(n^2) кроссоверы. Таким образом, существует простой алгоритм полиномиального времени для выкладки всего этого, и максимальный размер преобразованной задачи полиномиален по размеру входной задачи. КЭД.


изменить Примечание: Следующим отличную работу Тома Sirgedas в поиске ошибку устройство splitter, я внес некоторые изменения в ответ. По сути, мой старый сплиттер выглядел так и мог быть упакован с 6, Когда x не выступает (а не 5, которые я намеревался), как это:

y*** ***z   AAAC DBBB
   * *         C D
   ***         C*D
   ***         EEE
   *x*         FFF

поэтому я пересмотрел его, удалив два пробела по обе стороны от X. Это исключает упаковку 6 домино пока все еще позволяющ упаковке 5 домино в которой у и з раскрыты когда раскрыт КС.


Кейт:

отличная работа и отличные объяснения! Хотя, я написал программу нахождения максимального разбиения, и она обнаружила брешь. Надеюсь, это можно исправить! [Update: Кит исправил проблему!]

пожалуйста, проверьте эту ссылку: http://pastebin.com/bABQmfyX (ваши гаджеты проанализированы, плюс очень удобный исходный код c++)

проблема в том, что гаджет может быть выложен 6 домино:

y*** ***z
   * *
   ***
   ***
   *x*

-Тома Sirgedas


очень хороший вопрос. Эта задача эквивалентна нахождению максимального независимого множества размеров (или максимального размера клики) на специальном графе - вершинами будут все возможные положения прямоугольника MxN, а ребра соединят две позиции, если они столкнутся. Затем поиск размера максимального независимого множества дает результат. Или наоборот, мы могли бы определить ребро как соединяющее две позиции, которые не сталкиваются, тогда мы искали бы максимальный размер клики. Во всяком случае, ни граф не свободен от когтей и не идеален, поэтому мы не можем использовать полиномиальные решения для поиска максимального независимого множества / клики.

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


первое, что я бы сделал, это сделать третье состояние: "пусто, но недостижимо". Вы можете легко доказать, что каждая плитка недостижима в l * w*m * n времени (где l-длина мира, w-ширина мира, а m и n-размеры плитки). Это уменьшит ваше пространство так, что любая пустая плитка будет достижима. Обратите внимание, что у вас могут быть острова доступных плиток. Простейшим примером этого является то, что мир разрезан пополам. Это поддается рекурсивному усилию, когда каждый остров достижимости рассматривается как мир сам по себе.

теперь, когда мы имеем дело с островом (который может быть или не быть квадратным), у вас по существу есть частный случай задачи 2D рюкзака, которая, как известно, NP-hard (цитата при предыдущей работе). Ваш увеличивает сложность проблемы, добавляя фиксированные позиции в рюкзак, который всегда заполняется, но уменьшает сложность (немного), делая все пакеты одинакового размера.


плитки 1x3 трудны уменьшением от кубического плоского монотонного один-в-трех 3СБ. Мы должны создать некоторую "схему" для кодирования формулы.

"ворота":


X********Y

силы ровно одна из X и Y быть покрытым внешне. Используется для связи переменной и ее отрицания.


Y***
   *
   *
  ooo  ****
  * *  *  *
  * *  *  *
  X ****  Z

сил нет или все X и Y и Z быть покрытым внешне. Используется для копирования X или уничтожить три копии одного и того же. Провода можно формировать более или менее произвольно, используя длину-3 л штук.


*******************
*        *        *
*        *        *
X        Y        Z

силы ровно одна из X и Y и Z быть покрытым внешне. Для каждого пункта.