Używam solwera SAT do zakodowania problemu, a jako część instancji SAT mam zmienne logiczne gdzie jest zamierzone, że dokładnie jedna z nich powinna być prawdziwa, a reszta powinna być fałszywa . (Czasami widziałem to opisywane jako kodowanie „na gorąco”).
Chcę zakodować ograniczenie „dokładnie jeden z musi być prawdziwe” w SAT. Jaki jest najlepszy sposób na zakodowanie tego ograniczenia, aby solver SAT działał tak skutecznie, jak to możliwe?
Widzę wiele sposobów kodowania tego ograniczenia:
Wiązania parami. Mógłbym dodać ograniczenia parowe dla wszystkich aby upewnić się, że co najmniej jeden x_i jest prawdziwy, a następnie dodać x_1 \ lor x_2 \ lor \ cdots \ lor x_n, aby upewnić się, że co najmniej jeden jest prawdziwy . i , j x i x 1 ∨ x 2 ∨ ⋯ ∨ x n
Dodaje to klauzule i żadnych dodatkowych zmiennych boolowskich.
Kodowanie binarne. Mógłbym wprowadzić nowych zmiennych boolowskich aby reprezentować (binarnie) liczbę całkowitą taką, że (dodając kilka ograniczeń boolowskich, aby zapewnić, że jest w żądanym zakresie). Następnie mogę dodać ograniczenia wymuszające, że jest drzewem i że wszystkie inne są fałszywe. Innymi słowy, do każdego dodajemy klauzule wymuszające, że .
Dodaje to klauzule i nie wiem, ile dodatkowych zmiennych boolowskich.
Policz liczbę prawdziwych wartości. Mógłbym zaimplementować drzewo boolowskich obwodów sumujących i wymagać, aby , traktując każdy jako 0 lub 1 zamiast fałszu lub prawdy, i użyj transformacji Tseitin do przekształcenia obwodu w klauzule SAT. Wystarczy drzewo pół-sumatorów: ogranicz wyjściową wartość przenoszenia każdego pół-sumatora do 0, a końcową moc wyjściową końcowego pół-sumatora w drzewie należy wynosić 1. Drzewo można wybrać tak, aby miało dowolny kształt ( zrównoważone drzewo binarne, niezrównoważone lub cokolwiek innego).
Można to zrobić w bramy i w ten sposób zwiększa rozdziałów i nowych zmiennych logicznych.
Szczególnym przykładem tego podejścia jest wprowadzenie zmiennych boolowskich , przy założeniu, że powinien zawierać wartość . Tę intencję można egzekwować, dodając klauzule , i (gdzie traktujemy jako synonimem false) dla . Następnie możemy dodać ograniczenia dla . Zasadniczo jest to równoważne transformacji Tseitin drzewa pół-sumatora, w którym drzewo ma maksymalnie niezrównoważony kształt.
Sieć motyli. Mógłbym zbudować sieć motylkową na bitach, ograniczyć wejście bitowe do , ograniczyć wyjście bitowe do i traktować każdą 2-bitową bramę motylkową jako niezależną bramę, która albo zamienia, albo nie zamienia danych wejściowych przy podejmowaniu decyzji na podstawie nowej zmiennej boolowskiej, która nie jest ograniczona. Następnie mogę zastosować transformację Tseitin, aby przekształcić obwód w klauzule SAT.n 000 ⋯ 01 n x 1 x 2 ⋯ x n
Wymaga bramy i w ten sposób zwiększa i zawartych nowe zmienne logiczne.Θ ( n lg n ) Θ ( n lg n )
Czy są jakieś inne metody, które przeoczyłem? Którego powinienem użyć? Czy ktoś to przetestował lub wypróbował eksperymentalnie, czy też ktoś ma z tym jakieś doświadczenie? Czy liczba klauzul i / lub liczba nowych zmiennych boolowskich jest dobrą miarą zastępczą do oszacowania wpływu tego na wydajność solvera SAT, a jeśli nie, jakiej metryki byś użył?
Właśnie zauważyłem, że w tej odpowiedzi znajdują się odniesienia do egzekwowania ograniczeń liczności dla SAT, tj. Wymuszania ograniczenia, że dokładnie spośród zmiennych jest prawdziwe. Moje pytanie sprowadza się więc do szczególnego przypadku, w którym . Może literatura na temat ograniczeń liczności pomoże rzucić światło na moje pytanie.n k = 1