Codifica del vincolo 1-su-n per i solutori SAT


25

Sto usando un solutore SAT per codificare un problema e, come parte dell'istanza SAT, ho variabili booleane x1,x2,,xn dove è inteso che esattamente uno di questi dovrebbe essere vero e il resto dovrebbe sii falso. (A volte ho visto questo descritto come una codifica "one-hot".)

Voglio codificare il vincolo "esattamente uno su x1,,xn deve essere vero" in SAT. Qual è il modo migliore per codificare questo vincolo, per far funzionare il solutore SAT nel modo più efficiente possibile?

Vedo molti modi per codificare questo vincolo:

  • Vincoli a coppie. Potrei aggiungere vincoli a coppie per tutti i , j per garantire che al massimo uno x i sia vero, quindi aggiungere x 1x 2x n¬xi¬xji,jxix1x2xn per garantire che almeno uno sia vero.

    Questo aggiunge Θ(n2) clausole e nessuna variabile extra booleana.

  • Codifica binaria. Ho potuto introdurre nuove variabili booleane i 1 , i 2 , ... , i lg n per rappresentare (in binario) un intero i tale che 1 i n (aggiungendo qualche vincoli booleani per garantire che i è nell'intervallo desiderato ). Quindi, posso aggiungere vincoli imponendo che x i sia albero e che tutti gli altri x j siano falsi. In altre parole, per ogni j , aggiungiamo clausole che impongono che i xlgni1,i2,,ilgni1inixixjji=jxj .

    Questo aggiunge clausole e non so quante variabili extra booleane.Θ(nlgn)

  • Conta il numero di valori reali. Potrei implementare un albero di circuiti sommatori booleani e richiedere che , trattando ogni x i come 0 o 1 invece di falso o vero, e utilizzare la trasformazione Tseitin per convertire il circuito in SAT clausole. È sufficiente un albero di semi-additivi: vincola l'output carry di ciascun mezzo-sommatore su 0 e limita l'output finale del mezzo-sommatore finale sull'albero su 1. L'albero può essere scelto per avere qualsiasi forma ( albero binario bilanciato, o sbilanciato, o altro).x1+x2++xn=1xi

    Questo può essere fatto in gate e quindi aggiunge Θ ( n ) clausole e Θ ( n ) nuove variabili booleane.Θ(n)Θ(n)Θ(n)

    Un caso particolare di questo approccio è quello di introdurre variabili booleane , con l'idea che y i dovrebbe contenere il valore di x 1x 2x i . Questo intento può essere applicato aggiungendo le clausole y i¬ x i , y i¬ y i - 1 e ¬ y ix iy i -y1,,ynyix1x2xiyi¬xiyi¬yi1¬yixiyi1(dove trattiamo come sinonimo di false) per i = 1 , , n . Successivamente, possiamo aggiungere le restrizioni ¬ y i¬ x i + 1 per i = 1 , 2 , , n - 1 . Questo è sostanzialmente equivalente alla trasformazione di Tseitin di un albero a mezzo sommatore, in cui l'albero ha una forma al massimo sbilanciata.y0i=1,,n¬yi¬xi+1i=1,2,,n1

  • Rete di farfalle. Potrei costruire una rete di farfalle su bit, vincolare l' ingresso n -bit a 000 01 , limitare l' uscita n -bit a x 1 x 2x n e trattare ogni gate farfalla a 2 bit come un gate indipendente che scambia o non scambia il suo input con la decisione di fare in base a una nuova variabile booleana che non è vincolata. Quindi, posso applicare la trasformazione Tseitin per convertire il circuito in clausole SAT.nn00001nx1x2xn

    Ciò richiede gate e quindi aggiunge Θ ( n lg n ) clausole e Θ ( n lg n ) nuove variabili booleane.Θ(nlgn)Θ(nlgn)Θ(nlgn)

Ci sono altri metodi che ho trascurato? Quale dovrei usare? Qualcuno ha provato questo o li ha provati sperimentalmente o qualcuno ha qualche esperienza con uno di questi? Il numero di clausole e / o il numero di nuove variabili booleane è una buona metrica stand-in per stimare l'impatto di questo sulle prestazioni del solutore SAT o, in caso contrario, quale metrica useresti?


Ho appena notato che questa risposta ha alcuni riferimenti sull'applicazione dei vincoli di cardinalità per SAT, vale a dire, l'applicazione del vincolo che esattamente su n variabili sono vere. Quindi, la mia domanda si riduce a un caso speciale in cui k = 1 . Forse la letteratura sui vincoli di cardinalità aiuterà a far luce sulla mia domanda.knk=1


La maggior parte dei solutori SAT moderni supporta immediatamente clausole di cardinalità e altri vincoli speciali (non CNF).
Dávid Horváth il

Risposte:


12

Per il caso speciale di k su n variabili vero dove k = 1, esiste la codifica della variabile comandante come descritto in Codifica CNF efficiente per la selezione di oggetti da 1 a N di Klieber e Kwon. Semplificato: dividi le variabili in piccoli gruppi e aggiungi clausole che fanno sì che lo stato di una variabile comandante implichi che un gruppo di variabili è tutto falso o tutto fuorché uno falso. Quindi applica ricorsivamente lo stesso algoritmo alle variabili del comandante. Alla fine del processo, è necessario che sia vera la sola delle poche variabili del comandante finale. Il risultato è O (n) nuove clausole e O (n) nuove variabili.

Data l'ubiquità dei letterali a doppio controllo nei solutori basati su DPLL, penso che la crescita della clausola O (n) sia un vantaggio decisivo rispetto agli schemi di codifica che aggiungerebbero più clausole.


2
Se "piccolo gruppo" ha dimensione due, allora questa è solo un'aggiunta binaria, in cui "comandante" è il bit del risultato e si afferma che il carry è falso. Fatto in modo ricorsivo, questo metodo è completamente generale (funziona per 1 di N) ed è praticamente fattibile.
d8d0d65b3f7cf42,

3

Un articolo di Magnus Björk descrive due tecniche che potrebbero valere la pena provare.

Per 1 sun, è possibile utilizzare contemporaneamente la codifica one-hot e binaria. Quindi abbiamox1,,xn as a one-hot encoding, and y1,,yb as a binary encoding, where b=lgn. We can encode the "at least one" constraint easily, in a single clause: (x1xn). We can also force the two encodings to be consistent with 2lgn clauses: we simply add xi¬yj or xiyj, according to whether the jth bit of the binary encoding of i is 0 or 1. Finally, the "at most one" constraint follows automatically. This also allows the rest of the SAT instance to use whichever encoding is more convenient.

For k-out-of-n, one can apply a sorting network to the input x1,,xn to get the sorted output y1,,yn, and then add a clause requiring that yk is true and yk+1 is false. There are a number of simple sorting networks that need only O(nlg2n) comparator units. Therefore, we get an encoding that uses O(nlg2n) clauses and temporary variables.

The paper is

Magnus Björk. Successful SAT Encoding Techniques. 25th July 2009.

The following paper has a detailed list of encodings for 1-out-of-n and k-out-of-n, with some experimental evaluation of each of them. The conclusions are not entirely clear (the command encoding looks pretty good in their experiments).

Alan M. Frisch, Paul A. Giannaros. SAT Encodings of the At-Most-k Constraint: Some Old, Some New, Some Fast, Some Slow. ModRef 2010.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.