Voici une façon de générer une instance Unique -SAT, étant donné une instance SAT que vous savez satisfaisante. Considérons la formule donnée parφ ψ ( x )kφψ(x)
φ(x)∧h(x)=y,
où est une fonction de hachage qui associe une affectation à une valeur de bits (pour une petite valeur de ), et est une valeur de bits aléatoire . Si a environ affectations satisfaisantes, alors (heuristiquement) nous supposons que aura exactement une affectation satisfaisante (avec une probabilité constante). Nous pouvons tester si c'est le cas en utilisant un solveur SAT (à savoir, tester si est satisfaisable; si c'est le cas, et est une affectation satisfaisante, tester si est satisfiable). Six k k y k φ 2 k ψ ψ x 0 ψ ( x ) ∧ x ≠ x 0 k k k = 1 , 2 , … , n n xhxkkykφ2kψψx0ψ(x)∧x≠x0kn'est pas connu, vous pouvez trouver utilisant la recherche binaire ou simplement en itérant sur chaque valeur candidate (où est le nombre de variables booléennes en ).kk=1,2,…,nnx
Vous pouvez choisir librement la fonction de hachage. Vous voudrez probablement le rendre aussi simple que possible. Une construction extrêmement simple consiste à avoir sélectionner un sous-ensemble aléatoire de bits à partir de . Une construction légèrement plus sophistiquée consiste à avoir le ème bit de comme le xor de deux bits choisis au hasard parmi (en choisissant une paire distincte de positions de bits pour chaque , indépendamment). Garder simple gardera relativement simple.k x i h ( x ) x i h ψhkxih(x)xihψ
Ce type de transformation est parfois utilisé / suggéré, dans le cadre d'un schéma d'estimation du nombre d'assignations satisfaisantes à une formule ; Je l'ai adapté à votre besoin particulier.φ
Vous pouvez trouver de nombreux bancs d'essai d'instances SAT sur Internet, et vous pouvez appliquer cette transformation à toutes, pour obtenir une collection d' instances -SAT uniques .k
Une autre possibilité serait de générer des instances uniques -SAT à partir de la cryptographie. Par exemple, supposons que est une permutation cryptographique à sens unique. Soit un élément choisi au hasard de , et soit . Alors la formule donnée par est une instance Unique -SAT. Comme autre exemple, choisissez deux grands nombres premiers au hasard et laissez . Alors la formule donnée parf : { 0 , 1 } n → { 0 , 1 } n x { 0 , 1 } n y = f ( x ) φ ( x ) f ( x ) = y k p , q n = p q φ ( x , y ) x ⋅ y = n ∧ x >kf:{0,1}n→{0,1}nx{0,1}ny=f(x)φ(x)f(x)=ykp,qn=pqφ(x,y)x⋅y=n∧x>1∧y>1∧x≤y(avec la correspondance évidente entre les chaînes de bits et les entiers) est une instance Unique -SAT. Cependant, ces constructions ne semblent pas être un moyen utile de comparer ou d'optimiser votre solveur. Ils ont tous une structure spéciale et il n'y a aucune raison de croire que cette structure est représentative des problèmes du monde réel. En particulier, les instances SAT tirées de problèmes cryptographiques sont connues pour être extrêmement dures, beaucoup plus difficiles que les instances SAT tirées de nombreuses autres applications réelles des solveurs SAT, elles ne sont donc pas une très bonne base pour évaluer votre solveur.k
En général, toutes les techniques mentionnées dans cette réponse ont l'inconvénient de générer des instances -SAT uniques avec une structure particulière, de sorte qu'elles peuvent ne pas être ce que vous recherchez - ou, du moins, vous ne voudrez peut-être pas vous fier uniquement sur des formules générées de cette manière. Une meilleure approche serait d'identifier les applications de Unique -SAT (qui, selon vous, va utiliser votre solveur, et dans quel but?), Puis d'essayer d'obtenir des exemples réalistes de ces domaines d'application.kk
Pour une rubrique connexe, voir également Génération de problèmes d'optimisation combinatoire intéressants