Parametri di riferimento


16

Questa domanda è probabilmente al confine tra argomento e argomento, tuttavia ho visto domande simili qui, quindi lo farò.


Sto implementando un solutore k -SAT unico , il cui input è una formula k -CNF con al massimo 1 compito soddisfacente. Per testare il suo comportamento pratico, ho bisogno di una serie di tali formule. Li ho cercati sul web e non ho trovato nulla (mentre, d'altra parte, è molto facile trovare suite di normali formule k -CNF).

Dove posso trovare istanze uniche di k -SAT?

In alternativa, sarei contento anche di conoscere qualsiasi procedura per generare istanze unicamente soddisfacenti. L'unico approccio che conosco va sotto il nome di generazione di istanze SAT con impianto : generi casualmente un'assegnazione di n variabili, quindi generi solo quelle clausole che concordano con tale assegnazione. Questo approccio non è soddisfacente per i miei scopi, per i seguenti motivi:

  • La formula ottenuta potrebbe avere ulteriori incarichi soddisfacenti indesiderati.
  • Per essere sicuro che la formula sia soddisfatta in modo univoco dall'assegnazione desiderata, è necessario introdurre tutte le possibili clausole che la concordano. Ciò produrrebbe formule con troppe clausole, che probabilmente saranno facili da risolvere e quindi non rappresentative del comportamento peggiore del risolutore. Non è ovvio per me come possiamo forzare efficacemente l'unicità mantenendo ragionevole il numero di clausole.

Come possiamo generare formule straordinariamente soddisfacenti con un numero ragionevole di clausole? Con ragionevole intendo lontano dal massimo .2k(nk)


Data una formula SAT con variabili e clausole. Se il numero di clausole è compreso tra eFnm3n2n3n2n2n1 la formula è unicamente soddisfacente o non soddisfacente. .. Avevo elaborato anche le equazioni per k-SAT. Ti farò sapere se lo trovo. F
Tayfun paga il

Se hai abbastanza tempo a disposizione (e le istanze sono abbastanza piccole), puoi generare istanze durante la transizione di fase e testarle con un solutore SAT. Se una formula non ha soluzione, scartala. Se ha una soluzione X, aggiungi una clausola insistendo sul fatto che la soluzione non è X ed esegui nuovamente il solutore. Questo è semplice ma lento.
Andrew D. King,

Risposte:


7

Ecco un modo per generare un'istanza -SAT univoca, data un'istanza SAT φ che sai essere soddisfacente. Considera la formula ψ ( x ) data dakφψ(x)

φ(x)h(x)=y,

dove è una funzione hash che mappa un'assegnazione x su un valore k -bit (per un valore piccolo di k ) e y è un valore k -bit casuale . Se φ ha circa 2 k incarichi soddisfacenti, allora (euristicamente) assumiamo che ψ avrà esattamente un compito soddisfacente (con probabilità costante). Possiamo verificare se questo è il caso usando un solutore SAT (vale a dire, verificare se ψ è soddisfacente; se lo è, e x 0 è un compito soddisfacente, verificare se ψ ( x ) xhxkkykφ2kψψx0 è soddisfacente). Se k non è noto, puoi trovare k usando la ricerca binaria o semplicemente ripetendo il valore di ciascun candidato k = 1 , 2 , , n (dove n è il numero di variabili booleane in x ).ψ(x)xx0kkk=1,2,,nnx

Puoi scegliere liberamente la funzione hash. Probabilmente vorrai renderlo il più semplice possibile. Una costruzione estremamente semplice consiste nel fare in modo che scelga un sottoinsieme casuale di k bit da x . Una costruzione leggermente più sofisticata prevede che l' i bit di h ( x ) sia il xor di due bit scelti casualmente da x (scegliendo una coppia separata di posizioni di bit per ogni i , indipendentemente). Mantenere h semplice manterrà ψ relativamente semplice.hkxih(x)xihψ

Questo tipo di trasformazione è talvolta usato / suggerito, come parte di uno schema per stimare il numero di assegnazioni soddisfacenti a una formula ; L'ho adattato per le tue esigenze particolari.φ

È possibile trovare molti banchi di test delle istanze SAT su Internet e applicare questa trasformazione a tutte, per ottenere una raccolta di istanze -SAT uniche .k


Un'altra possibilità sarebbe quella di generare istanze -SAT uniche dalla crittografia. Ad esempio, supponiamo che f : { 0 , 1 } n{ 0 , 1 } n sia una permutazione crittografica a senso unico. Sia x un elemento scelto in modo casuale di { 0 , 1 } n e sia y = f ( x ) . Quindi la formula φ ( x ) data da f ( x ) =kf:{0,1}n{0,1}nx{0,1}ny=f(x)φ(x) èun'istanza k -SATunica. Come altro esempio, scegli due grandi numeri primi p , q in modo casuale e lascia n = p q . Quindi la formula φ ( x , y ) data da x y = n x > 1 y > 1 x y (con l'ovvia corrispondenza tra stringhe di bit e numeri interi) è un K unicof(x)=ykp,qn=pqφ(x,y)xy=nx>1y>1xyk-Istanza SAT. Tuttavia, queste costruzioni non sembrano un modo utile per valutare o ottimizzare il tuo risolutore. Hanno tutti una struttura speciale e non c'è motivo di credere che questa struttura sia rappresentativa dei problemi del mondo reale. In particolare, è noto che le istanze SAT tratte da problemi crittografici sono estremamente difficili, molto più difficili delle istanze SAT tratte da molte altre applicazioni del mondo reale dei solutori SAT, quindi non sono un'ottima base per il benchmarking del solutore.


In generale, tutte le tecniche menzionate in questa risposta hanno lo svantaggio di generare istanze -SAT uniche con una struttura particolare, quindi potrebbero non essere ciò che stai cercando - o, almeno, potresti non voler fare affidamento esclusivamente su formule generate in questo modo. Un approccio migliore sarebbe quello di identificare le applicazioni di Unique k -SAT (chi pensi che userà il tuo risolutore, e per quale scopo?), E quindi provare a ottenere alcuni esempi realistici da quei domini applicativi.kk

Per un argomento correlato, vedere anche Generazione di interessanti problemi di ottimizzazione combinatoria


La prima parte del tuo paragrafo di crittografia è errata, poiché (se esistono funzioni unidirezionali allora) esistono funzioni unidirezionali che non sono iniettive.

Grazie, @RickyDemer! Intendevo una permutazione a senso unico, ma non era quello che scrissi. Fisso.
DW

6

Potresti considerare gli algoritmi usati per generare i puzzle di Sudoku - presumibilmente generalizzati a - poiché (di solito) i puzzle di Sudoku dovrebbero avere una soluzione unica. D'altra parte, i puzzle di Sudoku di solito sono anche garantito di avere almeno una soluzione ... Ma trovare che la soluzione potrebbe ancora essere un buon punto di riferimento per il risolutore.n×n

Potresti usare un generatore di Sudoku insieme a una riduzione a SAT, oppure potresti pensare a come applicare le tecniche utilizzate nella generazione di Sudoku per generare più direttamente istanze SAT uniche. Per il primo, ovviamente le tue istanze SAT avranno una struttura, ma non mi è chiaro se si tratti di una struttura più o meno che, ad esempio, piantare una soluzione o usare la tecnica di isolamento dei testimoni. Probabilmente dipende dalle tue esigenze e dal tuo risolutore.

L'unico riferimento che conosco qui è: Sudoku Puzzles Generating: da Easy to Evil .


4

Penso che un buon caso di test sarebbe quello di generare istanze 3XOR (istanze piantate) casualmente soddisfacenti con vincoli e poi convertirle in istanze 3SAT.Θ(n)


2

Imho uno dei modi migliori per creare istanze SAT "presumibilmente difficili" controllando il numero di soluzioni è da istanze / circuiti di factoring interi codificati in binario. il codice non è molto complesso, utilizza principalmente circuiti di addizione EE e non porta a istanze SAT "grandi". il numero di soluzioni è uguale al numero di fattori (comprese le "permutazioni" dei fattori). pertanto i numeri primi generano esattamente due soluzioni, . un'unica soluzione può essere garantita con un ulteriore vincolo "confronto" che limita i fattori da un <(1,p),(p,1)a<ba1 .bp

anche con questo approccio è relativamente facile trovare numeri con approssimativamente comunque molti fattori / soluzioni sono desiderati. la "liscia" il numero, più fattori.

vari ricercatori nel corso degli anni hanno creato questo codice SAT di factoring (ad esempio per la competizione / arcihve DIMACS che ha archiviato alcune istanze di factoring in passato) ma sfortunatamente non sembra esserci una versione disponibile al pubblico. vedi anche il primo link qui sotto per un riferimento in cui il codice è stato scritto / implementato apparentemente per un corso di laurea.

un'altra empirica / approccio iterativo che può essere utile per alcuni, per creare le istanze di più "non strutturati": creare istanze casuali SAT vicino al punto di transizione (la regione dove l'equazione ha una probabilità del 50% tra il "risolvibile e irrisolvibile"), e quindi risolvere l'equazione. se è irrisolvibile, getta via e riavvia. se è risolvibile, aggiungere clausole che limitano la soluzione "non" alla soluzione trovata, ottenendo e n + 1 , e risolvendo nuovamente. ripetere se necessario. quando l'equazione e n + 1 non è più risolvibile, e n deve aver avuto una soluzione unica / unica.enen+1en+1en


Ho menzionato l'approccio di factoring nella mia risposta in precedenza, ma ho anche spiegato perché potrebbe non essere un banco di prova ideale: "Tuttavia, queste costruzioni non sembrano un modo utile per confrontare o ottimizzare il tuo risolutore. Hanno tutte una struttura speciale e non c'è motivo di credere che questa struttura sia rappresentativa di problemi del mondo reale. In particolare, le istanze SAT tratte da problemi crittografici sono estremamente difficili, molto più difficili delle istanze SAT tratte da molte altre applicazioni del mondo reale dei solutori SAT, quindi non sono un'ottima base per il benchmarking del tuo risolutore. "
DW

quindi quanto sopra è un pov diverso che se si vogliono casi molto difficili, ovviamente un caso di prova naturale per qualsiasi risolutore, il factoring è davvero un modo promettente per andare. dubito seriamente che potresti trovare opinioni pubblicate che rispecchino le tue. per ripetere, esempi di factoring sono stati inseriti negli archivi di sfida DIMACS da ricercatori seri a partire da molti anni fa. in ogni caso, la tua opinione contraria non è nemmeno realmente espressa in modo autoconsistente. la crittografia è davvero un problema principale / applicato del mondo reale, ancor più di molti problemi astratti / astrusi / accademici usati per le istanze SAT ...
vzn,

2

(|F|<n+2k)

mm
FkmFm(2k1)(nk)

(k1) clauses that eliminate all models assigning exactly one "1" among x1,x2xk:
(¬x1,x2xk)(x1,¬x2xk)(x1,x2¬xk)

Take the (k2) clauses that eliminate all models assigning exactly two "1" among x1,x2xk:
(¬x1,¬x2,x3xk)(¬x1,x2,¬x3xk)(x1,x2¬xk1¬xk)

Keep going until taking the only (kk) clause that eliminates all models assigning "1" to each variables among x1,x2xk.

The only models which are not yet eliminated assign all x1,x2xk to "0". Since m is a model, then take any set of nk clauses that eliminate all models assigning "1" to xi(k<in) and 0 to any k1 variables among x1,x2xk, for instance:
(¬xk+1,x1,xk1)(¬xn,x1xk1).

Then |F|=i=1k(ki)+nk=2k1+nk

To get more clauses, add any clause containing at least one negated variable. To get an unsatisfiable formula, just add a clause with k unnegated variables.


C'è un problema nella tua risposta: abbiamo n variabili e questo significa che e non k
Elaqqad
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.