Codificando restrição 1-out-of-n para solucionadores SAT


25

Estou usando um solucionador SAT para codificar um problema e, como parte da instância SAT, tenho variáveis ​​booleanas onde se pretende que exatamente uma delas seja verdadeira e o restante seja falso . (Às vezes, isso é descrito como uma codificação "quente").x1,x2,,xn

Desejo codificar a restrição "exatamente um de deve ser verdadeiro" no SAT. Qual é a melhor maneira de codificar essa restrição, para fazer com que o solucionador SAT funcione da maneira mais eficiente possível?x1,,xn

Eu posso ver muitas maneiras de codificar essa restrição:

  • Restrições aos pares. Eu poderia adicionar restrições aos pares para todos para garantir que no máximo um seja verdadeiro e, em seguida, adicionar para garantir que pelo menos um seja verdadeiro . i , j x i x 1x 2x n¬xi¬xji,jxix1x2xn

    Isso adiciona cláusulas e nenhuma variável booleana extra.Θ(n2)

  • Codificação binária. Eu poderia introduzir novas variáveis ​​booleanas para representar (em binário) um número inteiro tal que 1 \ le i \ le n (adicionando algumas restrições booleanas para garantir que eu está no intervalo desejado). Então, posso adicionar restrições que reforçam que x_i é uma árvore e que todos os outros x_j são falsos. Em outras palavras, para cada j , adicionamos cláusulas que reforçam que i = j \ Leftrightarrow x_j .i 1 , i 2 , , i lg n i 1 i n i x i x j j i = j x jlgni1,i2,,ilgni1inixixjji=jxj

    Isso adiciona cláusulas Θ(nlgn) e não sei quantas variáveis ​​booleanas extras.

  • Conte o número de valores verdadeiros. Eu poderia implementar uma árvore de circuitos somadores booleanos e exigir que , tratando cada como 0 ou 1 em vez de falso ou verdadeiro, e use a conversão Tseitin para converter o circuito em cláusulas SAT. Uma árvore de meio-somadores é suficiente: restrinja a saída de transporte de cada meio-somador a 0 e restrinja a saída final do meio-adicionador final na árvore a 1. A árvore pode ser escolhida para ter qualquer forma ( árvore binária equilibrada, ou desequilibrada, ou o que for).x ix1+x2++xn=1xi

    Isso pode ser feito em portões e, assim, acrescenta cláusulas e novas variáveis booleanas.Θ ( n ) Θ ( n )Θ(n)Θ(n)Θ(n)

    Um caso especial dessa abordagem é a introdução de variáveis ​​booleanas , com a idéia de que deve conter o valor de x_1 \ lor x_2 \ lor \ cdots \ lor x_i . Essa intenção pode ser imposta adicionando as cláusulas y_i \ lor \ neg x_i , y_i \ lor \ neg y_ {i-1} e \ neg y_i \ lor x_i \ lor y_ {i-1} (onde tratamos y_0 como um sinônimo de false) para i = 1, \ dots, n . Em seguida, podemos adicionar as restrições \ neg y_i \ lor \ neg x_ {i + 1} para i = 1,2, \ dots, n-1 . Isso é basicamente equivalente à transformação de Tseitin de uma árvore de meio-somador, onde a árvore tem uma forma maximamente desequilibrada.y i x 1x 2x i y i¬ x i y i¬ y i - 1 ¬ y ix iy i - 1 y 0 i = 1 , ... , n ¬ y i¬ x i +y1,,ynyix1x2xiyi¬xiyi¬yi1¬yixiyi1y0i=1,,n¬yi¬xi+1i=1,2,,n1

  • Rede de borboletas. Eu poderia construir uma rede de borboleta em bits, restringir a entrada de bits para ser , restringir a saída de bits para e tratar cada porta borboleta de 2 bits como uma porta independente que troca ou não troca sua entrada com a decisão de fazer isso com base em uma nova variável booleana nova que é deixada sem restrição. Então, posso aplicar a transformação Tseitin para converter o circuito em cláusulas SAT.nn00001nx1x2xn

    Isso requer portões e, assim, acrescenta cláusulas e novas variáveis booleanas.Θ(nlgn)Θ(nlgn)Θ(nlgn)

Existem outros métodos que negligenciei? Qual devo usar? Alguém já testou isso ou experimentou-os experimentalmente, ou alguém tem alguma experiência com algum desses? O número de cláusulas e / ou o número de novas variáveis ​​booleanas é uma boa métrica substituta para estimar o impacto disso no desempenho do solucionador SAT ou, se não, qual métrica você usaria?


Acabei de notar que esta resposta tem algumas referências sobre como impor restrições de cardinalidade para SAT, ou seja, impor a restrição de que exatamente das variáveis ​​são verdadeiras. Então, minha pergunta se resume a um caso especial em que . Talvez a literatura sobre restrições de cardinalidade ajude a esclarecer minha pergunta.knk=1


A maioria dos solucionadores modernos de SAT suporta cláusulas de cardinalidade e outras restrições especiais (não CNF) prontas para uso.
Dávid Horváth

Respostas:


12

Para o caso especial de k de n variáveis ​​verdadeiras em que k = 1, há uma codificação de variável de comando conforme descrito em Codificação eficiente de CNF para selecionar objetos de 1 a N por Klieber e Kwon. Simplificado: divida as variáveis ​​em pequenos grupos e adicione cláusulas que fazem com que o estado de uma variável comandante implique que um grupo de variáveis ​​seja todo falso ou todo, exceto um falso. Em seguida, aplique recursivamente o mesmo algoritmo às variáveis ​​de comando. No final do processo, exija que exatamente uma das poucas variáveis ​​do comandante final seja verdadeira. O resultado são O (n) novas cláusulas e O (n) novas variáveis.

Dada a onipresença de literais de dois assistidos em solucionadores baseados em DPLL, acho que o crescimento da cláusula O (n) é uma vantagem decisiva sobre os esquemas de codificação que adicionariam mais cláusulas.


2
Se "pequeno grupo" tiver tamanho dois, isso é apenas uma adição binária, onde "comandante" é o bit do resultado e o carry é declarado falso. Feito recursivamente, esse método é totalmente geral (funciona para 1 de N) e, de fato, praticamente viável.
D8d0d65b3f7cf42

3

Um artigo de Magnus Björk descreve duas técnicas que podem valer a pena tentar.

Para 1-fora-de- , pode-se utilizar tanto um-quente e codificação binária simultaneamente. Portanto, temos x 1 , , x n como uma codificação de um ponto quente e y 1 , , y b como uma codificação binária, em que b = lg n . Podemos codificar o "pelo menos um" restrição facilmente, num único cláusula: ( x 1x n ) . Também podemos forçar as duas codificações a serem consistentes com 2 lg nnx1,,xny1,,ybb=lgn(x1xn)2lgncláusulas: simplesmente adicionamos ou x ixi¬yj , de acordo com se o j- ésimo bit da codificação binária de i é 0 ou 1. Finalmente, a restrição "no máximo uma" segue automaticamente. Isso também permite que o restante da instância SAT use a codificação que for mais conveniente.xiyjji

Para -out-of- n , pode-se aplicar uma rede de classificação à entrada x 1 , , x n para obter a saída classificada y 1 , , y n e, em seguida, adicionar uma cláusula exigindo que y k seja verdadeiro e y k + 1 é falso. Existem várias redes de classificação simples que precisam apenas de unidades comparadoras de O ( n lg 2 n ) . Portanto, obtemos uma codificação que usa O ( n lg 2knx1,,xny1,,ynykyk+1O(nlg2n) cláusulas e variáveis ​​temporárias.O(nlg2n)

O papel é

Magnus Björk. Técnicas de codificação SAT bem-sucedidas . 25 de julho de 2009.

O artigo a seguir apresenta uma lista detalhada de codificações para 1-de- e k -de- n , com algumas avaliações experimentais de cada uma delas. As conclusões não são totalmente claras (a codificação do comando parece muito boa em seus experimentos).nkn

Alan M. Frisch, Paul A. Giannaros. Codificações SAT da restrição At-Most-k: algumas velhas, outras novas, outras rápidas, outras lentas . ModRef 2010.

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.