Como uso o pedido canônico para reduzir a simetria na codificação SAT do problema do buraco de pombo?

8

No artigo "Codificação eficiente de CNF para selecionar 1 de N objetos", os autores apresentam sua técnica de "variável de comando" para codificar a restrição e depois falam sobre o problema do buraco de pombo.

Como meu erro pode existir no entendimento de nível inferior, deixe-me declarar o que acho que sei antes de fazer a pergunta:

Seja e n o número de pombos e buracos. A codificação ingénuo utiliza uma variável proposicional X i , j que é verdadeiro quando o i ' t h pombo é para ser colocado na j ' t h furo. A cláusula E x um c t l y ó n e ( X 1 , 1 , X 1 , 2 , . . . , X 1 , n )mnXi,jithjthExactlyOne(X1,1,X1,2,...,X1,n)reforça que o pombo 1 deve ocupar exatamente um buraco; cláusulas idênticas são adicionadas para os outros pombos. A cláusula Impõe que não mais do que um pombo ocupa um orifício; cláusulas idênticas são adicionadas para os orifícios restantes.AtMostOne(X1,1,X2,1,...,Xm,1)

Quando há mais pombos do que buracos (m> n), o problema é insolúvel (óbvio para os seres humanos), mas o solucionador SAT não "vê" esse fato. Quando ele não pode encontrar uma maneira de colocar pombos ele irá procurar uma tentativa com pombos 2 , 1 , 3 , . . . , M . Não entende que a ordem dos pombos é irrelevante. O artigo, entre outros, chama isso de simetria.1,2,3,..,m2,1,3,...,m

Instâncias em que são usadas como um teste extenuante da capacidade de um solucionador SAT de detectar insatisfação.m=n+1

O artigo propõe quebrar a simetria impondo ordem aos pombos. O pombo deve ser colocado em um buraco na frente do buraco do pombo i + 1 (ou seja, o pombo no buraco j deve ter um número menor que o do pombo no buraco j + 1 ). Em seguida, ele diz decepcionantemente: "Devido a limitações de espaço, não descrevemos explicitamente em detalhes a codificação de ordem canônica, mas o número de cláusulas geradas é da ordem O ( n l o g ( n ) ) ".ii+1jj+1O(nlog(n))

Então, minha pergunta é: o que eles fizeram para obter esses resultados?

Quero tratar as variáveis como uma sequência de bits que, numericamente, identifica a escolha de qual pombo entrou no buraco 1 e assim por diante. Siga isso com n - 1 comparadores para reforçar a sugestão do artigo. Minha construção ingênua de comparador, no entanto, exige cláusulas m, uma para cada bit (de tamanho cada vez mais feio). Socorro! :){X1,1,X2,1,...,Xm,1}n1

Andrew Lamoureux
fonte

Respostas:

7

Seja o número de pombos en seja o número de buracos. Deixe as variáveis proposicional B i , 0 ... B i , l ó g ( n ) codificam a representação binária de j - 1 , se o i th pombo é colocado na j th furo. (Exemplo, se o pombo 1 fosse colocado no buraco 10, j - 1 = 9 , que é o binário 1001. Então, B 1 , 3 = verdadeiro, B 1 , 2mnBi,0Bi,log(n)j1ijj1=9B1,3B1,2= falso, = falso e B 1 , 0 = verdadeiro.)B1,1B1,0

Aplique uma ordem específica dos pombos nos orifícios, exigindo que o orifício codificado pelas variáveis seja menor que o de B i + 1 . As codificações são comparadas conforme o esperado:BiBi+1

< B i + 1 , l ó g ( n ) OU B i , l ó g ( n ) = B i + 1 , l ó g ( n ) E B i , l ó g ( n ) - 1 < B i + 1Bi,log(n)Bi+1,log(n)

Bi,log(n)Bi+1,log(n)Bi,log(n)1 OU B i , l o g ( n ) = B i + 1 , l o g ( n ) AND B i , l o g ( n ) - 1 = B i + 1 , l o g ( n ) - 1 e B iBi+1,log(n)1

Bi,log(n)Bi+1,log(n)Bi,log(n)1Bi+1,log(n)1 < B i + 1 , l o g ( n ) - 2 OR ... Bi,log(n)2Bi+1,log(n)2

... seguindo o padrão de permitir que os bits mais significativos sejam equivalentes desde que o próximo bit à direita seja menor que o do próximo pombo. Haverá conjunção por comparador e S ( m ) comparadores, dando o esperado ó ( m * l S g ( n ) ) cláusulas adicionais.O(log(n))O(m)O(mlog(n))

Os valores da variável devem estar implícitos nos valores X i , j . Cada B i , * pouco está implícito por qualquer um de um conjunto particular de o X i , j variáveis sendo conjunto. Exemplo: supondo que n = 16 , você teria:BXi,jBi,Xi,jn=16

ExactlyOne(X1,9,X1,10,X1,11,X1,12,X1,13,X1,14,X1,15,X1,16,B1,3¯)

o que força verdadeiro se o pombo 1 for colocado em qualquer um dos orifícios 9-16. Caso contrário, B 1 , 3 é definido como falso para satisfazer a cláusula. Estas cláusulas definir os restantes B i pedaços.B1,3B1,3Bi

ExactlyOne(X1,5,X1,6,X1,7,X1,8,X1,13,X1,14,X1,15,X1,16,B1,2¯) ExactlyOne(X1,3,X1,4,X1,7,X1,8,X1,11,X1,12,X1,15,X1,16,B1,1¯) ExactlyOne(X1,2,X1,4,X1,6,X1,8,X1,10,X1,12,X1,14,X1,16,B1,0¯)

log(n)mmlog(n)

Kyle Jones
fonte
X1,10B1,3B1,2¯B1,1¯B1,0log(n)Xi,jmn
Vou editar a resposta para resolver isso.
precisa
ExactlyOne()