Tôi đang sử dụng một bộ giải SAT để mã hóa một vấn đề và là một phần của ví dụ SAT, tôi có các biến boolean trong đó có ý định rằng chính xác một trong những điều này là đúng và phần còn lại phải đúng là sai (Đôi khi tôi đã thấy điều này được mô tả là mã hóa "một nóng".)
Tôi muốn để mã hóa các hạn chế "một cách chính xác một trong số phải đúng" trong SAT. Cách tốt nhất để mã hóa ràng buộc này là gì, để làm cho bộ giải SAT chạy hiệu quả nhất có thể?
Tôi có thể thấy nhiều cách để mã hóa ràng buộc này:
Ràng buộc theo cặp. Tôi có thể thêm trở ngại cặp cho tất cả i , j để đảm bảo rằng nhiều nhất một x i là đúng, và sau đó thêm x 1 ∨ x 2 ∨ ⋯ ∨ x n để đảm bảo rằng ít nhất một là đúng.
Điều này thêm các mệnh đề và không có biến boolean phụ.
Mã hóa nhị phân. Tôi có thể giới thiệu biến boolean mới i 1 , i 2 , ... , i lg n để biểu diễn (ở dạng nhị phân) một số nguyên i như rằng 1 ≤ i ≤ n (thêm một vài trở ngại boolean để đảm bảo rằng tôi là trong phạm vi mong muốn ). Sau đó, tôi có thể thêm các ràng buộc thực thi rằng x i là cây và tất cả các x j khác đều sai. Nói cách khác, với mỗi j , chúng ta thêm các mệnh đề thực thi rằng i = j .
Điều này thêm các mệnh đề và tôi không biết có bao nhiêu biến boolean thêm.
Đếm số lượng giá trị thực. Tôi có thể thực hiện một cây mạch cộng boolean và yêu cầu , coi mỗi x i là 0 hoặc 1 thay vì sai hoặc đúng và sử dụng biến đổi Tseitin để chuyển đổi mạch thành SAT điều khoản. Một cây gồm nửa cộng là đủ: giới hạn đầu ra mang của mỗi nửa cộng là 0 và buộc đầu ra cuối cùng của nửa cộng cuối trong cây là 1. Cây có thể được chọn có hình dạng bất kỳ ( cây nhị phân cân bằng, hoặc không cân bằng, hoặc bất cứ điều gì).
Điều này có thể được thực hiện trong cửa và do đó cho biết thêm Θ ( n ) điều khoản và Θ ( n ) biến boolean mới.
Một trường hợp đặc biệt của phương pháp này là để giới thiệu các biến boolean , với ý tưởng rằng y i nên chứa giá trị của x 1 ∨ x 2 ∨ ⋯ ∨ x i . Mục đích này có thể được áp dụng bằng cách thêm các điều khoản y i ∨ ¬ x i , y i ∨ ¬ y i - 1 , và ¬ y i ∨ x i ∨ y i - (trong đó chúng tôi coi y 0 là từ đồng nghĩa với sai) choi=1,xóa,n. Tiếp theo, chúng ta có thể thêm các hạn chế¬ y i ∨¬ x i + 1 choi=1,2,...,n-1. Điều này về cơ bản tương đương với biến đổi Tseitin của cây nửa cộng, trong đó cây có hình dạng không cân đối tối đa.
Mạng bướm. Tôi có thể xây dựng một mạng lưới bướm trên bit, hạn chế n đầu vào -bit là 000 ⋯ 01 , hạn chế n đầu ra -bit là x 1 x 2 ⋯ x n , và đối xử với mỗi cổng bướm 2-bit như một cổng độc lập rằng hoán đổi hoặc không hoán đổi đầu vào của nó với quyết định sẽ làm gì dựa trên một biến boolean mới không bị giới hạn. Sau đó, tôi có thể áp dụng biến đổi Tseitin để chuyển đổi mạch thành mệnh đề SAT.
Điều này đòi hỏi cửa và do đó cho biết thêm Θ ( n lg n ) điều khoản và Θ ( n lg n ) biến boolean mới.
Có phương pháp nào khác mà tôi đã bỏ qua không? Tôi nên sử dụng cái nào? Có ai đã thử nghiệm điều này hoặc thử chúng bằng thực nghiệm, hoặc có ai có bất kỳ kinh nghiệm nào với những điều này không? Số mệnh đề và / hoặc số lượng biến boolean mới có phải là số liệu dự phòng tốt để ước tính tác động của điều này đối với hiệu suất của bộ giải SAT hay không, nếu không, bạn sẽ sử dụng số liệu nào?
Tôi chỉ nhận thấy rằng câu trả lời này có một số tài liệu tham khảo về việc thực thi các ràng buộc về tim mạch đối với SAT, nghĩa là, thực thi các ràng buộc mà chính xác trong số các biến n là đúng. Vì vậy, câu hỏi của tôi đi đến một trường hợp đặc biệt trong đó k = 1 . Có lẽ các tài liệu về các ràng buộc về tim mạch sẽ giúp làm sáng tỏ câu hỏi của tôi.