Codificación de la restricción 1 fuera de n para solucionadores SAT


25

Estoy usando un solucionador SAT para codificar un problema, y ​​como parte de la instancia SAT, tengo variables booleanas donde se pretende que exactamente una de estas sea verdadera y el resto debería ser falso (A veces he visto esto descrito como una codificación "única").x1,x2,,xn

Quiero codificar la restricción "exactamente uno de debe ser verdadero" en SAT. ¿Cuál es la mejor manera de codificar esta restricción, para hacer que el solucionador SAT se ejecute de la manera más eficiente posible?x1,,xn

Puedo ver muchas formas de codificar esta restricción:

  • Restricciones por pares. Podría agregar restricciones por pares para todo i , j para asegurar que a lo sumo un x i sea ​​verdadero, y luego agregar x 1x 2x n para asegurar que al menos uno sea verdadero.¬xi¬xji,jxix1x2xn

    Esto agrega cláusulas y no variables booleanas adicionales.Θ(n2)

  • Codificación binaria. Pude introducir nuevas variables booleanas i 1 , i 2 , ... , i LG n para representar (en binario) un número entero i tal que 1 i n (la adición de unas pocas restricciones booleanas para asegurar que i es en el intervalo deseado ) Luego, puedo agregar restricciones que impongan que x i es un árbol y que todas las otras x j son falsas. En otras palabras, para cada j , agregamos cláusulas que imponen que i = jlgni1,i2,,ilgni1inixixjj .i=jxj

    Esto agrega cláusulas y no sé cuántas variables booleanas adicionales.Θ(nlgn)

  • Cuenta el número de valores verdaderos. Podría implementar un árbol de circuitos sumadores booleanos y requerir que , tratando cada x i como 0 o 1 en lugar de falso o verdadero, y use la transformación Tseitin para convertir el circuito a SAT cláusulas Un árbol de media sumadora es suficiente: restringir la salida de acarreo de cada mitad de sumadora a 0, y restringir la salida final de la mitad de sumadora final en el árbol a 1. El árbol se puede elegir para que tenga cualquier forma ( árbol binario balanceado, o no balanceado, o lo que sea).x1+x2++xn=1xi

    Esto se puede hacer en puertas y por lo tanto añade theta ( n ) cláusulas y Θ ( n ) nuevas variables booleanas.Θ(n)Θ(n)Θ(n)

    Un caso especial de este enfoque es introducir variables booleanas , con la idea de que y yo debería contener el valor de x 1x 2x i . Esta intención puede hacerse cumplir agregando las cláusulas y i¬ x i , y i¬ y i - 1 , y ¬ y ix iy i -y1,,ynyix1x2xiyi¬xiyi¬yi1 (donde tratamos y 0 como sinónimo de falso) parai=1,,n. A continuación, podemos agregar las restricciones¬ y i¬ x i + 1 parai=1,2,...,n-1. Esto es básicamente equivalente a la transformación Tseitin de un árbol de medio sumador, donde el árbol tiene una forma máximamente desequilibrada.¬yixiyi1y0i=1,,n¬yi¬xi+1i=1,2,,n1

  • Red de mariposas. I podría construir una red mariposa en bits de, limitar el n de entrada bits para ser 000 01 , restringir el n salida de bits a ser x 1 x 2x n , y tratar a cada puerta de mariposa 2 bits como una puerta independiente que intercambia o no intercambia su entrada con la decisión de qué hacer basándose en una nueva variable booleana nueva que se deja sin restricciones. Entonces, puedo aplicar la transformación Tseitin para convertir el circuito a cláusulas SAT.nn00001nx1x2xn

    Esto requiere puertas y por lo tanto añade Θ ( n lg n ) cláusulas y Θ ( n lg n ) nuevas variables booleanas.Θ(nlgn)Θ(nlgn)Θ(nlgn)

¿Hay algún otro método que haya pasado por alto? ¿Cuál debo usar? ¿Alguien ha probado esto o los ha probado experimentalmente, o alguien tiene alguna experiencia con alguno de estos? ¿Es el número de cláusulas y / o el número de nuevas variables booleanas una buena métrica sustituta para estimar el impacto de esto en el rendimiento del solucionador SAT, o si no, qué métrica usaría?


Acabo de notar que esta respuesta tiene algunas referencias sobre el cumplimiento de las restricciones de cardinalidad para SAT, es decir, el cumplimiento de la restricción de que exactamente de las n variables son verdaderas. Entonces, mi pregunta se reduce a un caso especial donde k = 1 . Tal vez la literatura sobre restricciones de cardinalidad ayudará a arrojar luz sobre mi pregunta.knk=1


La mayoría de los solucionadores de SAT modernos admiten cláusulas de cardinalidad y otras restricciones especiales (no CNF) listas para usar.
Dávid Horváth

Respuestas:


12

Para el caso especial de k de n variables verdaderas donde k = 1, existe una codificación de variable comandante como se describe en Codificación eficiente de CNF para seleccionar 1 a N objetos por Klieber y Kwon. Simplificado: Divida las variables en pequeños grupos y agregue cláusulas que hagan que el estado de una variable comandante implique que un grupo de variables es falso o todo es falso. Luego aplique recursivamente el mismo algoritmo a las variables del comandante. Al final del proceso, exija que se cumpla exactamente una de las variables finales del comandante. El resultado es O (n) nuevas cláusulas y O (n) nuevas variables.

Dada la ubicuidad de dos literales vistos en solucionadores basados ​​en DPLL, creo que el crecimiento de la cláusula O (n) es una ventaja decisiva sobre los esquemas de codificación que agregarían más cláusulas.


2
Si "grupo pequeño" tiene tamaño dos, entonces esto es solo una suma binaria, donde "comandante" es el bit de resultado, y se afirma que el carry es falso. Hecho recursivamente, este método es completamente general (funciona para 1 de N) y, de hecho, prácticamente factible.
d8d0d65b3f7cf42

3

Un artículo de Magnus Björk describe dos técnicas que vale la pena probar.

Para 1-de- , uno puede usar tanto la codificación one-hot como la codificación binaria simultáneamente. Por lo tanto, tenemos x 1 , ... , x n como codificación de un solo hot, e y 1 , ... , y b como codificación binaria, donde b = lg n . Podemos codificar la restricción "al menos uno" fácilmente, en una sola cláusula: ( x 1x n ) . También podemos forzar que las dos codificaciones sean consistentes con 2 lg nnx1,,xny1,,ybb=lgn(x1xn)2lgncláusulas: simplemente agregamos o x ixi¬yj , según si elbit número j de la codificación binaria de i es 0 o 1. Finalmente, la restricción "a lo sumo" sigue automáticamente. Esto también permite que el resto de la instancia SAT use la codificación que sea más conveniente.xiyjji

Para -out-of- n , se puede aplicar una red de clasificación a la entrada x 1 , ... , x n para obtener la salida ordenada y 1 , ... , y n , y luego agregar una cláusula que requiera que y k sea ​​verdadero y y k + 1 es falso. Existen varias redes de clasificación simples que solo necesitan unidades de comparación O ( n lg 2 n ) . Por lo tanto, obtenemos una codificación que usa O ( n lg 2knx1,,xny1,,ynykyk+1O(nlg2n)O(nlg2n)

El papel es

Magnus Björk. Técnicas de codificación SAT exitosas . 25 de julio de 2009.

nkn

Alan M. Frisch, Paul A. Giannaros. Codificaciones SAT de la restricción a lo sumo k: algunas viejas, algunas nuevas, algunas rápidas, algunas lentas . ModRef 2010.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.