Encodage d'une contrainte sur 1 pour les solveurs SAT


25

J'utilise un solveur SAT pour coder un problème, et dans le cadre de l'instance SAT, j'ai des variables booléennes x1,x2,,xn où il est prévu que l'une d'entre elles soit vraie et que le reste soit être faux. (J'ai parfois vu cela décrit comme un encodage "à chaud".)

Je veux encoder la contrainte "exactement un sur x1,,xn doit être vrai" dans SAT. Quelle est la meilleure façon de coder cette contrainte, pour faire fonctionner le solveur SAT aussi efficacement que possible?

Je peux voir de nombreuses façons de coder cette contrainte:

  • Contraintes par paire. Je pourrais ajouter des contraintes par paire ¬xi¬xj pour tout i,j pour m'assurer qu'au plus un xi est vrai, puis ajouter x1x2xn pour m'assurer qu'au moins un est vrai.

    Cela ajoute des clauses Θ(n2) et aucune variable booléenne supplémentaire.

  • Encodage binaire. Je pourrais introduire lgn nouvelles variables booléennes i1,i2,,ilgn pour représenter (en binaire) un entier i tel que 1in (en ajoutant quelques contraintes booléennes pour s'assurer que i est dans la plage souhaitée ). Ensuite, je peux ajouter des contraintes imposant que xi est arbre et que tous les autres xj sont faux. En d'autres termes, pour chaque j , nous ajoutons des clauses imposant que i=jxj .

    Cela ajoute des clauses Θ(nlgn) et je ne sais pas combien de variables booléennes supplémentaires.

  • Comptez le nombre de vraies valeurs. Je pourrais implémenter un arbre de circuits d'additionneurs booléens et exiger que x1+x2++xn=1 , en traitant chaque xi comme 0 ou 1 au lieu de faux ou vrai, et utiliser la transformation Tseitin pour convertir le circuit en SAT clauses. Un arbre de demi-additionneurs suffit: contraignez la sortie de report de chaque demi-additionneur à 0, et contraignez la sortie finale du demi-additionneur final de l'arbre à 1. L'arbre peut être choisi pour être de n'importe quelle forme ( arbre binaire équilibré, ou déséquilibré, ou autre).

    Cela peut être fait en portes et ajoute ainsi thetav ( n ) clauses et Θ ( n ) de nouvelles variables booléennes.Θ(n)Θ(n)Θ(n)

    Un cas particulier de cette approche est d'introduire des variables booléennes , avec l'idée que y i devrait contenir la valeur de x 1x 2x i . Cette intention peut être appliquée en ajoutant les clauses y i¬ x i , y i¬ y i - 1 , et ¬ y ix iy i -y1,,ynyix1x2xiyi¬xiyi¬yi1 (où nous traitons y 0 comme synonyme de faux) pouri=1,,n. Ensuite, on peut ajouter les restrictions¬ y i¬ x i + 1 pouri=1,2,,n-1. Ceci est fondamentalement équivalent à la transformée Tseitin d'un arbre à moitié additionneur, où l'arbre a une forme au maximum déséquilibrée.¬yixiyi1y0i=1,,n¬yi¬xi+1i=1,2,,n1

  • Réseau de papillons. Je pourrais construire un réseau papillon sur bits, contraindre l' entrée à n bits à 000 01 , contraindre la sortie à n bits à x 1 x 2x n , et traiter chaque porte papillon 2 bits comme une porte indépendante qui permute ou n'échange pas son entrée avec la décision de le faire sur la base d'une nouvelle variable booléenne qui n'est pas contrainte. Ensuite, je peux appliquer la transformée Tseitin pour convertir le circuit en clauses SAT.nn00001nx1x2xn

    Cela nécessite portes et ajoute donc Θ ( n lg n ) clauses et Θ ( n lg n ) nouvelles variables booléennes.Θ(nlgn)Θ(nlgn)Θ(nlgn)

Y a-t-il d'autres méthodes que j'ai ignorées? Lequel devrais-je utiliser? Quelqu'un l'a-t-il testé ou essayé expérimentalement, ou quelqu'un a-t-il une expérience avec l'un de ces éléments? Le nombre de clauses et / ou le nombre de nouvelles variables booléennes est-il une bonne métrique stand-in pour estimer l'impact de ceci sur les performances du solveur SAT, ou sinon, quelle métrique utiliseriez-vous?


Je viens de remarquer que cette réponse a des références sur l'application des contraintes de cardinalité pour SAT, c'est-à-dire, l'application de la contrainte selon laquelle exactement des n variables sont vraies. Donc, ma question se résume à un cas spécial où k = 1 . Peut-être que la littérature sur les contraintes de cardinalité aidera à éclairer ma question.knk=1


La plupart des solveurs SAT modernes prennent en charge les clauses de cardinalité et d'autres contraintes spéciales (non CNF) prêtes à l'emploi.
Dávid Horváth

Réponses:


12

Pour le cas spécial de k sur n variables vraies où k = 1, il existe un codage de variable de commande comme décrit dans EOD CNF Encoding for Selecting 1 to N Objects by Klieber and Kwon. Simplifié: divisez les variables en petits groupes et ajoutez des clauses qui font que l'état d'une variable de commande implique qu'un groupe de variables est soit faux soit tout sauf un. Ensuite, appliquez récursivement le même algorithme aux variables de commande. À la fin du processus, exigez que l'exactement l'une des quelques variables finales du commandant soit vraie. Le résultat est O (n) nouvelles clauses et O (n) nouvelles variables.

Étant donné l'omniprésence des littéraux à deux observés dans les solveurs basés sur DPLL, je pense que la croissance de la clause O (n) est un avantage décisif par rapport aux schémas de codage qui ajouteraient plus de clauses.


2
Si "petit groupe" a une taille deux, alors ce n'est qu'un ajout binaire, où "commandant" est le bit de résultat, et le report est déclaré faux. Fait récursivement, cette méthode est tout à fait générale (fonctionne pour 1 de N) et en effet pratiquement réalisable.
d8d0d65b3f7cf42

3

Un article de Magnus Björk décrit deux techniques qui pourraient valoir la peine d'être essayées.

Pour 1-out-of- , on peut utiliser à la fois d' un hot et codage binaire simultanément. Ainsi, nous avons x 1 , , x n comme un codage à chaud, et y 1 , , y b comme un codage binaire, où b = lg n . On peut encoder facilement la "au moins une" contrainte, en une seule clause: ( x 1x n ) . On peut également forcer les deux encodages à être cohérents avec 2 lg nnx1,,xny1,,ybb=lgn(x1xn)2lgnclauses: on ajoute simplement ou x ixi¬yj , selon que le j ème bit du codage binaire de i est 0 ou 1. Enfin, la contrainte "au plus un" suit automatiquement. Cela permet également au reste de l'instance SAT d'utiliser le codage le plus pratique.xiyjji

Pour -out-of- n , on peut appliquer un réseau de tri à l'entrée x 1 , , x n pour obtenir la sortie triée y 1 , , y n , puis ajouter une clause exigeant que y k soit vrai et y k + 1 est faux. Il existe un certain nombre de réseaux de tri simples qui ne nécessitent que des unités de comparaison O ( n lg 2 n ) . Par conséquent, nous obtenons un encodage qui utilise O ( n lg 2knx1,,xny1,,ynykyk+1O(nlg2n) clauses et variables temporaires.O(nlg2n)

Le papier est

Magnus Björk. Techniques d'encodage SAT réussies . 25 juillet 2009.

L'article suivant contient une liste détaillée des codages pour 1 sur et k sur - n , avec une évaluation expérimentale de chacun d'eux. Les conclusions ne sont pas tout à fait claires (l'encodage des commandes semble assez bon dans leurs expériences).nkn

Alan M. Frisch, Paul A. Giannaros. Encodages SAT de la contrainte At-Most-k: certains anciens, certains nouveaux, certains rapides, certains lents . ModRef 2010.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.