Ich verwende einen SAT-Löser, um ein Problem zu kodieren, und als Teil der SAT-Instanz habe ich boolesche Variablen wobei genau eine davon wahr sein soll und der Rest wahr sein soll falsch sein. (Ich habe dies manchmal als "One-Hot" -Codierung beschrieben gesehen.)
Ich möchte die Bedingung "genau eine von muss wahr sein" in SAT codieren . Wie kann diese Einschränkung am besten codiert werden, damit der SAT-Solver so effizient wie möglich ausgeführt wird?
Ich sehe viele Möglichkeiten, diese Einschränkung zu kodieren:
Paarweise Einschränkungen. Ich konnte paarweise hinzufügen , Constraints für alle i , j , um sicherzustellen , dass höchstens ein x i wahr ist, und fügen Sie dann x 1 ∨ x 2 ∨ ⋯ ∨ x n , um sicherzustellen , dass mindestens ein wahr ist.
Dies fügt -Klauseln und keine zusätzlichen booleschen Variablen hinzu.
Binäre Codierung. Ich könnte neue boolesche Variablen i 1 , i 2 , ... , i lg n einführen , um (in binärer Form) eine ganze Zahl i so darzustellen, dass 1 ≤ i ≤ n (Hinzufügen einiger boolescher Bedingungen, um sicherzustellen, dass i im gewünschten Bereich liegt) ). Dann kann ich Einschränkungen hinzufügen, die erzwingen, dass x i ein Baum ist und dass alle anderen x j falsch sind. Mit anderen Worten, für jedes j fügen wir Klauseln hinzu, die erzwingen, dass i = j ist .
Dies fügt -Klauseln hinzu und ich weiß nicht, wie viele zusätzliche boolesche Variablen es gibt.
Zählen Sie die Anzahl der wahren Werte. Ich könnte einen Baum von Booleschen Addierschaltungen implementieren und fordern und jedes x i als 0 oder 1 anstelle von falsch oder wahr behandeln und die Tseitin-Transformation verwenden, um die Schaltung in SAT umzuwandeln Klauseln. Ein Baum von Halbaddierern reicht aus: Beschränken Sie die Übertragausgabe jedes Halbaddierers auf 0, und beschränken Sie die Endausgabe des letzten Halbaddierers im Baum auf 1. Der Baum kann beliebig geformt sein ( ausgeglichener binärer Baum oder unsymmetrisch oder was auch immer).
Dies kann in Gattern geschehen und fügt somit Θ ( n ) Klauseln und Θ ( n ) neue boolesche Variablen hinzu.
Ein Spezialfall dieses Ansatzes ist Booleschen Variablen einzuführen , mit der Idee , dass y i den Wert enthalten sollte , x 1 ∨ x 2 ∨ ⋯ ∨ x i . Diese Absicht kann durch Hinzufügen der Klauseln durchgesetzt werden y i ∨ ¬ x i , y i ∨ ¬ y i - 1 , und ¬ y i ∨ x i ∨ y i - (wobei wir y 0 als Synonym für falsch behandeln) füri=1,…,n. Als nächstes können wir die Restriktionen¬ y i ∨¬ x i + 1 füri=1,2,…,n-1addieren. Dies entspricht im Wesentlichen der Tseitin-Transformation eines Halbaddiererbaums, bei der der Baum eine maximal unausgeglichene Form aufweist.
Schmetterlingsnetzwerk. Ich könnte ein Schmetterlingsnetz auf Bits aufbauen , den n- Bit-Eingang auf 000 ⋯ 01 beschränken, den n- Bit-Ausgang auf x 1 x 2 ⋯ x n beschränken und jedes 2-Bit-Schmetterlingsgatter als unabhängiges Gatter behandeln das tauscht entweder seine Eingabe mit der Entscheidung, was zu tun ist, basierend auf einer frischen neuen booleschen Variablen, die uneingeschränkt bleibt, aus oder tauscht sie nicht aus. Dann kann ich die Tseitin-Transformation anwenden, um die Schaltung in SAT-Klauseln umzuwandeln.
Dies erfordert Gatter und fügt somit Θ ( n lg n ) Klauseln und Θ ( n lg n ) neue boolesche Variablen hinzu.
Gibt es andere Methoden, die ich übersehen habe? Welches soll ich verwenden? Hat jemand dies getestet oder sie experimentell ausprobiert oder hat jemand irgendwelche Erfahrungen mit diesen? Ist die Anzahl der Klauseln und / oder die Anzahl der neuen booleschen Variablen eine gute Ersatzmetrik für die Abschätzung der Auswirkungen auf die Leistung des SAT-Lösers, oder wenn nicht, welche Metrik würden Sie verwenden?
Ich habe gerade bemerkt, dass diese Antwort einige Hinweise zur Durchsetzung von Kardinalitätsbeschränkungen für SAT enthält, dh zur Durchsetzung der Beschränkung, dass genau aus den n Variablen wahr sind. Meine Frage ist also ein Sonderfall mit k = 1 . Vielleicht hilft die Literatur über Kardinalitätsbeschränkungen, meine Frage zu beleuchten.