Parece que você está tentando calcular um hipergrafo transversal do tamanho . Ou seja, é seu hipergrafo e é sua transversal. Uma tradução padrão é expressar as cláusulas como você possui e depois converter a restrição de comprimento em uma restrição de cardinalidade.k{T1,…,Tm}S
Portanto, use sua codificação existente, ou seja, e adicione cláusulas que codificam .⋀1≤j≤m⋁i∈Tjxi∑1≤i≤nxi≤k
∑1≤i≤nxi≤k é uma restrição de cardinalidade. Existem várias traduções diferentes de restrições de cardinalidade no SAT.
A conversão de restrição de cardinalidade mais simples, porém bastante grande, é apenas . Dessa forma, cada disjunção representa a restrição - para todos os subconjuntos de do tamanho k + 1. Ou seja, garantimos que não há como definir mais de k variáveis. Observe que esse não é o tamanho polinomial em ¬ ⋀ i ∈ X X i X { 1 , ... , n } k⋀X⊆{1,…,n},|X|=k+1⋁i∈X¬xi¬⋀i∈XxiX{1,…,n}k
Alguns links para artigos sobre traduções de restrições de cardinalidade com maior eficiência de espaço e tamanho polinomial em k :
- Traduzindo Restrições Pseudo-Booleanas para o SAT - Niklas Eén e Niklas Sörensson, JSAT vol 2 (2006), páginas 1-26 (uma boa pesquisa).
- Codificação CNF eficiente de restrições de cardinalidade booleana - Olivier Bailleux e Yacine Boufkhad, Procedimentos de princípios e práticas de programação de restrições 2003, LNCS vol 2833, pg 108-122 (uma tradução agradável e bastante fácil de implementar).
- Rumo a uma codificação ótima de restrições de cardinalidade booleana por CNF - Carsten Sinz - Procedimentos de princípios e práticas de programação de restrições 2005, LNCS 3709, pág. 827-831.
- Para codificações robustas de restrições de cardinalidade no CNF - João Marques-Silva e Inês Lynce, Procedimentos de princípios e práticas de programação de restrições 2007, LNCS 4741, pág. 483-497.
Se você está realmente interessado em resolver esses problemas, talvez seja melhor formulá-los como problemas pseudo-booleanos (consulte o artigo da wiki sobre problemas pseudo-booleanos ) e use solucionadores pseudo-booleanos (consulte competição pseudo-booleana ). Dessa forma, as restrições de cardinalidade são apenas restrições pseudo-booleanas e fazem parte da linguagem - espero que o solucionador pseudo-booleano as manipule diretamente e, portanto, com mais eficiência.