Nota: Esta es una continuación y revisión de mi otra respuesta .
Problemas con la reducción.
Recordemos el problema de decisión:
¿Hay un mosaico perfecto que cubra una cuadrícula dada a con n mosaicos únicos?( n + 1 ) × ( n + 2 )norte
Entonces, para una cuadrícula , solo podemos usar n variables.( n + 1 ) × ( n + 2 )norte
Pero:
- Nuestra reducción requiere muchas variables únicas, mucho más que .O (n)
- Además, nuestros cables son abiertos, lo que conduce a:
- ¿Cómo sabemos que podemos enlosar las áreas abiertas?
Para resolver el primer problema, artificialmente hacemos el tablero de juego mucho más grande; esencialmente hacemos igual al número de variables que realmente necesitamos, luego creamos una cuadrícula de tamaño ( n + 1 ) × ( n + 2 ) , y colocamos nuestra cuadrícula en la esquina inferior izquierda. Esto conducirá a una explosión cuadrática.norte( n + 1 ) × ( n + 2 )
Para el segundo problema, debemos repensar un poco nuestros gadgets.
Puede parecer un poco desalentador demostrar que podemos colocar con éxito el resto del tablero de acuerdo con la regla. Comenzamos con la misma estrategia que se usaría para generar tableros de juego de tamaño :( n + 1 ) × ( n + 2 )
Primero generamos un conjunto de todos los mosaicos posibles. Todas estas fichas tendrán que colocarse en el tablero. Luego retiramos los azulejos y dejamos sus cuadrados.
Sin embargo, nuestros gadgets no garantizan que se colocará un conjunto particular de mosaicos; Los azulejos colocados dependen del estado. Por lo tanto, debemos modificar cuidadosamente los gadgets para garantizar que se eliminarán los mosaicos particulares, sin importar el estado elegido.
Repasemos nuestros gadgets entonces.
El cable y la puerta de la cláusula son problemáticos por dos razones.
- No sabemos que los cuadrados que rodean un cable o una puerta de cláusula se pueden colocar en mosaico correctamente; después de todo, algunos cables se pueden empujar hacia la izquierda, otros hacia la derecha, y el mosaico de los cuadrados de espacio en blanco restantes no es trivial. Nos referiremos a este problema como el problema del "flujo".
- No hay forma de saber qué fichas eliminar del conjunto de fichas; en un estado, un conjunto de cuadrados, en el cable o en la puerta de la cláusula, se colocará en mosaico, en otro estado, se colocará un conjunto de cuadrados completamente diferente.
Para resolver estos problemas:
- Primero, generamos un conjunto de todos los mosaicos posibles. Todas estas fichas deberán colocarse en el tablero; A medida que los colocamos en el tablero, eliminaremos el mosaico del conjunto. Aunque es posible que al principio no sepamos , dado que todavía tenemos que describir completamente la formulación, podemos agregar todas las nuevas posibilidades de mosaico a medida que incrementamos n , según sea necesario. Se debe garantizar que todas las fichas que eliminemos de este conjunto se puedan colocar (al menos, se garantizará que se pueden colocar si la fórmula es satisfactoria). Llamamos a eliminar una ficha del conjunto de fichas, para "descargar" la ficha del conjunto de fichas, como para descargar nuestra obligación de colocarlo en el tablero de juego.nortenorte
- Debemos diseñar cuidadosamente los gadgets para garantizar que se eliminarán los mosaicos particulares, sin importar el estado elegido.
- Debemos cerrar nuestros gadgets para que no empujen los mosaicos por todo el tablero según su estado; más bien, todos sus estados solo deben ocupar un área particular bien definida.
- Alternativamente, se debe garantizar que todos sus estados puedan ocupar un área bien definida; esto garantiza un mosaico satisfactorio, pero no garantiza que ocurra un mosaico particular. Esta es la misma forma en que se hace un juego de Dominosa:
- Primero los mosaicos se generan en un conjunto;
- Luego, las fichas se colocan en una configuración aleatoria,
- A medida que se coloca cada mosaico, se elimina del conjunto de mosaicos.
- Luego, las fichas se retiran del tablero, dejando atrás sus cuadrados.
- Esto no garantiza que la configuración deseada se puede elegir,
- Más bien, se garantiza que la configuración deseada es capaz de ser elegido, y por lo tanto existe una solución. Podemos hacer lo mismo aquí.
- Después de colocar todos los gadgets de la formulación, en lugar de colocar cuadrados únicos de forma predeterminada, es decir, en todos los "espacios en blanco", nos aseguramos de que el espacio en blanco sea un área rectangular con una dimensión par, o dividir el espacio en blanco en rectángulos con una dimensión par , y simplemente colocamos en mosaico el espacio en blanco con los mosaicos restantes en el conjunto de mosaicos.⋆
- Después de colocar todas las fichas del conjunto, sabemos que todo se puede colocar.
- Obviamente, algunos mosaicos se pueden colocar, como los de las paredes, otros solo se pueden colocar si la fórmula es satisfactoria, debido a la naturaleza de las relaciones entre los dispositivos.
- Luego retiramos los azulejos y dejamos sus cuadrados.
Repasemos nuestros gadgets entonces.
Gadget de fuerza
Podemos hacer un número arbitrario de bloques de construcción asegurándonos de que no se puedan emparejar entre sí.
Por ejemplo, digamos que queremos forzar un mosaico , para que podamos usar 1 ⋆ como bloque de construcción. (tenga en cuenta que 1 ⋆ es una variable arbitraria, que queremos forzar como par, no necesariamente un bloque de construcción, ya que utilizamos el valor 1 anteriormente)( 1⋆,1⋆)1⋆1⋆1
Para garantizar que nuestros reservas de bloque -building ( 1 ⋆ , 1 ⋆ ) , vamos a colocarlo contra la pared de fondo en la siguiente configuración: colocaremos el número reservado, llamémosla 1 ⋆ contra la pared como una tachuela (con forma de ⊥ ); 3 contra la pared y uno en la segunda fila en el medio. Luego colocaremos otros dos números, llamémoslos 2 ⋆ y 3 ⋆ ; Estos son exclusivos de este gadget. Los colocamos en la parte superior izquierda y derecha 1 ⋆ .1⋆( 1 ⋆ ,1⋆)1⋆⊥32⋆3⋆1⋆
Ilustrado a continuación, el borde negro compartido es la parte inferior del tablero de juego, descripción de izquierda a derecha.
- Configuración del gadget. Cada y 3 ⋆ aquí son exclusivos de este gadget.2⋆3⋆
- Los 3 posibles estados de mosaico del centro .1⋆
Después de hacer esto, podemos garantizar que nuestro gadget se puede colocar en mosaico con un conjunto específico de mosaicos, al tiempo que garantizamos que nuestro gadget debe forzar el par .( 1 ⋆ , 1⋆)
- Sabemos que debe ocurrir, porque los 3 posibles estados de mosaico de la mitad inferior 1 ⋆ , en mosaico como ( 1 ⋆ , 1 ⋆ ) , como se ilustra en la figura de la derecha, arriba.( 1 ⋆ , 1⋆)1⋆( 1 ⋆ , 1⋆)
- Las fichas restantes se pueden colocar en mosaico como y ( 1 ⋆ , 3 ⋆ ) , cubriendo el dispositivo. Por lo tanto, podemos eliminar esos mosaicos de nuestro conjunto global de mosaicos. Ilustrado a continuación.( 1 ⋆ , 2⋆)( 1 ⋆ , 3⋆)
Descripción, de izquierda a derecha:
- Izquierda, arriba: Estado izquierdo, Izquierda, abajo: Un mosaico válido de los cuadrados restantes.
- Medio, arriba: Estado medio, Medio, abajo: Un mosaico válido de los cuadrados restantes.
- Derecha, arriba: estado correcto, derecha, abajo: un mosaico válido de los cuadrados restantes.
Tenga en cuenta que el mosaico de los cuadrados restantes no es forzado , ya que pueden formar mosaicos con vecinos cercanos en lugar de , pero dado que es un mosaico válido del tablero de juego en todos los estados, podemos eliminarlos del conjunto de mosaicos, y suponga que se colocarán en mosaico exactamente de esa manera. Como sabemos que hay un posible mosaico válido, tenemos al menos un mosaico posible del tablero de juego, si la fórmula es satisfactoria. Aunque no hay garantía de que estos se colocarán en mosaico de esta manera, sí hay una garantía de que el mosaico ( 1 ⋆ , 1 ⋆ ) será forzado.1⋆( 1 ⋆ , 1⋆)
Nota: si no está satisfecho con esto, o está confundido por la diferencia de "ser capaz de mosaico" frente a "ser forzado a mosaico", simplemente puede colocar una pared alrededor del dispositivo , de la misma manera que nosotros Haz un muro de 3 × 2 debajo para el gadget de cláusula.3×23×2
Este gadget no está cerrado porque no es necesario que lo esté (pero puede hacerlo si lo desea). No es necesario que sea así, porque tiene una configuración factible, que podemos eliminar del conjunto de teselas. Aunque podría ser posible hacer una configuración diferente, esto no afecta la satisfacción del problema.
Se garantiza que los siguientes mosaicos se colocarán en mosaico (por lo tanto, se pueden eliminar del conjunto de mosaicos): ( 1 ⋆ , 1⋆)
Los siguientes baldosas están garantizados para ser capaz a revestir (por lo tanto puede ser removido de la baldosa-set): ( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3⋆)
Si eliges cerrar este gadget con una pared, entonces también estarán garantizados.( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3⋆)
Nuevas puertas de alambre y cláusula
Debido a los problemas de flujo y al vaciado del conjunto de mosaicos, necesitamos rediseñar un poco el cable.
Una forma de resolver el problema del flujo es hacer que el cable sea un circuito, en lugar de simples estados de izquierda a derecha; es decir, sería circular en lugar de una línea y, por lo tanto, si la parte superior del círculo se empuja hacia la derecha, la parte inferior se empujará hacia la izquierda. Esto resuelve el problema del flujo.
Siguiendo esta ruta, podemos cambiar el cable y la puerta de la cláusula para resolver ambos problemas.
Reservando y FTF
Vamos a presentar dos nuevos valores universales, y F . Estos dos valores son universales; valores reales en la cuadrícula, como los valores cuadrados 2 y 3 (ya que, por convención, reservamos 1 como bloque de construcción para muros), o lo que elija. Representan verdadero y falso, respectivamente.TF231
Reservamos a la fuerza los mosaicos , ( T , T ) , ( F , F ) , de la siguiente manera; Ilustración a continuación, descripción de izquierda a derecha:(T,F)(T,T)(F,F)
- Usamos el mismo esquema que forzar cualquier mosaico , usando T como 1 ⋆ . Cada 2 ⋆ y 3 ⋆ aquí son exclusivos de este gadget.( 1 ⋆ , 1 ⋆ )T1⋆2⋆3⋆
- Usamos el mismo esquema que forzar cualquier mosaico , usando F como 1 ⋆ Cada 2 ⋆ y 3 ⋆ aquí son exclusivos de este gadget.(1⋆,1⋆)F1⋆2⋆3⋆
- Usamos el mismo esquema que forzar un mosaico , usando F como 1 ⋆ en el centro y usando T en las otras ubicaciones de la tachuela. Esto obliga ( F , T ) a mosaico. 2 ⋆ y 3 ⋆ pueden formar mosaicos con T , por lo que los eliminamos del conjunto de mosaicos. Cada 2 ⋆ y 3 ⋆ aquí son exclusivos de este gadget.(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T2⋆3⋆
Cable
Cada cable comenzará y terminará con un valor, llamémoslo , que es único para cablear. Para cada cláusula en la que participa el cable, el cable tendrá dos valores de cable, x ⋆ y x ′ ⋆ , que son únicos para cada cable, y participarán en la misma cláusula. Ilustración a continuación, con descripción de izquierda a derecha.A ⋆x ⋆X′⋆
- Un cable que participa en una cláusula. El cable tiene una altura de y una longitud de 2 ∗ p + 3 , donde p es el número de cláusulas en las que participa el cable. El cable está acolchado por dos cuadrados A ⋆ a la izquierda y dos a la derecha. Está, por supuesto, rodeado por una pared en todos los lados, indicado por el contorno azul. Tenga en cuenta que el 1 ⋆ es exclusivo de este cable y solo se utilizará en el cable y en la cláusula en la que participa.22 ∗ p + 3pagsA ⋆1 ⋆
A continuación se ilustran los dos estados, descripciones de izquierda a derecha.
- Un cable que participa en una cláusula, en el estado verdadero. El cable se considera verdadero, cuando los cuadrados se combinan con cuadrados T y los cuadrados x ′ ′ se combinan con cuadrados F. Se considera falso en el otro estado, donde se invierte el mosaico. Observe cómo se fuerza el mosaico una vez que se selecciona el mosaico A ⋆ : ( T , F ) ya se han forzado antes, por lo tanto, el resto de los mosaicos deben ser horizontales.x ⋆TX′⋆FA ⋆( T, F)
- El mismo cable en estado falso.
Al participar en más cláusulas, hay más valores , y x ′ ⋆ , un par para cada cláusula en la que participa el cable. Alternan estar en la parte superior e inferior, al igual que los cuadrados T y F que separan cada x ⋆ , x ′ ⋆ par.x ⋆X′⋆TFx ⋆ , x′⋆
Los dos estados correspondientes.
Este gadget está cerrado , por lo que no hay "problema de flujo".
Observe cómo en cualquier estado, recopilamos las siguientes fichas, sin importar el estado: , ( A ⋆ , T ) , ( A ⋆ , F ) .( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)
Sin embargo, hay algunos mosaicos de los que no estamos seguros; en un estado podemos eliminar del conjunto de fichas, mientras que en otro estado podemos eliminar ( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...del conjunto de fichas, entonces, ¿qué fichas podemos eliminar realmente? La respuesta es: la puerta de la cláusula tiene el mismo problema, pero con el conjunto opuesto de mosaicos. Siempre recogerá los mosaicos restantes, opuestos y no recopilados, como veremos en la siguiente sección. Como cada uno de estos está emparejado con una puerta de cláusula, podremos eliminarlos a ambos.(1⋆,F),(1′⋆,T),(2⋆,F),(2′⋆,T)...
Cláusula
A continuación, crearemos la primera iteración de la nueva puerta de cláusula. Consiste en un gadget de , encerrado por paredes. Dentro del dispositivo, colocamos una F en el centro superior y dos cuadrados T en las esquinas inferiores; uno en la esquina inferior izquierda y uno en la esquina inferior derecha. Los cuadrados restantes serán valores que representan variables de cable de tres cables diferentes. Llamemos a estos un ⋆ , b ⋆ , y c ⋆ . La F se verá obligada a emparejarse con una de las variables de cable, y las variables de cable restantes se emparejarán con los valores de T. Ilustraciones a continuación, descripciones de izquierda a derecha.2×3FTa⋆,b⋆,c⋆FT
- Izquierda: la configuración para la primera iteración de la nueva cláusula-puerta.
- Derecha Los tres estados posibles del mosaico F
Estos tres estados conducen a tres posibles inclinaciones. Ilustración a continuación, descripciones de izquierda a derecha.
- Izquierda, superior : mosaico izquierda, izquierda, inferior: mosaico de los cuadrados restantes.F
- Medio, arriba : mosaico a la derecha, Medio, abajo: Mosaico de los cuadrados restantes.F
- Derecha, arriba : mosaico, Derecha, abajo: Mosaico de los cuadrados restantes.F
Como la se emparejará con una de las variables de cable en la cláusula , esa variable de cable ya no se puede emparejar con F en el cable ; forzando así el cable a verdadero. Por el contrario, las variables de cable restantes que se agrupan con T se verán obligadas a mosaico con F dentro de sus cables. Estas son exactamente las mismas restricciones que una cláusula 1- en- 3 - S A T.FF TF1-in-3-SAT
Nota, y c ⋆ son de alambre-variables, pero cada uno que podrían referirse a una x ⋆ o un x ' ⋆ alambre variable; usar una x ′ ⋆ es esencialmente negar la variable del cable.a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Una adición: para cumplir con la obligación de saber qué fichas pueden eliminarse del conjunto de fichas, tenemos que "duplicar y contraponer" la cláusula. Lo que quiero decir con esto, es hacer otro aparato, con 3 variables adicionales que representan las negaciones de un ⋆ , b ⋆ , y c ⋆ . Llamemos a estos un " ⋆ , b ' ⋆ , y c ' ⋆ . Estos deben ser los valores negados de cable variable de a ⋆ , b ⋆3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆ Y c ⋆ . Estedispositivo 3 × 2 es diferente, ya que tendrá una T en el centro y dosvalores F en las esquinas; exactamente lo opuesto al gadget de la cláusula descrito hasta ahora. Al "duplicar" la cláusula como esta, volvemos a agregar las mismas restricciones que el gadget descrito anteriormente. Sin embargo, también descargamos todas las combinaciones de ( T , x ⋆ ) , ( T , x ′ ⋆ ) , ( F , x ⋆ ) , ( F , xa⋆,b⋆,c⋆3×2TF de la baldosa-set, para cada variable (y por tanto para una ⋆ , b ⋆ ,y c ⋆ así, porque son después de todo, alambre-variables). A continuación se ilustran descripciones de izquierda a derecha.(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- Una cláusula "doble y contrapositiva". La sección inferior es la cláusula descrita anteriormente; la sección superior es la cláusula contrapositiva recientemente descrita. La nueva cláusula tiene exactamente las mismas restricciones lógicas; Es el contrapositivo de la cláusula inferior. Juntos, estos dispositivos combinados y el cable descargan todas las combinaciones de del conjunto de fichas, para cada variable de cable participa en la cláusula(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- La línea azul en el centro de la figura más a la izquierda está ahí para facilitar la visualización; en realidad se puede eliminar sin permitir más estados.
Entonces, tomemos un ejemplo, para mostrar que todas las fichas se descargan según lo prometido. Ilustrado a continuación, descripción de izquierda a derecha.
- Figura de un cable que participa en una sola cláusula; Se elige un estado para la cláusula. Aquí, estamos usando , mientras que a ⋆ y b ⋆ representan otros valores de cable en esta cláusula.1⋆=b⋆a⋆b⋆
- Para el estado dado en la cláusula, el valor se obliga a emparejarse con la T vecina .1⋆T
- Esto hace que el cable se vea obligado a tener un valor verdadero (se puede ver como la variable positiva del cable se ve obligada a emparejarse con la , y la variable negativa está obligada a emparejarse con la F , como se explicó anteriormente).TF
- Esto obliga al en la cláusula contrapositive (la sección superior de la cláusula) para ser emparejados con T dentro de la cláusula. Ahora, si nos fijamos en el cable, se garantiza que se descargarán todos los mosaicos dentro del cable: descargados en el propio cable o en el dispositivo de cláusula correspondiente. En este estado, tenemos los mosaicos, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 11′⋆T(A⋆,A⋆)(A⋆,T)(A⋆,F)(1⋆,T) , ( 1 ′ ⋆ , F ) y ( 1 ′ ⋆ , T ) .(1⋆,F)(1′⋆ , F)( 1′⋆ , T)
Al probar el otro estado, obtenemos la siguiente ilustración, una descripción de izquierda a derecha.
- La cláusula está en el otro estado, mosaico en una de dos formas.( 1 ⋆ , T
- Por lo tanto, se fuerza en el cable,( 1 ⋆ , F
- Lleva el resto del cable a la loseta correspondientemente y valora el cable como falso.
- Finalmente, en la sección contrapositiva / superior del gadget de cláusula, debe colocarse en mosaico, porque ( 1 ′ ⋆ , T ) se toma en el cable. En este estado, tenemos los mosaicos, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 1 ⋆ , F( 1′⋆ , F)( 1′⋆ , T)( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)( 1 ⋆ , T) , ( 1 ′ ⋆ , F ) y ( 1 ′ ⋆ , T ) . Estas son las mismas fichas descargadas que en el otro estado.( 1 ⋆ , F)( 1′⋆ , F)( 1′⋆ , T)
Por lo tanto, en cualquier estado, descargamos los mismos mosaicos. Por lo tanto, el cable y la cláusula juntos descargan exitosamente mosaicos específicos si hay una asignación satisfactoria.
Este gadget está cerrado , por lo que no habrá un problema de flujo.
Se garantiza que el gadget de cláusula junto con el gadget de cable siempre descargan los mismos valores de par de mosaicos , por lo que podemos descargarlos incluso si no sabemos de qué manera se mosaicos.
Ahora todos nuestros gadgets cumplen los criterios.
Formulación
En nuestra formulación final, creamos tres filas de gadgets, cada una separada por una pared horizontal.
- En la parte inferior, colocamos los dispositivos de forzado, que son dos fichas de altura. Necesitamos un aparato para forzar el bloque de construcción, y para las combinaciones de y F . Colocamos los dispositivos de forzado directamente uno al lado del otro.TF
- En la fila central, colocamos los dispositivos de alambre, horizontalmente, que son dos fichas de altura. Los dispositivos de alambre deben estar separados entre sí con una pared vertical.
- En la fila superior, colocamos dispositivos de cláusula, que son cuatro fichas de alto. Los dispositivos de la cláusula deben estar separados entre sí por una pared vertical.
Siguen las ilustraciones, descripciones sobre cada figura. Haga clic en las imágenes para obtener una resolución completa. El código fuente para reproducir / generar las imágenes aparece en la parte inferior de la página.
Usando la fórmula como ejemplo, tenemos un solución satisfactoria ( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ ( x ) = ( x1, ¬ x2, x3) ∧ ( x2, ¬ x3, x4 4) ∧ ( x1, x2, ¬ x4 4)( ¬ x1, x2, x3, ¬ x4 4) como testigo
Primero comenzamos con las paredes horizontales que separan las filas de gadgets. Mostramos los cuadrados y los pares que se ven obligados a enlosarse dentro de las paredes.
A continuación, mostramos los gadgets. El contorno azul representa los bordes de los gadgets; azul punteado para los artilugios forzados, ya que no estarán rodeados de paredes. Tenga en cuenta que la línea en el medio del gadget de la cláusula no está rodeada por un muro; está ahí para facilitar la visualización; quitar la línea no permite que ocurran más estados en la cláusula, como se explicó anteriormente, pero mostramos la línea azul para esta demostración. Nota: que usamos nombres cuadrados para dar legibilidad semántica a los números, cuando corresponda. Cada nombre representa un valor numérico.
Aquí rellenamos las paredes verticales.
Aquí completamos la solución del testigo; es decir, esta es la solución de mosaico si se usa la solución SAT para generarla.
norte
Aquí completamos los cuadrados restantes con un mosaico trivial válido.
Aquí mostramos la esquina inferior derecha de la cuadrícula.
Aquí mostramos la esquina superior derecha de la cuadrícula. Observe cómo los mosaicos verticales ya no se ajustan; así que colocamos la fila superior en mosaico horizontalmente, si es necesario.
Y finalmente la esquina superior izquierda.
La generación de todo el tablero de juego a la vez a través de TeX falla con errores de memoria insuficiente de pdflatex, por lo que si desea verlo, tendría que generar clips y parcharlos. Asegúrese de revisar el visor del cuaderno .
Fuentes TikZ
Generador de juegos:
graphtex.py
Convierte TeX a svg, usando pdflatex, pdfcairo (poppler) y rsvg-convert (libsvg)
dominosa.py
Contiene la lógica de conversión, la verificación de la solución del juego y la lógica de dibujo
dominosa_demo.py
Una demostración ejecutable que genera las imágenes utilizadas en la respuesta anterior. Vuelca imágenes al directorio de trabajo actual.
dominosa_demo.ipynb
Una demostración de ipython que genera las imágenes utilizadas en la respuesta anterior.