2012-09-03 30 views
12

Tôi đã viết câu trả lời cho những gì tôi nghĩ là quite interesting question, nhưng tiếc là câu hỏi đã bị tác giả của tác giả xóa trước khi tôi có thể đăng. Tôi đang reposting một bản tóm tắt của câu hỏi và câu trả lời của tôi ở đây trong trường hợp nó có thể được sử dụng cho bất cứ ai khác.Bộ giải SAT có thể được sử dụng để tìm tất cả các giải pháp không?

Giả sử tôi có bộ giải SAT, được cung cấp công thức Boolean trong biểu mẫu bình thường liên kết, trả về một giải pháp (bài tập biến thỏa mãn công thức) hoặc thông tin không giải quyết được.

Tôi có thể sử dụng bộ giải này để tìm kiếm tất cả giải pháp không?

+0

thể người downvoted xin giải thích lý do tại sao? Sau khi đọc mục nhập blog này (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/), tôi nghĩ những gì tôi đã làm ở đây là "không chỉ đơn thuần là OK, "nhưng" được khuyến khích một cách rõ ràng. " – Vectornaut

+1

Hoàn toàn ổn. Câu trả lời hay, btw. –

Trả lời

8

Chắc chắn có cách để sử dụng trình giải SAT mà bạn đã mô tả để tìm tất cả các giải pháp của bài toán SAT, mặc dù nó có thể không phải là cách hiệu quả nhất.

Chỉ cần sử dụng bộ giải để tìm giải pháp cho vấn đề ban đầu của bạn, thêm mệnh đề không làm gì ngoại trừ loại trừ giải pháp bạn vừa tìm thấy, sử dụng bộ giải để tìm giải pháp cho vấn đề mới, v.v. Tiếp tục cho đến khi bạn gặp sự cố không thỏa mãn.


Ví dụ: giả sử bạn muốn thỏa mãn (X or Y) and (X or Z). Có năm các giải pháp:

  • Bốn với X đúng, YZ tùy ý.

  • Một với X sai, YZ đúng.

Vì vậy, bạn chạy trình giải quyết của mình và giả sử nó cung cấp cho bạn giải pháp (X, Y, Z) = (T, F, F). Bạn có thể loại trừ giải pháp này --- và chỉ giải pháp này --- với các hạn chế

not (X and (not Y) and (not Z)) 

hạn chế này có thể được viết lại như mệnh đề

(not X) or Y or Z 

Vì vậy, bây giờ bạn có thể chạy giải của bạn trên vấn đề mới

(X or Y) and (X or Z) and ((not X) or Y or Z) 

v.v.


Như tôi đã nói, đây là cách để làm những gì bạn muốn, nhưng nó có lẽ không phải là cách hiệu quả nhất. Khi người giải quyết SAT của bạn đang tìm kiếm một giải pháp, nó học rất nhiều về vấn đề, nhưng nó không trả lại tất cả thông tin đó cho bạn --- nó chỉ cung cấp cho bạn giải pháp mà nó tìm thấy. Khi bạn chạy trình giải quyết một lần nữa, nó phải tìm hiểu lại tất cả các thông tin đã bị vứt đi.

8

Chắc chắn có thể.Khi MiniSat [1] tìm thấy một giải pháp

s SATISFIABLE 
v 1 2 -3 0 

(giải pháp 1 = True, 2 = True, 3 = False) sau đó bạn phải đưa vào bản gốc CNF [2] một điều khoản rằng cấm giải pháp này:

-1 -2 3 0 

(có nghĩa là 1 hoặc 2 phải là False hoặc 3 phải là True). Sau đó, bạn giải quyết một lần nữa. Bạn làm điều này cho đến khi người giải quyết trả về UNSAT tức là không có thêm giải pháp cho vấn đề. Bạn sẽ chèn một mệnh đề cho mỗi lần lặp và mỗi mệnh đề sẽ có định dạng giống như giải pháp ngoại trừ việc nó bị đảo ngược và có một số 0 ở cuối

Làm điều này nhanh hơn bằng giao diện C++ của MiniSat sau đó nó có thể lưu dữ liệu trung gian và các lần lặp lại sẽ nhanh hơn.

[1] http://minisat.se/

[2] http://fairmut3x.wordpress.com/2011/07/29/cnf-conjunctive-normal-form-dimacs-format-explained/

Các vấn đề liên quan