O Dominosa é NP-Hard?


26

Dominosa é um jogo relativamente novo. É reproduzido em uma grade (n+1)×(n+2) . Antes do jogo começar, os ossos de dominó (0,0),(0,1),,(n,n) são colocados na grade (constituindo um ladrilho perfeito). Na próxima etapa, os ossos do dominó ficam ocultos, deixando apenas os números revelados. O objetivo do jogo é recuperar o arranjo original dos ossos de dominó. Você pode jogar o jogo aqui:http://www.puzzle-dominosa.com/ :

Regras:

As regras são simples. Você precisa encontrar a localização de todos os dominós na grade. Um dominó é um par de números. Você pode ter apenas um de cada par.

Eu tenho alguns algoritmos polinomiais que resolvem uma parte relativamente pequena do quebra-cabeça. Eu também poderia mostrar que as grades típicas da Dominosa têm pelo menos 2n2+o(n)soluções.

O Dominosa é NP-Hard?


"O quebra-cabeça pode ser facilmente reduzido a um problema SAT ou ILP". Para provar a completude do NP, você não gostaria do contrário?
Dennis Meng

11
@DennisMeng O objetivo das reduções mencionadas na pergunta é estabelecer que o problema está no NP. Então, tudo o que resta é provar que é NP difícil. Aliás, não é necessário reduções para ver que o problema está no NP. O arranjo dos dominós é, por si só, uma testemunha de tamanho polinomial de solvabilidade.

Suponho que o problema cuja completude de NP esteja em questão seja, dado um arranjo de números, venha de um arranjo de dominós. Se o problema é realmente exibir o arranjo de dominós (quando existe), então o problema não é um problema de decisão e "NP completo" não faz sentido.

@AndreasBlass Também se pode considerar o problema maior: dados um subconjunto de elementos k dos dominós de 1 a n e um gráfico G com 2k vértices rotulados de 1 a n , determine se é possível cobri-lo com os dominós dados. Se esse problema estiver em P, existe um algoritmo de tempo P para recuperar a peça original, porque você pode tentar remover uma aresta e testar em tempo P se é possível concluir a grade.

11
De acordo com um artigo de G. Nordh chamado NP-completude de sequências multi-Skolem generalizadas, o seguinte problema semelhante é NP-completo. Exemplo: Um gráfico G=(V,E) , uma partição das bordas em conjuntos disjuntos: E1,E2,...,Em,|m||V|/2 com |Ei|2, i=1,,mde modo que duas arestas com o mesmo rótulo compartilhem um vértice. PERGUNTA: Existe um subconjunto ME com |M|=|V|/2 modo que não haja duas arestas em M compartilhem um vértice comum e que M contenha no máximo uma aresta de cada Ei, i=1,,m ?
Yoav barra sinai

Respostas:


9

Nota: Esta é uma continuação e revisão da minha outra resposta .

Problemas com a redução

Lembre-se do problema de decisão:

Existe um ladrilho perfeito cobrindo uma dada grade (n+1 1)×(n+2) com n ladrilhos exclusivos?

Portanto, para uma grade (n+1 1)×(n+2) , podemos usar apenas n variáveis.

Mas:

  • Nossa redução requer muitas variáveis ​​únicas, muito mais que O(n) .
  • Além disso, nossos fios são abertos, o que leva a:
    • Como sabemos que podemos ladrilhar as áreas abertas?

Para resolver o primeiro problema, aumentamos artificialmente o tabuleiro de jogo; essencialmente fazemos igual ao número de variáveis ​​que realmente exigimos, depois criamos uma grade de tamanho ( n + 1 ) × ( n + 2 ) e colocamos nossa grade no canto inferior esquerdo. Isso levará a uma explosão quadrática.n(n+1 1)×(n+2)

Para o segundo problema, precisamos repensar um pouco nossos gadgets.

Pode parecer um pouco assustador provar que podemos colocar o resto do quadro de acordo com a regra. Então começamos com a mesma estratégia que se usaria para gerar tabuleiros de tamanho :(n+1 1)×(n+2)

Primeiro , geramos um conjunto de todos os blocos possíveis. Todas essas peças terão que ser colocadas no tabuleiro. Em seguida , removemos os ladrilhos e deixamos para trás seus quadrados.

No entanto, nossos gadgets não garantem a colocação de um conjunto específico de peças; as peças colocadas dependem do estado. Portanto, devemos modificar cuidadosamente os gadgets para garantir que determinados blocos sejam removidos, independentemente do estado escolhido.

Vamos revisar nossos aparelhos então.

O fio e a porta da cláusula são problemáticos por dois motivos.

  1. Não sabemos que os quadrados ao redor de um fio ou porta de oração podem ser ladrilhados corretamente; Afinal, alguns fios podem ser empurrados para a esquerda, outros para a direita, e a colocação dos quadrados restantes em espaço em branco torna-se não trivial. Vamos nos referir a esse problema como o problema de "fluxo".
  2. Não há como saber quais peças remover do conjunto de peças; em um estado, um conjunto de quadrados, no arame ou no portão da cláusula, será lado a lado; em outro estado, um conjunto de quadrados completamente diferente será lado a lado.

Para resolver esses problemas:

  • Primeiro, geramos um conjunto de todos os blocos possíveis. Todas essas peças terão que ser colocadas no tabuleiro; quando os colocarmos no tabuleiro, removeremos o ladrilho do conjunto. Embora possamos não conhecer , a princípio , uma vez que ainda precisamos descrever completamente a formulação, podemos adicionar todas as novas possibilidades de blocos à medida que incrementamos n , conforme necessário. Todos os ladrilhos que removemos deste conjunto devem estar garantidos (pelo menos, estar garantidos se a fórmula for satisfatória). Chamamos remover um ladrilho do conjunto de ladrilhos, para "descarregar" o ladrilho do conjunto de ladrilhos, como para cumprir nossa obrigação de colocá-lo no tabuleiro de jogo.nn
  • Devemos projetar cuidadosamente os gadgets para garantir que determinados blocos sejam removidos, independentemente do estado escolhido.
  • Precisamos fechar nossos gadgets, para que eles não joguem lado a lado, dependendo do estado deles; todos os seus estados devem ocupar apenas uma área específica e bem definida.
    • Como alternativa, todos os seus estados devem ter a garantia de poder ocupar uma área bem definida; isso garante um mosaico satisfatório, mas não garante que um mosaico específico ocorra. É assim que um jogo de Dominosa é feito:
      • Primeiro, os blocos são gerados em um conjunto;
      • Em seguida, os blocos são colocados em uma configuração aleatória,
      • À medida que cada peça é colocada, ela é removida do conjunto de peças.
      • Em seguida, os ladrilhos são removidos do tabuleiro, deixando para trás seus quadrados.
      • Isso não garante que a configuração desejada seja escolhida,
      • Em vez disso, garante que a configuração desejada possa ser escolhida e, portanto, exista uma solução. Nós podemos fazer a mesma coisa aqui.
  • Depois de colocar todos os gadgets da formulação, em vez de colocar únicas quadrados por padrão, ou seja, em todos os "espaços em branco", certifique-se o espaço em branco é uma área rectangular com uma dimensão ainda, ou quebrar o espaço em branco em retângulos com uma dimensão ainda , e simplesmente ladrilhamos o espaço em branco com os ladrilhos restantes no conjunto de ladrilhos.
  • Depois de colocar todas as peças do conjunto, sabemos que tudo é passível de colocação.
    • Alguns ladrilhos serão obviamente substituíveis, como os de paredes, outros serão substituídos apenas se a fórmula for satisfatória, devido à natureza dos relacionamentos entre os gadgets.
  • Em seguida, removemos os ladrilhos e deixamos para trás seus quadrados.

Vamos revisar nossos aparelhos então.

Forçando o gadget

Podemos criar um número arbitrário de blocos de construção, garantindo que cada um deles não possa ser emparelhado.

Por exemplo, digamos que queremos forçar um bloco , para que possamos usar 1 como um bloco de construção. (observe, 1 é uma variável arbitrária, que queremos forçar como par a si mesma, não necessariamente um bloco de construção, pois usamos o valor 1 anteriormente)(1 1,1 1)1 111

Para garantir que os nossos reservas de bloco -Construção ( 1 , 1 ) , vamos colocá-lo contra a parede de fundo na seguinte configuração: vamos colocar o número reservado, vamos chamá-lo 1 contra a parede como um virada para cima (em forma de ); 3 contra a parede e um na 2ª linha no meio. Então colocaremos outros dois números, vamos chamá-los de 2 e 3 ; estes são exclusivos para este gadget. Colocamos estes no topo da esquerda e da direita 1 .1(1,1)13231

Ilustrado abaixo, a borda preta compartilhada é a parte inferior do tabuleiro de jogo, descrição da esquerda para a direita.

  • Configuração do gadget. Cada e 3 aqui são exclusivas para este gadget.23
  • Os 3 estados possíveis de ladrilhar o centro .1

insira a descrição da imagem aqui

Depois de fazer isso, podemos garantir que nosso gadget possa ser lado a lado com um conjunto específico de peças, enquanto garantimos que nosso gadget deve forçar o par .(1,1 1)

  • Sabemos que deve ocorrer, porque todos os três estados possíveis de lado a lado do meio inferior 1 , são lado a lado como ( 1 , 1 ) , conforme ilustrado na figura à direita acima.(1 1,1 1)1 1(1 1,1 1)
  • Os ladrilhos restantes podem ser lado a lado como e ( 1 , 3 ) , cobrindo o gadget. Assim, podemos remover esses blocos de nosso conjunto global de blocos. Ilustrado abaixo.(1 1,2)(1 1,3)

Descrição, da esquerda para a direita:

  • Esquerda, superior: estado esquerdo, esquerda, inferior: um lado a lado válido dos quadrados restantes.
  • Meio, superior: estado médio, meio, inferior: uma disposição válida dos quadrados restantes.
  • Direita, em cima: Estado certo, Direita, em baixo: Uma colocação válida dos quadrados restantes.

insira a descrição da imagem aqui

Observe que o lado a lado dos quadrados restantes não é forçado , pois eles podem lado a lado com vizinhos próximos em vez de , mas como é um lado válido do tabuleiro de jogo em todos os estados, podemos removê-los do conjunto de peças e suponha que elas serão lado a lado exatamente dessa maneira. Como sabemos que existe um possível ladrilho válido, temos pelo menos um ladrilho possível do tabuleiro de jogo, se a fórmula for satisfatória. Embora não haja garantia de que estes serão colocados lado a lado dessa maneira, há uma garantia de que o lado a lado ( 1 , 1 ) será forçado.1(1,1)

Nota: se você não estiver satisfeito com isso, ou estiver confuso com a diferença de "poder ladrilhar" vs. "ser forçado a ladrilhar", basta colocar uma parede ao redor do gadget , da mesma forma que faça uma parede 3 × 2 abaixo para o dispositivo de cláusula.3×23×2

Este gadget não está fechado, porque não precisa estar (mas você pode, se quiser). Não precisa ser, porque possui uma configuração viável, que podemos remover do conjunto de blocos. Embora possa ser possível fazer uma configuração diferente, isso não afeta a satisfação do problema.

É garantido que os seguintes ladrilhos sejam ladrilhados (portanto, podem ser removidos do conjunto de ladrilhos): (1,1)

É garantido que os seguintes ladrilhos possam ser ladrilhados (portanto, podem ser removidos do conjunto de ladrilhos): (1,2),(1,3)

Se você optar por fechar este gadget com uma parede, também terá a garantia de cobertura.(1,2),(1,3)

Novos portões Wire and Clause

Por causa dos problemas de escoamento e esvaziamento do conjunto de peças, precisamos redesenhar um pouco o fio.

Uma maneira de resolver o problema do fluxo é transformar o fio em um circuito, em vez de apenas estados simples esquerda-direita; isto é, seria circular em vez de uma linha e, portanto, se a parte superior do círculo for empurrada para a direita, a parte inferior será empurrada para a esquerda. Isso resolve o problema de fluxo.

Seguindo essa rota, podemos alterar o fio e a porta da cláusula para resolver os dois problemas.

Reserva e FTF

Vamos apresentar dois novos valores universais, e F . Esses dois valores são universais; valores reais na grade, como valores quadrados 2 e 3 (por convenção, reservamos 1 como um bloco de construção para paredes) ou o que você escolher. Eles representam verdadeiro e falso, respectivamente.TF231

Nós forçamos a reserva dos ladrilhos , ( T , T ) , ( F , F ) , como a seguir; ilustração abaixo, descrição da esquerda para a direita:(T,F)(T,T)(F,F)

  • Usamos o mesmo esquema para forçar qualquer bloco , usando T como 1 . Cada 2 e 3 aqui são exclusivas para este gadget.(1,1)T123
  • Nós usamos o mesmo esquema como forçar qualquer azulejo, usando F como 1 Cada 2 e 3 aqui são exclusivas para este gadget.(1,1)F123
  • Usamos o mesmo esquema para forçar um ladrilho , usando F como 1 no centro e usando T nos outros locais do alinhamento ascendente. Isso força ( F , T ) a lado a lado. 2 e 3 podem ser ladrilhados com T , então os removemos do conjunto de ladrilhos. Cada 2 e 3 aqui são exclusivas para este gadget.(1,1)F1T(F,T)23T23

insira a descrição da imagem aqui

Fio

Cada fio começará e terminará com um valor, vamos chamá-lo de , que é único o fio. Para cada cláusula na qual a conexão participa, a ligação terá dois valores de conexão , x e x , exclusivos de cada ligação, e participará da mesma cláusula. Ilustração abaixo, com descrição da esquerda para a direita.Axx

  • Uma ligação que participa de uma cláusula. O fio tem uma altura de , e tem um comprimento de 2 * p + 3 , em que p é o número de cláusulas participe o arame no. O fio é preenchido por duas Um quadrados sobre a esquerda, e dois do lado direito. É, é claro, cercado por uma parede por todos os lados, indicada pelo contorno azul. Observe que o 1 é exclusivo para esse fio e só será usado no fio e na cláusula em que ele participa.22p+3pA1

insira a descrição da imagem aqui

Ilustrados abaixo estão os dois estados, descrições da esquerda para a direita.

  • Uma ligação que participa de uma cláusula, no estado verdadeiro. O fio é considerada verdadeira, quando os quadrados estão emparelhados com um T quadrados, eo x ' quadrados estão emparelhados com F quadrados. É considerado falso no outro estado, onde a telha é invertida. Note como a colocação de azulejos é forçado uma vez que o A telha é selecionado: ( T , F ) já são forçados mais cedo, assim o resto das telhas deve ser horizontal.xTxFA(T,F)
  • O mesmo fio no estado falso.

insira a descrição da imagem aqui

Ao participar de mais cláusulas, há mais valor e x , um par para cada cláusula na qual o fio participa. Eles alternam estar em cima e em baixo, assim como os quadrados T e F que separam cada x , x par.xxTFx,x

insira a descrição da imagem aqui

Os dois estados correspondentes.

insira a descrição da imagem aqui

Este gadget está fechado , portanto, não há "problema de fluxo".

Observe como em qualquer um dos estados, coletamos os seguintes blocos, independentemente do estado: , ( A , T ) , ( A , F ) .(A,UMA)(UMA,T)(UMA,F)

Existem algumas peças, no entanto, das quais não temos certeza; em um estado que pode remover do conjunto de peças, enquanto em outro estado podemos remover ( 1 , F ) , ( 1 , T ) , ( 2(1,T),(1,F),(2,T),(2,F)...do conjunto de blocos, quais blocos podemos remover? A resposta é: o portão da cláusula tem o mesmo problema, mas com o conjunto oposto de peças. Ele sempre coletará os blocos restantes, opostos e não coletados, como veremos na próxima seção. Como cada um deles é associado a um gate de cláusula, poderemos remover os dois.(1,F),(1 1,T),(2,F),(2,T)...

Cláusula

Em seguida, criaremos a primeira iteração do novo gate da cláusula. Consiste em um gadget , cercado por paredes. Dentro do gadget, colocamos um F no centro superior e dois quadrados T nos cantos inferiores; um no canto inferior esquerdo e outro no canto inferior direito. Os quadrados restantes serão valores representando variáveis ​​de fio de três fios diferentes. Vamos chamar estes um , b , e c . O F serão forçados a emparelhar com um dos fios-variáveis, e as restantes variáveis fio-vai emparelhar com os T valores. Ilustrações abaixo, descrições da esquerda para a direita.2×3FTuma,b,cFT

  • Esquerda: A configuração para a primeira iteração do novo gate de cláusula.
  • Direita Os três estados possíveis da azulejos.F

insira a descrição da imagem aqui

Esses três estados levam a três possíveis inclinações. Ilustração abaixo, descrições da esquerda para a direita.

  • Esquerda, superior : lado a lado esquerdo, esquerda, parte inferior: lado a lado os quadrados restantes.F
  • Meio, cima : lado direito, Meio, lado inferior: lado a lado dos quadrados restantes.F
  • Direita, superior : lado a lado, Direita, inferior: lado a lado os quadrados restantes.F

insira a descrição da imagem aqui

Como o será emparelhado com uma das variáveis ​​de fio na cláusula , essa variável de fio não pode mais ser emparelhada com F no fio ; forçando assim o fio a ser verdadeiro. Por outro lado, as demais variáveis ​​de fio que se encaixam em T serão forçadas a encaixar com F dentro de seus fios. São exatamente as mesmas restrições que uma cláusula 1- em- 3 - S A T.FF TF1-in-3-SAT

Nota, e c são fio-variáveis, mas eles poderiam cada referem-se a um x ou um x ' fio-variável; usando um x ' é essencialmente negando o fio-variável.a,b,cxxx

Uma adição: para cumprir a obrigação de saber quais peças podem ser removidas do conjunto de peças, precisamos "duplicar e contraposificar" a cláusula. O que quero dizer com isto, é fazer com que outro dispositivo, com 3 variáveis adicionais que representam as negações de um , b , e c . Vamos chamar estes uma ' , b ' , e c ' . Estes devem ser os valores de fio variável negados de a , b 3×23a,b,ca,b,c E c . Essegadget 3 × 2 é diferente, pois terá um T no centro e doisvalores F nos cantos; exatamente o oposto do gadget da cláusula descrito até agora. Ao "duplicar" a cláusula como esta, adicionamos novamente as mesmas restrições que o gadget descrito acima. No entanto, também descarregamos todas as combinações de ( T , x ) , ( T , x ) , ( F , x ) , ( F , xa,b,c3×2TF da telha-conjunto, para cada uma das variáveis (e, assim, para uma , b ,e c bem, porque eles são apesar de tudo, fio-variáveis). Ilustrado abaixo, descrições da esquerda para a direita.(T,x),(T,x),(F,x),(F,x)a,b,c

  • Uma cláusula "dupla e contrapositiva". A seção inferior é a cláusula descrita acima; a seção superior é a cláusula contrapositiva recentemente descrita. A nova cláusula tem exatamente as mesmas restrições lógicas; é o contrapositivo da cláusula de baixo. Juntos, estes aparelhos combinados e a descarga de arame todas as combinações de da telha-conjunto, para cada variável de fio participando da cláusula.(T,x),(F,x),(T,x),(F,x)
  • A linha azul no meio da figura mais à esquerda está lá para facilitar a visualização; na realidade, pode ser removido sem permitir mais estados.

insira a descrição da imagem aqui

Então, vamos dar um exemplo, para mostrar que todas as peças são descarregadas conforme prometido. Ilustrado abaixo, descrição da esquerda para a direita.

  • Figura de um fio participando de uma única cláusula; um estado é escolhido para a cláusula. Aqui, estamos usando , enquanto a e b estão representando outros valores de fio nesta cláusula.1=bab
  • Para o estado especificado na cláusula, o valor é forçado a ser emparelhado com o T vizinho .1T
  • Isso faz com que o fio seja forçado a ter valor verdadeiro (você pode dizer que a variável positiva do fio é forçada a emparelhar com o e a variável negativa é forçada a emparelhar com o F , conforme explicado acima).TF
  • This forces the 1 in the contrapositive clause (the upper section of the clause) to be paired with T within the clause. Now if you look at the wire, every tile within the wire is guaranteed to be discharged: either discharged in the wire itself, or in the corresponding clause-gadget. In this state, we have the tiles, (A,A), (A,T), (A,F), (1 1,T), (1 1,F), (1 1,F), and (1,T).

insira a descrição da imagem aqui

Trying the other state, we get the illustration below, description from left to right.

  • The clause is in the other state, tiling (1,T in one of two ways.
  • Therefore, (1,F is forced on the wire,
  • Leading the rest of the wire to tile correspondingly, and value the wire as false.
  • Finally, in the contrapositive/upper section of the clause-gadget, (1,F) must tile, because (1,T) is taken in the wire. In this state, we have the tiles, (A,A), (A,T), (A,F), (1,T), (1,F), (1,F), and (1,T). These are the same tiles discharged as in the other state.

insira a descrição da imagem aqui

Thus in either state, we discharge the same tiles. Therefore, the wire and clause together successfully discharge specific tiles iff there is a satisfying assignment.

This gadget is closed, so there won't be a flow problem. The clause-gadget together with the wire gadget are guaranteed to always discharge the same tile-pair values, and thus we can discharge these even if we don't know which way it will tile.

Now all of our gadgets fulfill the criteria.

Formulation

In our final formulation, we create three rows of gadgets, each separated by a horizontal wall.

  • On the bottom, we place the forcing-gadgets, which are two tiles tall. We need a forcing gadget for the building block, and for combinations of T and F. We place the forcing gadgets directly next to each-other.
  • In the middle row, we place the wire gadgets, horizontally, which are two tiles tall. The wire gadgets should be separated from each-other with a vertical wall.
  • In the top row, we place clause gadgets, which are four tiles tall. The clause gadgets should be separated from each-other by a vertical wall.

Illustrations follow, descriptions above each figure. Click images for full resolution. Source code to reproduce/generate the images is listed at the bottom of the page.

Using the formula Φ(x)=(x1,¬x2,x3)(x2,¬x3,x4)(x1,x2,¬x4) as an example, we have a satisfying solution (¬x1,x2,x3,¬x4) as a witness.

First we start with the horizontal walls separating the rows of gadgets. We show the squares, and the pairs that are forced to tile within the walls.

insira a descrição da imagem aqui

Next, we show the gadgets. The blue outline represents the borders of the gadgets; dashed blue for the forcing-gadgets, since they will not be surrounded by walls. Note the line in the middle of the clause gadget is not surrounded by a wall; it is there for ease-of-viewing; taking the line away does not allow any more states to occur in the clause, as explained above, but we show the blue line for this demonstration. Note: that we use square-names to give the numbers semantic readability, when applicable. Each name represents a numeric value.

insira a descrição da imagem aqui

Here we fill in the vertical walls.

insira a descrição da imagem aqui

Here we fill in the witness solution; i.e this is the tiling solution if using the SAT solution to generate it.

insira a descrição da imagem aqui

Next we tile the filler-area; the rest of the board, as large as needed, for as large as né necessário para ladrilhar até agora. Assim, descarregamos os pares restantes no conjunto de peças. As linhas tracejadas aqui representam um ladrilho válido, mas não forçado; pode haver outra maneira de ladrilhar estes. Aqui, mostramos o canto inferior esquerdo.

insira a descrição da imagem aqui

Aqui, preenchemos os quadrados restantes com um ladrilho válido trivial.

insira a descrição da imagem aqui

Aqui, mostramos o canto inferior direito da grade.

insira a descrição da imagem aqui

Aqui, mostramos o canto superior direito da grade. Observe como os ladrilhos verticais não se ajustam mais; portanto, ladrilhamos a linha superior horizontalmente, se necessário.

insira a descrição da imagem aqui

E, finalmente, o canto superior esquerdo.

insira a descrição da imagem aqui

A geração de todo o tabuleiro de jogo de uma só vez via TeX falha com erros de falta de memória do pdflatex; portanto, se você quiser vê-lo, precisará gerar clipes e juntá-los. Certifique-se de verificar o visualizador de notebook .


Fontes TikZ

Gerador de jogo:

  • graphtex.py

    Converte TeX em svg, usando pdflatex, pdfcairo (poppler) e rsvg-convert (libsvg)

  • dominosa.py

    Contém a lógica de conversão, verificação de solução de jogo e lógica de desenho

  • dominosa_demo.py

    Uma demonstração executável que gera as imagens usadas na resposta acima. Despeja imagens no diretório de trabalho atual.

  • dominosa_demo.ipynb

    Uma demonstração do ipython que gera as imagens usadas na resposta acima.


11
Isso é espetacular, muito obrigado ..
precisa

2
Por favor, diga-me que você tem uma versão arXiv disso. Ele pode ser mais razoável para esta plataforma para incluir um esboço e link para o artigo completo.
Raphael

22

DOMEuNOSUMA é NP-difícil


Jogar o jogo é um problema de otimização; encontrar um ladrilho de dominó válido de forma que cubra todos os quadrados. A versão de decisão desse problema é:

Existe uma telha perfeita cobrindo um dado (n+1 1)×(n+2) grade com n peças únicas?

Obviamente, o problema de otimização, o problema de encontrar uma solução para o jogo é pelo menos tão difícil ou mais difícil que o problema de decisão.

Vamos converter um 1 1-3-em-SUMATfórmula para uma grade correspondente, que só poderá ser coberta se houver uma atribuição satisfatória para a fórmula. Além disso, a cobertura pode realmente ser usada para recuperar a tarefa satisfatória.

Portanto, se a construção apresentada estiver correta e se puder resolver um jogo em tempo polinomial em um DTM , isso implicariaP=NP. Isso implicaDOMEuNOSUMA é NP-difícil.

Redução de 1 1-3-em-SUMAT para DOMEuNOSUMA

Introdução

A maioria dos 3-SUMAT problemas / variantes têm uma boa correspondência com CEuRCvocêEuTSUMAT. Pode ser importante pensar nos problemas em paralelo; como estão relacionados um com o outro, quase tudo em um problema pode estar relacionado no outro.

CEuRCvocêEuTSUMAT possui uma variante planar, à qual reduz, chamada PeuUMANUMAR-CEuRCvocêEuTSUMAT. Essa conversão é muito elegante e basicamente permite que você faça qualquer incorporação plana, encontre os fios de cruzamento restantes e use um "dispositivo" para permitir que os fios cruzem através de um "portão" plano (coleção de dispositivos com fios de entrada e saída) .

Convenientemente, a maioria dos 3-SUMAT variantes também têm reduções nas variantes planares, que são paralelas PeuUMANUMAR-CEuRCvocêEuTSUMATe são muito relacionados; facilmente redutível de um para o outro e fácil de raciocinar. Portanto, sempre que encontro um problema planar que pode ser difícil para o NP, penso em termos das variantes planares de3-SUMATe seus paralelos em PeuUMANUMAR-CEuRCvocêEuTSUMAT.

É importante saber as variantes planares, porque elas ajudam a fazer reduções em problemas planares / geométricos, como o TSP Euclidiano (aliás, uma redução bastante rara de encontrar e aprender). Assim, existePeuUMANUMAR-3-SUMATe um paralelo, PeuUMANUMAR-CEuRCvocêEuTSUMAT, para ajudar nessas reduções.

De outros 3-SUMATé importante saber as variantes porque algumas são mais fracas; isto é, aparentemente "mais fácil", mas ainda assim NP-completo. Eles parecem mais fáceis de resolver, à primeira vista - e eles são muito mais simples - contudo são ainda NP-completos. NP completo, mas mais simples; e, portanto, mais fácil fazer reduções para, em muitos casos.

Por exemplo, há 1 1-em-3-SUMAT. Para alguns problemas, você pode facilmente fazer uma1 1-em-3 gadget, enquanto cria "pelo menos 1 em 3", como o padrão 3-SUMAT usos, não seria óbvio e criaria grandes construções.

Outro exemplo é MONOTONE-1 1-em-3-SUMAT. Monotone torna as coisas muito mais simples quando você tem uma construção que não pode negar valores facilmente.

Ainda mais surpreendente é que MONOTONE-1 1-em-3-SUMAT tem uma variante plana: PeuUMANUMAR-MONOTONE-1 1-em-3-SUMAT! Então, isso facilita muito as coisas; você não precisa cruzar "fios" (lembre-se, existem paralelos emCEuRCvocêEuTSUMAT para eles) e confie em mim, embora seja divertido criar dispositivos de travessia, eles tendem a ser muito óbvios e difíceis.

PROBLEMMONOTONEPLANAR1-in-3NP-hard3-SATNoNoNoYesMONOTONE-3-SATYesNoNoNo1PLANAR-3-SATNoYesNoYes21-in-3-SATNoNoYesYes3PLANAR1-in-3-SATNoYesYesYes4MONOTONE-1-in-3-SATYesNoYesYes5PLANAR-MONOTONE-3-SATYesYesNoYes!6PLANAR-MONOTONE-1-in-3-SATYesYesYesYes7
  1. Pure literal elimination
  2. Schaefer's dichotomy theorem
  3. The Problem of Compatible Representatives
  4. Minimum Weight Triangulation is NP-Hard
  5. Schaefer's dichotomy theorem
  6. Finding Perfect Auto-Partitions is NP-hard
  7. Optimal Binary Space Partitions in the Plane

One way to start with a reduction, is to try to find "gadgets" that resemble wires, and a gadget that resembles a clause of one of the 3-SAT variants. As a bonus, many of the variants are planar, we can probably get away without crossing wires.

What is a "gadget"? A gadget is some construction in the problem, that is helpful as a building block to build gates/wires/clauses. Some gadgets will have a restricted set of states; for example, a gadget with two states can be used as a variable; one state is "true" and the other is "false". A gadget with two states, that can be "long", can bend, and split, is useful as a wire - if it can interact with a variable, and become constrained to extend the state of the variable to another location. A gadget with exactly three states can perhaps be used as a clause; if it can be used to constrain "one of three" wires via each one of its three states. Similarly, one might want all sorts of logic gates, like a not-gadget, an or-gadget, an xor-gadget etc; where you can have some sort of constraint via the gadget that relates 2 or 3 wires in such a way.

A Building-block

  • First, let's reserve a number, for example, 1, on the board. We will make 1 a building block for everything else.
  • We will use a corner to make sure that 1 can never connect to another 1, except in this corner, where it must.
  • Below (in the three figures) is the corner, and how we place the 1s there.
  • We will use the to indicate unique values in all the grid, in all the diagrams.
  • In fact, we will cover our grid with values before overlaying them with important values; therefore, by default cover everything with values.

insira a descrição da imagem aqui

As you can see, by placing the 3   1s the pair (1,1) must be used up in this configuration; it must use one of the dashed-tiles. Now (1,1) can never happen elsewhere in the board, which is what we need.

There are alternate ways of reserving a number, either against the wall with 4 of them, or in the middle of nowhere, with 5 of them in a cross. Any way is fine, as long as (1,1) is forced.

A Wall

Now, it would be very useful to be able to make "walls" and "corners" all over the place, not just at the sides of the grid. Look what happens if we line up pairs of ones in a line; the one's have no choice but to pair with their neighbors, making a "wall" of width 4.

Images below, from left to right:

  1. A line of pairs of 1s.
  2. The only possible tiling of that 1-square.
  3. The only possible tiling of (almost) all the 1s in the line.
  4. The wall line, drawn for emphasis.

insira a descrição da imagem aqui

An initial attempt at a wire

Now, by placing two "walls" opposite each-other, and leaving a space of 1 entre as paredes, talvez possamos criar um dispositivo semelhante a um "fio".

Mostrando apenas as bordas da parede, é o que obtemos nas figuras abaixo (da esquerda para a direita):

  • Colocando duas paredes uma em frente à outra.
  • Colocando números únicos dentro.
  • Dois mais à direita: dois estados possíveis do fio.

insira a descrição da imagem aqui

Como funciona:

Não pode haver orifícios no tubo / fio; portanto, se os ladrilhos forem levantados, todos deverão ser deslocados para cima, ao longo do tubo; se eles forem deslocados para baixo, "sugará" todos eles. Assim, podemos enviar um "sinal" de um lado do fio para o outro; em outras palavras, propague um valor.

Assim, agora podemos propagar um valor por longas distâncias!

As limitações restantes são:

  • Não podemos dobrar um fio,
  • Não podemos dividir um fio,
  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

Dobrar um fio , parte 1: parede abaixo

O próximo problema é que precisamos dobrar um fio, não apenas seguir em frente ...

Tão. Vamos dividir a parte dobrada em duas partes; a parte superior e a parte inferior. Primeiro a parte inferior. Ignore a parte superior da dobra, faremos isso mais tarde.

As figuras abaixo mostram um pouco de problema com a flexão; o topo do fio está "solto", parece difícil fazer uma parede que gire acentuadamente 90 graus.

Esquerda para a direita:

  • O topo de um fio está "solto".
  • O que acontece se tentarmos dobrá-lo; queremos ligar para estar entre as linhas azuis. Novamente, ignore a parte superior da dobra, faremos isso mais tarde.
  • Como você pode ver, o topo 1 1s estão soltos, eles podem ladrilhar ao longo da parede ou através do arame ! Isso não é bom.

insira a descrição da imagem aqui

Uma solução é a seguinte:

  • Escolha um (x,1 1)par perto da curva. Pegue o valor dissox quadrado, vamos nomear q; isso significa que o número é único em toda a grade, assim como, e é reutilizado uma vez, aqui apenas nesta curva . Porque issox está emparelhado com um 1 1, não pode ser emparelhado com um 1 1novamente. Portanto, colocamos em cima da extremidade mais à direita1 1. Agora, podemos ver claramente, a única opção restante para emparelhar para esse1 1 está à sua direita, e assim solidificará a parede.

Ilustração abaixo, descrição da esquerda para a direita:

  • A situação com o problema.
  • Escolha um quadrado, deixe q ser o valor quadrado de qualquer quadrado na curva (é claro que não 1 1s embora).
  • Os dois togglings do canto superior direito 1 1inclinações; desta vez, apenas um deles é válido.

insira a descrição da imagem aqui

No entanto, como podemos ter certeza de que isso qnão vai estragar o fio? Abaixo, você pode ver os estados do fio e que oq não vai atrapalhar com isso.

Da esquerda para a direita:

  • A construção atual.
  • Duas figuras à direita: Os estados do fio; empiricamente, eles não são prejudicados pela introdução deq.

insira a descrição da imagem aqui

Agora ainda temos uma folga 1 1em cima; o mais à esquerda1 1.

Nós faremos a mesma coisa; escolha um par(r,1 1) que já está emparelhado nos ladrilhos curvos e coloque r na parte superior esquerda mais acima1 1.

Ilustração abaixo, da esquerda para a direita:

  • Nossa construção atual.
  • O problema: mais à esquerda, mais à esquerda1 1pode emparelhar com um número no fio ou na parede; nós queremos que a única emparelhar com a parede.
  • Escolhendo um re usando o mesmo número na parte superior esquerda mais acima1 1.

insira a descrição da imagem aqui

E finalmente conseguimos a curva mais baixa. Ilustração abaixo, descrições, da esquerda para a direita:

  • Esquerda: Nossa construção final para uma curva.
  • Direita: Como continuar o fio à esquerda.

insira a descrição da imagem aqui

Dobrar um fio , parte 2: parede acima

As paredes para formar o canto superior da curva são muito mais simples. Você simplesmente alinha uma parede vertical com uma parede horizontal. Ilustração abaixo, descrição da esquerda para a direita:

  • A curva que queremos fazer.
  • Coloque a seção vertical dos quadrados da parede para baixo.
  • Lado a lado os quadrados da parede vertical.
  • Colocação e revestimento da parede horizontal; ele pode encontrar a parede vertical e formar um canto.

insira a descrição da imagem aqui

Agora você deve estar convencido de que podemos colocar e dobrar os fios. Ainda não podemos dividir ou cruzar os fios, mais sobre isso mais tarde.

As limitações restantes são:

  • Não podemos dobrar um fio,
  • Não podemos dividir um fio,
  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

Um fio avaliado

Agora, temos fios, seria bom ter um fio valorizado, onde podemos ver o valor de um fio, como um LED em uma placa de circuito. Então, o que fazemos é pegar um fio, digamos de comprimento7e introduziu um nome quadrado, vamos chamá-lo T, e outro quadrado nomeado, vamos chamá-lo F. Ambos são exclusivos para cada seção de fio valorizada, ou seja. apenas duas vezes e serão reutilizadas apenas dentro de um único fio avaliado . Eles são colocados em pares, os doisT quadrados próximos um do outro, e os dois F quadrados próximos um do outro, com um único quadrado separando-os. Ilustrado abaixo, descrição da esquerda para a direita:

  • Esquerda: Um fio.
  • Direita: A configuração quadrada.

insira a descrição da imagem aqui

Então, como podemos saber se um fio é verdadeiro ou falso? Bem, um fio tem dois estados. Em cada um desses estados, um dosT ou Fserá emparelhado no mesmo bloco; o valor que está emparelhado é o valor do fio. Ilustração abaixo, descrição da esquerda para a direita:

  • Esquerda, direita: Os dois estados do fio avaliado ;
  • Esquerda: o fio é valorizado, como oT quadrados compartilham um único bloco
  • Direita: o fio é avaliado como falso como oF quadrados compartilham um único bloco.

insira a descrição da imagem aqui

Agora podemos ter nomeado variável que podemos usar, para colocar nosso 3-SUMATvariáveis ​​na grade. Podemos conectar dois fios avaliados e forçá-los a ter o mesmo valor ou, se os conectamos com um comprimento ímpar, forçá-los a ter valores diferentes; e usando fios, podemos fazer isso a longa distância, através da rede. Usando fios, podemos propagar os valores das variáveis ​​nomeadas em todo o lugar.

As limitações restantes são:

  • Não podemos dividir um fio,
  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

Não-portão

Um não-portão é desnecessário, pois está implícito: simplesmente usando um comprimento de fio um por um, podemos negar o valor do fio.

Um Portão de Cláusula

Agora eu posso demonstrar um gadget de cláusula simples; ele vai se conectar a3fios e forçar um deles a ser "puxado" e forçar os outros dois a estar no estado "empurrado". Podemos usar isso, esse é um relacionamento exatamente um em três; definimos o estado do fio ímpar para significar "verdadeiro" e os outros dois estados do fio para significar "falso", e estamos configurados.

Ilustrações abaixo, descrições da esquerda para a direita:

  • O layout do fio do gadget da cláusula. Faz um sinal de "mais"; a união de 3 fios em um ponto.
  • Encha o fio com uma quadrados.
  • Os três estados da praça central. Cada um desses estados "puxa" exatamente um fio para o centro, o ponto essencial do portão; agir como um1 1-em-3-SUMAT cláusula.

insira a descrição da imagem aqui

Agora vamos dar uma olhada nos diferentes estados. Ilustração abaixo, descrição da esquerda para a direita:

  • O fio esquerdo é puxado para o centro; os outros dois são empurrados para fora.
  • O fio inferior é puxado para o centro; os outros dois são empurrados para fora.
  • O fio inferior direito é puxado para o centro; os outros dois são empurrados para fora.

insira a descrição da imagem aqui

Agora, se você anexar fios com a paridade de comprimento correta (comprimento par ou ímpar) ao final desse portão, apenas um deles poderá ser verdadeiro e os outros dois falsos (dependendo se você os anexar de maneira estranha, você pode generalizar isso como um pouco). Assim, podemos conectar3 valores em um 1 1-em-3 Cláusula CNF.

As limitações restantes são:

  • Não podemos dividir um fio,
  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

Divisão de um fio

Para dividir um fio, primeiro alinhamos dois fios um ao lado do outro. Em seguida, como auxílio visual, rotulamos cada um dos fios com duasTquadrados, um ao lado do outro. Isso nos permitirá ver quando o fio é "verdadeiro": quando os doisTquadrados de um fio em uma única peça, então será verdadeiro, caso contrário, falso. Cada fio deve ter seu próprio par deT pares, então nomearemos um par T1 1 e o outro T2. Em seguida, apresentamos três novos nomes exclusivos valores, uma,b,c. Colocaremos esses três um ao lado do outro, uma vez em cada fio. No entanto, em um fio, mantenha um único quadrados entre o uma,b,c quadrados e o Tpar. No outro fio, coloque dois quadrados entre o uma,b,c quadrados.

Ilustração abaixo, descrição da esquerda para a direita:

  • Layout do fio. Observe que as paredes são um pouco grossas; portanto, os fios são mais próximos para fins ilustrativos; na realidade, eles estão um pouco mais afastados.
  • Os valores quadrados; aT valores na parte superior e os conectores de divisão uma,b,c abaixo.

insira a descrição da imagem aqui

O que isso faz é forçar os fios a não serem diferentes; E seuma,b é lado a lado em um fio, então o segundo fio não pode ser separado por um, porque isso implicaria uma,b é lado a lado no segundo fio e, portanto, uma,bseria lado a lado duas vezes. Ilustração abaixo, descrição da esquerda para a direita:

  • Exemplo de estado do fio esquerdo, avaliado como verdadeiro.
  • Mau estado do segundo fio; ele tenta ter um valor diferente, mas obtém um par duplicado.
  • Bom estado do segundo fio, agora eles têm o mesmo valor e não há pares duplicados.

insira a descrição da imagem aqui

Se você brincar com os outros dois estados possíveis, verá que isso também se estende a esses, e funciona nos dois sentidos. Assim, esses dois fios agora são os mesmos; dividimos com sucesso um fio. Podemos dividir o fio quantas vezes quisermos, sempre usando um novo conjunto deuma,b,c.

As limitações restantes são:

  • Não podemos dividir um fio,
  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

Um fio sem fio!

Bem, para minha alegria, dividir um fio acabou por ser sem fio! Ou seja, nas ilustrações acima, eu coloco os fios um ao lado do outro, mas não há razão para isso! Podemos colocar os fios em qualquer lugar da grade, e eles ainda estarão "emaranhados", por assim dizer. Isso nos poupa muitos problemas:

  • Nem precisamos nos preocupar em cruzar os fios. Isso nos permite reduzir de variantes não planas de3-SUMAT
  • Temos que fazer qualquer layout irritante, levar os fios para seus locais, é fácil! Como um telefone sem fio! Liberdade!
  • Não precisamos nos preocupar com a paridade do comprimento do fio / layout off-by-one.
  • Podemos fazer uma redução bastante pequena; cada uma das variáveis ​​terá um único conjunto de tiras longas, com várias conexões sem fio ao longo dos fios. Essas conexões serão para portões de cláusula, que residirão em seu próprio local na grade. Agora, a cláusula consistirá apenas no dispositivo da cláusula e em três fios sem fio.

As limitações restantes são:

  • Não podemos cruzar fios,
  • Podemos ter problemas irritantes de layout, porque precisamos ter cuidado com a paridade do comprimento do fio.

A redução, primeira tentativa

Deixei Φ(x)=EuCEu seja um 1 1-em-3-SUMAT fórmula booleana.

  • Para cada xjx, coloque um único fio longo, em fileiras, próximo à parte inferior da grade.
  • Para cada CEuΦ(x), faça uma porta de cláusulas na parte superior da grade; você pode colocá-los como quiser; melhor preenchê-lo em uma área quadrada, mas você também pode colocá-lo em uma única fileira longa.
  • Para cada xj variável participando de uma cláusula CEu, coloque um fio sem fio em uma das 3pinos de arame da porta da cláusula; coloque o outrouma,b,cde cada conexão na linha / fio variável correspondente. Termos negativos devem apenas colocar a conexão sem fio à cláusula a uma distância mais distante, alterando a paridade do comprimento do fio e negando o valor.

Como pode ser:

  • Figura: Uma cláusula conectada diretamente a fios sem fio. "Pontos ativos" são a maneira como simbolizamos ouma,b,cdaqui em diante. Esses hotpots serão conectados às variáveis ​​na grade.

insira a descrição da imagem aqui

E aqui está a aparência da grade:

  • Figura: O tabuleiro de jogo resultante. As variáveis ​​estão alinhadas em linhas na parte inferior. As cláusulas estão espalhadas por cima. Esse layout fornece uma explosão quadrática; um layout mais inteligente pode evitar explosões quadráticas.

insira a descrição da imagem aqui

Detalhes de Última Hora

Lembre-se do problema de decisão:

Existe uma telha perfeita cobrindo um dado (n+1 1)×(n+2) grade com n peças únicas?

Então, para um (n+1 1)×(n+2) grade, só podemos usar nvariáveis. Mas nossa redução requer muitas variáveis ​​únicas, muito mais do queO(n). Existem várias maneiras de resolver esse problema.

  • Uma maneira, é quadrado o tamanho da grade nos dois eixos. Então agora nossaO(|x|×|Φ(x)|) grade é meramente O(n), o que significa que todos os nossos números exclusivos podem ser limitados por n. Em seguida, devemos preencher o restante da grade, reutilizando nossos números únicos, mas tomando muito cuidado para não colocar números que sejam adjacentes um ao outro em nossa grade, adjacentes um ao outro no espaço de preenchimento do resto da grade. Existem várias maneiras criativas de fazer isso, deixarei isso como um exercício. Esse método induz uma explosão quadrática adicional, obviamente.
  • Outra maneira, mais sucinta e mais complexa, é diversificar a 1 1quadra. Em vez de apenas um bloco de construção, podemos usarO(n)blocos de construção e, em seguida, podemos reutilizar os números com os quais eles emparelham. Este método permite evitar a explosão quadtrática.

Fontes gráficas


Boa redução! Apenas uma curiosidade: como você pode provar que os pares ausentes (depois de colocar os fios-paredes-aparelhos no quadro) podem ser empacotados (em tempo polinomial) em uma grade retangular (n + 1) x (n + 2)? Eu tinha em mente uma redução semelhante, mas não descobri como provar que os pares "não utilizados" podem ser organizados em um retângulo (possivelmente maior) (as regras do jogo determinam que todos os blocos[umaEu,bEu] com umaEu,bEu=1 ..n é usado em uma placa dominosa válida)
Vor

Vou mover todos esses comentários para a minha resposta e torná-la mais abrangente na minha próxima grande revisão.
Realz Slaw

ok, vou esperar!
Vor

@RealzSlaw, muito obrigado! Ainda não tive tempo de ler isso, mas parece muito bom.
Yoav bar sinai

@RealzSlaw, existe uma maneira de entrar em contato diretamente com você?
Yoav bar sinai
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.