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)∧x≠x0kkk=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)x⋅y=n∧x>1∧y>1∧x≤yk-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