Sembra che tu stia provando a calcolare un ipergrafo trasversale di dimensione K . Cioè, { T1, ... , Tm} è il tuo ipergrafo e S è il tuo trasversale. Una traduzione standard consiste nell'esprimere le clausole come in precedenza, quindi tradurre la limitazione della lunghezza in un vincolo di cardinalità.
Quindi usa la tua codifica esistente, ovvero e quindi aggiungi clausole di codifica .⋀1 ≤ j ≤ m⋁io ∈ TjXioΣ1 ≤ i ≤ nXio≤ k
Σ1 ≤ i ≤ nXio≤ k è un vincolo di cardinalità. Esistono diverse traduzioni di vincoli di cardinalità in SAT.
La traduzione del vincolo di cardinalità più semplice ma piuttosto grande è solo . In questo modo ogni disgiunzione rappresenta il vincolo - per tutti i sottoinsiemi di di dimensione k + 1. Cioè, ci assicuriamo che non sia possibile impostare più di k variabili. Si noti che questa non è una dimensione polinomiale in⋀X⊆ { 1 , … , n } , | X| =k+1⋁io ∈ X¬ xio¬ ⋀io ∈ XXioX{ 1 , ... , n }K
Alcuni collegamenti a documenti su traduzioni con vincoli di cardinalità più efficienti in termini di spazio che hanno dimensioni polinomiali inK :
- Tradurre vincoli pseudo-booleani in SAT - Niklas Eén e Niklas Sörensson, JSAT vol 2 (2006), pg 1-26 (un buon sondaggio).
- Codifica CNF efficiente dei vincoli della cardinalità booleana - Olivier Bailleux e Yacine Boufkhad, Proceedings of Principles and Practice of Constraint Programming 2003, LNCS vol 2833, pg 108-122 (una traduzione piacevole, abbastanza facile da implementare).
- Verso una codifica CNF ottimale dei vincoli della cardinalità booleana - Carsten Sinz - Atti di principi e pratica della programmazione dei vincoli 2005, LNCS 3709, pag. 827-831.
- Verso una robusta codifica CNF dei vincoli di cardinalità - Joao Marques-Silva e Inês Lynce, Atti di principi e pratica della programmazione dei vincoli 2007, LNCS 4741, pag. 483-497.
Se sei effettivamente interessato a risolvere tali problemi, forse è meglio formularli come problemi pseudo-booleani (vedi l' articolo wiki sui problemi pseudo-booleani ) e usare solutori pseudo-booleani (vedi competizione pseudo-booleana ). In questo modo i vincoli di cardinalità sono solo vincoli pseudo-booleani e fanno parte del linguaggio - si spera che il risolutore pseudo-booleano li gestisca direttamente e quindi in modo più efficiente.