Il semble que vous essayez de calculer un hypergraphe transversal de taille . Autrement dit, est votre hypergraphe, et est votre transversale. Une traduction standard consiste à exprimer les clauses telles que vous les avez, puis à traduire la restriction de longueur en une contrainte de cardinalité.{ T 1 , … , T m } Sk{ T1, … , Tm}S
Utilisez donc votre encodage existant, c'est-à-dire puis ajoutez des clauses encodant .∑ 1 ≤ i ≤ n xi≤k⋀1 ≤ j ≤ m⋁i ∈ TjXje∑1 ≤ i ≤ nXje≤ k
∑1 ≤ i ≤ nXje≤ k est une contrainte de cardinalité. Il existe différentes traductions de contraintes de cardinalité en SAT.
La traduction de contrainte de cardinalité la plus simple mais la plus grande est simplement . De cette façon, chaque disjonction représente la contrainte - pour tous les sous-ensembles de de taille k + 1. Autrement dit, nous nous assurons qu'il n'y a aucun moyen de définir plus de k variables. Notez que ce n'est pas une taille polynomiale en ¬ ⋀ i ∈ X x i X { 1 , … , n } k⋀X⊆ { 1 , … , n } , | X| =k+1⋁i ∈ X¬ xje¬ ⋀i ∈ XXjeX{ 1 , … , n }k
Quelques liens vers des articles sur des traductions de contraintes de cardinalité plus efficaces en espace qui sont de taille polynomiale enk :
- Traduire les contraintes pseudo-booléennes en SAT - Niklas Eén et Niklas Sörensson, JSAT vol 2 (2006), p. 1-26 (une bonne enquête).
- Codage CNF efficace des contraintes de cardinalité booléenne - Olivier Bailleux et Yacine Boufkhad, Actes de principes et pratique de programmation par contraintes 2003, LNCS vol 2833, p. 108-122 (une traduction agréable et assez facile à mettre en œuvre).
- Vers un codage CNF optimal des contraintes de cardinalité booléenne - Carsten Sinz - Actes de principes et pratiques de programmation par contraintes 2005, LNCS 3709, pg 827-831.
- Vers des codages CNF robustes des contraintes de cardinalité - Joao Marques-Silva et Inês Lynce, Actes de principes et pratiques de programmation par contraintes 2007, LNCS 4741, p. 483-497.
Si vous êtes réellement intéressé à résoudre de tels problèmes, il est peut-être préférable de les formuler comme des problèmes pseudo-booléens (voir l' article wiki sur les problèmes pseudo-booléens ) et d'utiliser des solveurs pseudo-booléens (voir la concurrence pseudo-booléenne ). De cette façon, les contraintes de cardinalité ne sont que des contraintes pseudo-booléennes et font partie du langage - espérons que le solveur pseudo-booléen les traite ensuite directement et donc plus efficacement.