Tại sao không có thuật toán gần đúng cho SAT và các vấn đề quyết định khác?


18

Tôi có một vấn đề quyết định NP-đầy đủ. Đưa ra một ví dụ của vấn đề, tôi muốn thiết kế một thuật toán tạo ra CÓ, nếu vấn đề đó là khả thi, và, KHÔNG, ngược lại. (Tất nhiên, nếu thuật toán không tối ưu, nó sẽ mắc lỗi.)

Tôi không thể tìm thấy bất kỳ thuật toán gần đúng cho các vấn đề như vậy. Tôi đã tìm kiếm cụ thể về SAT và tôi đã tìm thấy trên trang Wikipedia về Thuật toán xấp xỉ như sau: Một hạn chế khác của cách tiếp cận là nó chỉ áp dụng cho các vấn đề tối ưu hóa và không phải là các vấn đề quyết định "thuần túy" như thỏa mãn, mặc dù thường có thể .. .

Tại sao chúng ta không, ví dụ, xác định tỷ lệ gần đúng là một cái gì đó tỷ lệ thuận với số lỗi mà thuật toán gây ra? Làm thế nào để chúng ta thực sự giải quyết các vấn đề quyết định theo cách tham lam và không tối ưu?


5
Có các thuật toán gần đúng cho MAX-SAT.
Yuval Filmus

2
MAX-SAT không phải là vấn đề quyết định, phải không?
Ribz 7/11/2016

15
Các thuật toán gần đúng luôn luôn cho các vấn đề tối ưu hóa.
Yuval Filmus

4
Vì vậy, về cơ bản bạn muốn có một thuật toán kết thúc nhanh chóng nhưng đôi khi được phép đưa ra câu trả lời sai. Tôi nghĩ rằng bạn đang nhầm lẫn các vấn đề rất lớn bằng cách sử dụng các thuật ngữ được xác định rõ như "thuật toán gần đúng" và "tối ưu" ở đây. Những người có ý nghĩa rất cụ thể. Tôi đoán bạn đang tìm kiếm một heuristic thay vào đó - nếu bạn cập nhật câu hỏi của mình với thuật ngữ đó (hoặc bắt đầu từ đầu với một câu hỏi mới để tránh nhầm lẫn hơn nữa), bạn có thể có kết quả tốt hơn.
AnoE

Mặc dù đây không phải là một câu trả lời hoàn chỉnh, nhưng nó giải thích một phần lý do: tồn tại các vấn đề SAT quan trọng mà chỉ có sai bit thấp không tốt hơn là sai một nửa số bit.
Joshua

Câu trả lời:


33

Các thuật toán gần đúng chỉ dành cho các vấn đề tối ưu hóa, không phải cho các vấn đề quyết định.

Tại sao chúng ta không định nghĩa tỷ lệ gần đúng là một phần sai lầm của thuật toán, khi cố gắng giải quyết một số vấn đề quyết định? Bởi vì "tỷ lệ gần đúng" là một thuật ngữ có nghĩa chuẩn, được xác định rõ, một nghĩa có nghĩa khác và sẽ khó hiểu khi sử dụng cùng một thuật ngữ cho hai điều khác nhau.

OK, chúng ta có thể định nghĩa một số tỷ lệ khác (hãy gọi nó là một tỷ lệ khác - ví dụ: "tỷ lệ det") định lượng số lượng lỗi mà thuật toán gây ra, cho một số vấn đề quyết định? Chà, không rõ làm thế nào để làm điều đó. Điều gì sẽ là mẫu số cho phân số đó? Hoặc, nói một cách khác: sẽ có vô số trường hợp vấn đề và đối với một số trong số đó, thuật toán sẽ đưa ra câu trả lời đúng và một số khác thì nó sẽ trả lời sai, vì vậy bạn kết thúc với một tỷ lệ "Một cái gì đó chia cho vô cùng", và cuối cùng là vô nghĩa hoặc không được xác định.

Ngoài ra, chúng ta có thể định nghĩa là một phần sai lầm của các lỗi thuật toán, trong các trường hợp vấn đề có kích thước . Sau đó, chúng ta có thể tính giới hạn của là , nếu giới hạn đó tồn tại. Điều này sẽ được xác định rõ (nếu giới hạn tồn tại). Tuy nhiên, trong hầu hết các trường hợp, điều này có thể không hữu ích lắm. Cụ thể, nó mặc nhiên thừa nhận một phân phối thống nhất trong các trường hợp vấn đề. Tuy nhiên, trong thế giới thực, phân phối thực tế trong các trường hợp sự cố có thể không đồng nhất - nó thường rất xa so với đồng phục. Do đó, số bạn nhận được theo cách này thường không hữu ích như bạn có thể hy vọng: nó thường mang lại ấn tượng sai lệch về mức độ tốt của thuật toán. n r n n rnnrnn

Để tìm hiểu thêm về cách mọi người đối phó với độ hấp dẫn (độ cứng NP), hãy xem Xử lý sự khó hiểu: Các vấn đề hoàn chỉnh NP .


3
+1. Nhưng điểm cuối cùng không vững chắc, người ta có thể lập luận rằng bạn có thể định nghĩa tỷ lệ gần đúng là giới hạn khi n đi đến vô cùng số lượng lỗi mà chương trình mắc phải khi nhập độ dài n trên số chuỗi có độ dài n. Điều này tất nhiên hóa ra không hữu ích, vì thường thì một chương trình đơn giản chỉ xuất ra "CÓ" (hoặc "KHÔNG") đạt được tỷ lệ tốt (đôi khi là 1!).
aelguindy

1
@det, đó là một câu hỏi riêng biệt, một câu hỏi mà bạn nên hỏi riêng (sau khi đọc về nó trong sách giáo khoa tiêu chuẩn hoặc tài nguyên trực tuyến). Chúng tôi muốn bạn chỉ hỏi một câu hỏi cho mỗi bài viết.
DW

1
@aelguindy, điểm tốt. Tôi đã cập nhật câu trả lời của mình cho phù hợp.
DW

2
@det Tại sao tham lam? "Gần như" giải quyết vấn đề quyết định nghĩa là gì?
Raphael

2
@Mehrdad: Thông thường, bạn đánh giá một thuật toán gần đúng bằng lỗi trong trường hợp xấu nhất của nó: giới hạn trên về mức độ không tối ưu của nó. Vì vậy, ví dụ, bạn có thể nói rằng một thuật toán gần đúng nhất định luôn tìm thấy một kết quả ít nhất là năm phần sáu của kết quả tối ưu. Không có cách nào thực sự để chuyển vấn đề đó thành vấn đề quyết định; nếu thuật toán của bạn đôi khi phát ra (nói) 0.1, sau đó hoặc là nó đôi khi tắt bằng 0,9 (trong trường hợp này bạn sẽ làm tốt hơn, trong trường hợp xấu nhất, để luôn luôn Emit 0.5), hoặc là "gần đúng" -ness là một giả và "0.1 "Thực ra chỉ có nghĩa là" 0 ".
ruakh

14

Lý do bạn không thấy những thứ như tỷ lệ gần đúng trong các vấn đề ra quyết định là vì chúng thường không có ý nghĩa trong bối cảnh các câu hỏi mà người ta thường hỏi về các vấn đề ra quyết định. Trong một cài đặt tối ưu hóa, điều đó có ý nghĩa bởi vì thật hữu ích khi "đóng". Trong nhiều môi trường, nó không có ý nghĩa. Sẽ không có ý nghĩa khi thấy mức độ thường xuyên bạn "gần gũi" trong một vấn đề logarit rời rạc. Sẽ không có ý nghĩa khi thấy mức độ thường xuyên bạn "gần gũi" với việc tìm kiếm một đồng phân đồ thị. Và tương tự như vậy, trong hầu hết các vấn đề ra quyết định, sẽ không có nghĩa là "gần gũi" với quyết định đúng đắn.

Bây giờ, trong các triển khai thực tế, có nhiều trường hợp rất hữu ích để biết phần nào của các vấn đề có thể được quyết định "nhanh chóng" và phần nào không thể. Tuy nhiên, không giống như tối ưu hóa, không có cách nào phù hợp với một kích thước để định lượng điều này. Bạn có thể làm điều đó theo thống kê, như bạn đề xuất, nhưng chỉ khi bạn biết phân phối thống kê các đầu vào của mình. Hầu hết thời gian, những người quan tâm đến các vấn đề quyết định không may mắn có được các bản phân phối như vậy.

Như một trường hợp nghiên cứu, xem xét vấn đề tạm dừng. Vấn đề tạm dừng được biết là không thể giải quyết được. Thật là xấu hổ, bởi vì đây là một vấn đề thực sự hữu ích để có thể giải quyết nếu bạn đang tạo một trình biên dịch. Tuy nhiên, trên thực tế, chúng tôi thấy rằng hầu hết các chương trình thực sự rất dễ phân tích từ góc độ vấn đề tạm dừng. Trình biên dịch tận dụng điều này để tạo mã tối ưu trong những trường hợp này. Tuy nhiên, một trình biên dịch phải nhận ra rằng có khả năng một khối mã cụ thể không thể quyết định được. Bất kỳ chương trình nào dựa vào mã là "có khả năng quyết định" đều có thể gặp rắc rối.

Tuy nhiên, số liệu được các trình biên dịch sử dụng để xác định mức độ họ giải quyết các trường hợp cụ thể này của vấn đề tạm dừng rất khác so với số liệu được sử dụng bởi một chương trình mã hóa để kiểm tra xem một cặp số nguyên tố cụ thể có được chấp nhận chống lại các cuộc tấn công hay không. Không có một kích thước phù hợp với tất cả các giải pháp. Nếu bạn muốn một số liệu như vậy, bạn sẽ muốn điều chỉnh nó để phù hợp với không gian vấn đề cụ thể và logic kinh doanh của bạn.


Vì vậy, theo tôi hiểu, cách duy nhất để giải quyết vấn đề quyết định là thiết kế thuật toán tối ưu có thể rất kém hiệu quả? Bởi vì tôi có một vấn đề quyết định (NP-đầy đủ) và tôi đã được yêu cầu đưa ra một thuật toán tham lam (nhanh) để tìm ra giải pháp. Làm sao tôi có thể giải quyết việc này? Bạn có biết bất kỳ bài báo tập trung vào loại vấn đề này?
Ribz

1
@det Đẩy lùi và khắc phục sự cố. Nếu bạn có một vấn đề hoàn chỉnh NP, bạn khá bế tắc, nhưng rất có khả năng bạn không thực sự cần phải giải quyết. Ví dụ, bạn không luôn cần câu trả lời hoàn hảo. Có lẽ gần gũi là đủ tốt. Hoặc có lẽ bạn có thể giải quyết vấn đề cho một tập hợp các trường hợp dễ, và đánh vào những trường hợp khó. Ví dụ, các thuật toán đóng gói thường là NP hoàn chỉnh, nhưng các thuật toán đáng tin cậy nhận được trong vòng 5% tối ưu bằng cách sử dụng các phương pháp tiếp cận theo chế độ là phổ biến.
Cort Ammon - Phục hồi Monica

2
Thành thật mà nói, việc được yêu cầu đưa ra một thuật toán tham lam để giải quyết một chương trình hoàn thành NP hoàn toàn giống như được giao nhiệm vụ tự mình gánh vác toàn bộ cộng đồng khoa học / toán học máy tính. Nếu bạn tìm thấy một thuật toán cho một chương trình NP-đầy đủ trong thời gian P, tại rất ít nhất bạn sẽ kiếm được giải thưởng Clay $ 1 triệu để giải quyết P = NP. Trong thực tế, những tác động của khám phá của bạn sẽ định hình lại điện toán như chúng ta biết và hoàn toàn làm đảo lộn toàn bộ ngành công nghiệp bảo mật / mật mã chỉ sau một đêm. Tốt hơn là nên điều chỉnh từ ngữ của nhiệm vụ để không thể hoàn thành NP.
Cort Ammon - Phục hồi Monica

Tôi đã sử dụng một thuật toán chính xác tham lam cho một vấn đề NP-đầy đủ. Tôi chỉ cần giải quyết một trường hợp nhỏ và tôi có thể có một máy chủ 64 bộ xử lý cho một ngày cuối tuần.
Patricia Shanahan

8

Ngoài các câu trả lời hiện có, hãy để tôi chỉ ra rằng có những tình huống có ý nghĩa để có một giải pháp gần đúng cho một vấn đề quyết định, nhưng nó hoạt động khác với bạn nghĩ.

Với các thuật toán này, chỉ có một trong hai kết quả được xác định một cách chắc chắn, trong khi kết quả còn lại có thể không chính xác. Hãy kiểm tra Miller-Rabin cho số nguyên tố , ví dụ: Nếu kiểm tra xác định rằng một số là không quan trọng, mà kết quả là chắc chắn. Nhưng trong trường hợp khác, điều đó chỉ có nghĩa là con số có thể là số nguyên tố. Tùy thuộc vào thời gian tính toán mà bạn sẵn sàng đầu tư, bạn có thể tăng sự tự tin về kết quả, nhưng nó sẽ không phải là 100% vì đây là trường hợp không chính.

Điều này đặc biệt mạnh mẽ khi giải quyết các vấn đề không thể giải quyết được: Bạn có thể viết một công cụ cố gắng giải quyết vấn đề tạm dừng cho một đoạn mã cụ thể. Nếu nó có thể tìm thấy một bằng chứng rằng chương trình sẽ không lặp lại vô tận, bạn có thể yêu cầu như vậy với sự chắc chắn 100%. Nếu bạn không thể tìm thấy bằng chứng như vậy, có thể là luồng điều khiển chương trình quá phức tạp để công cụ của bạn phân tích, nhưng đó không phải là bằng chứng cho thấy nó sẽ lặp lại mãi mãi. Bằng cách đơn giản hóa các cấu trúc điều khiển, bạn có thể tạo ra một chương trình tương đương đủ đơn giản để công cụ chứng minh rằng nó sẽ tạm dừng.


Có một sự khác biệt lớn giữa thuật toán xác suất (câu trả lời của bạn) và thuật toán gần đúng (câu hỏi). Đặc biệt, sự kết hợp của cả hai là một giống rất đặc biệt.
Raphael

Ngoài ra, chúng tôi biết rằng các thuật toán xác suất cho vấn đề tạm dừng không tồn tại, giả sử một cách giải thích hợp lý của thuật ngữ trong bối cảnh này.
Raphael

@Raphael Tôi không có ý định trả lời cụ thể cho các thuật toán xác suất. Cấp cho Miller-Rabin là trường hợp đó, nhưng như bạn đã đề cập, điều này không còn đúng với ví dụ vấn đề tạm dừng, và tôi đoán cũng sẽ không đúng với phần lớn các trường hợp bạn tìm thấy hành vi này. Điểm tôi muốn vượt qua chỉ đơn giản là bạn sẽ chỉ nhận được sự chắc chắn về một kết quả, nhưng không phải là kết quả khác.
ComicSansMS

Nếu bạn không nói nhiều hơn rằng một số vấn đề chỉ có thể tính toán được, tôi không nghĩ bạn đang trả lời câu hỏi.
Raphael

@Raphael Câu trả lời của tôi cũng không cụ thể đối với các vấn đề bán tính toán. Trên thực tế, tôi không nghĩ rằng cách tiếp cận mà tôi mô tả thậm chí áp dụng cho các vấn đề bán tính toán. Bây giờ bạn sẽ chắc chắn nếu bạn hạ cánh trong nhánh không xác định của hàm, vì vậy bạn có thể khẳng định chắc chắn rằng không có kết quả. Những gì tôi mô tả đã rút ra: Có thể có một câu trả lời, nhưng thuật toán có thể trông không đủ cứng để vấp phải nó.
ComicSansMS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.