Estou interessado em uma pequena variante do ladrilho, o quebra-cabeça 'quebra-cabeças': cada borda de um ladrilho (quadrado) é rotulada com um símbolo de , e dois blocos podem ser colocados adjacentes um ao outro se o símbolo na aresta de um bloco for e o símbolo na aresta de outro bloco for , para alguns . Então, dado um conjunto de ladrilhos, eles podem ser colocados em um quadrado (girando, mas sem inverter os ladrilhos) com todas as arestas correspondendo corretamente? (Há também uma variante desse problema, na qual são fornecidas quatro arestas de e as peças devem se encaixar corretamente nesse quadro).
Eu sei que esse problema é NP-completo para suficientemente grande , mas os limites que eu já vi em parecem bastante grandes; Estou interessado no problema para pequenos valores de e, em particular, para , o caso 'zero-um' (onde cada aresta é rotulada como ou e as arestas com um devem corresponder às arestas com um ) Aqui existem (com simetria rotacional) apenas seis tipos de ladrilhos (o ladrilho com todos os zeros, o ladrilho com todos os itens, o ladrilho com três zeros e um, o ladrilho com três zeros e um e os dois ladrilhos distintos com dois zeros e dois, '0011' e '0101'), portanto, uma instância de problema é apenas uma especificação dee um conjunto de cinco números , , , , e (representando a contagem de cada tipo de bloco) com . Obviamente, o problema está no NP (com dado em unário), pois uma solução pode simplesmente ser exibida e depois verificada no polinômio (em), mas sabe-se que é NP-completo ou existe algum algoritmo de programação dinâmica que pode ser aplicado aqui? E o caso 'emoldurado', em que a especificação do problema também inclui as quatro arestas do quadrado a serem correspondidas? (Obviamente, se o caso não enquadrado for NP-complete, o caso enquadrado quase certamente também será)
fonte
Respostas:
Como você mencionou que está interessado em resolver esse problema com valores pequenos de , sugiro que você tente implementá-lo em um solucionador SAT ou como um programa linear inteiro (ILP). Qualquer um poderá codificar as restrições, mas de uma maneira ligeiramente diferente:n
Para o SAT, há uma codificação muito clara da escolha de qual bloco entra em cada quadrado e uma codificação um pouco menos limpa da restrição em relação ao número de cada tipo de bloco (usando aritmética de bits).
Para o ILP, há uma codificação muito clara da restrição em relação ao número de cada tipo de bloco disponível e uma codificação um pouco menos limpa das restrições nas quais os blocos podem ser adjacentes um ao outro (mas ainda é expressável, pois você pode expressar fórmulas booleanas arbitrárias no ILP).
Eu esperaria que para pequenas ou médias , esta abordagem pode funcionar de forma eficiente.n
fonte