Giả sử rằng tôi là một lập trình viên và tôi có một vấn đề hoàn chỉnh NP mà tôi cần phải giải quyết nó. Những phương pháp có sẵn để đối phó với các vấn đề NPC? Có một cuộc khảo sát hoặc một cái gì đó tương tự về chủ đề này?
Giả sử rằng tôi là một lập trình viên và tôi có một vấn đề hoàn chỉnh NP mà tôi cần phải giải quyết nó. Những phương pháp có sẵn để đối phó với các vấn đề NPC? Có một cuộc khảo sát hoặc một cái gì đó tương tự về chủ đề này?
Câu trả lời:
Có một số chiến lược được nghiên cứu kỹ lưỡng; đó là tốt nhất trong ứng dụng của bạn phụ thuộc vào hoàn cảnh.
Cải thiện thời gian chạy trường hợp xấu nhất
Sử dụng cái nhìn sâu sắc cụ thể về vấn đề, bạn thường có thể cải thiện thuật toán ngây thơ. Chẳng hạn, có cácthuật toáncho Vertex Cover với[1]; đây là một cải tiến lớn so vớingây thơvà có thể làm cho kích thước cá thể phù hợp với bạn.
Cải thiện thời gian chạy dự kiến
Sử dụng phương pháp phỏng đoán, bạn thường có thể nghĩ ra các thuật toán nhanh trong nhiều trường hợp. Nếu bao gồm hầu hết những gì bạn gặp trong thực tế, bạn là vàng. Ví dụ là SAT có tồn tại các bộ giải khá liên quan và thuật toán Simplex (giải quyết vấn đề đa thức, nhưng vẫn còn). Một kỹ thuật cơ bản thường hữu ích là nhánh và ràng buộc .
Hạn chế vấn đề
Nếu bạn có thể đưa ra nhiều giả định về đầu vào của mình, vấn đề có thể trở nên dễ dàng.
Làm suy yếu kết quả
Điều này có nghĩa là bạn chịu đựng được kết quả sai lầm hoặc không đầy đủ. Có hai hương vị chính:
Tham khảo Thuật toán cho các vấn đề khó khăn của Hromkovič để được điều trị triệt để.
Các câu trả lời khác đã giải quyết điều này từ góc độ lý thuyết hơn. Đây là một cách tiếp cận thực tế hơn.
Đối với các vấn đề quyết định hoàn thành NP "điển hình" ( "có tồn tại một điều thỏa mãn tất cả các ràng buộc này không?" ), Đây là điều tôi luôn cố gắng trước tiên:
Viết một chương trình đơn giản mã hóa ví dụ vấn đề của bạn dưới dạng SAT .
Sau đó lấy một bộ giải SAT tốt , chạy nó (sử dụng máy tính đa lõi nhanh nhất mà bạn có) và xem điều gì sẽ xảy ra.
Trước tiên hãy thử với các trường hợp nhỏ hơn để có được một số ý tưởng về việc có thể mất bao lâu.
Đáng ngạc nhiên là thường xuyên, phương pháp này là nhiều hơn cố gắng để thực hiện giải của riêng bạn đặc biệt cho vấn đề hiện tại của bạn:
Người giải SAT rất thông minh và tối ưu hóa tốt. Chúng dễ dàng vượt trội hơn so với việc bạn thực hiện tìm kiếm quay lui (bất kể bạn lãng phí bao nhiêu thời gian để tối ưu hóa mã của mình). Chúng cũng dễ dàng vượt trội hơn nhiều lựa chọn thay thế tự như giải pháp lập trình tuyến tính số nguyên.
Điều này đòi hỏi lập trình rất ít. Bước 1 tương đối đơn giản và nó không quan trọng về hiệu suất; bạn có thể sử dụng các ngôn ngữ script như Python. Một số người khác đã quan tâm đến việc thực hiện mọi thứ bạn cần cho bước 2.
Đối với các vấn đề tối ưu hóa NP-hard điển hình ( "tìm điều nhỏ nhất thỏa mãn tất cả các ràng buộc này" ) phương pháp này có thể hoặc không thể hoạt động.
Nếu bạn có thể dễ dàng biến nó thành vấn đề quyết định ( "có tồn tại một kích thước 4 thỏa mãn tất cả các ràng buộc này không?" , "Còn kích thước 3 thì sao?" ), Tuyệt vời, hãy làm theo cách tiếp cận như trên với các vấn đề quyết định.
Mặt khác, bạn có thể muốn dùng đến một người giải quyết heuristic cố gắng tìm một giải pháp nhỏ (không nhất thiết là giải pháp nhỏ nhất ). Ví dụ:
Mã hóa vấn đề của bạn dưới dạng ví dụ MAX-SAT (có trọng số) .
Sử dụng các bộ giải heuristic từ gói UBCSAT . Người giải quyết heuristic song song tầm thường; cố gắng tìm một cụm máy tính với hàng trăm máy tính. Bạn có thể chạy các bộ giải miễn là bạn muốn, và sau đó thực hiện giải pháp tốt nhất mà bạn đã tìm thấy cho đến nay.
Một cách để tấn công tính hấp dẫn là suy nghĩ về vấn đề trong bối cảnh phức tạp tham số hóa.
Trong độ phức tạp tham số, chúng tôi giải quyết vấn đề bằng cách sửa một số tham số (giả sử ). Nếu chúng ta có thể giải quyết một số vấn đề trong thời gian , chúng ta nói vấn đề là tham số cố định có thể điều chỉnh được trong . Ở đây chỉ là một số hàm tính toán. Có rất nhiều vấn đề về NP-hard là FPT, tuy nhiên, có rất nhiều vấn đề trong NP được cho là không thể sửa được thông số có thể điều chỉnh được.f ( k ) ⋅ p ( n ) k f ( k )
Nếu bằng cách sửa một số tham số, chúng ta có thể giải quyết vấn đề trong thời gian , vấn đề này được cho là trong XP. Chúng tôi tin rằng XP không bằng FPT (giống như chúng tôi tin P NP). Nhưng cũng có rất nhiều vấn đề giữa hai người này (FPT và XP) và chúng tôi đã xác định một hệ thống phân cấp (thực tế là một số), một trong số đó là hệ thống phân cấp W. Trong hệ thống phân cấp W, bạn có các mức giảm như giảm các lớp hoàn thành NP, ngoại trừ, chúng tôi không tìm kiếm giảm nhiều thời gian, chúng tôi chỉ cần giảm FPT. Lớp W [0] là lớp FPT.≠
Đây là một số mẫu trong các lớp khác nhau của hệ thống phân cấp W:
Đây là một mức độ phức tạp khác để phân loại các vấn đề NP theo cách chính xác hơn và nếu bạn muốn nhiều hơn, bạn có thể xem Độ phức tạp mạch tham số và Phân cấp W của Downey et al (1998).
Và nếu bạn muốn nhiều hơn nữa là tốt để đọc Lý thuyết phức tạp tham số hóa của Flum và Grohe .
Và cuối cùng:
Người ta biết rằng nếu vấn đề có FPTAS ( sơ đồ xấp xỉ thời gian đa thức hoàn toàn ) thì đó cũng là FPT (điều hiển nhiên) Nhưng không có gì nổi tiếng theo hướng ngược lại, cũng có một số công trình về mối quan hệ của PTAS và XP, nhưng có không phải là mối quan hệ rất chặt chẽ giữa hệ thống phân cấp PTAS và W (ít nhất là tôi không biết tại thời điểm này).
Ngoài ra, trong một số trường hợp, chúng tôi có thể sửa một số tham số khác nhau, ví dụ: chiều dài của một đường dẫn dài nhất trong biểu đồ bị giới hạn và kích thước của một giải pháp bị giới hạn (ví dụ: trong tập đỉnh phản hồi), ...
Có thể một số người tin rằng sự phức tạp tham số là vô ích trong thực tế. Nhưng điều này là sai. Nhiều thuật toán tham số được phát hiện trong các ứng dụng trong thế giới thực, khi bạn có thể sửa một số tham số, đây là một ví dụ:
Một trong những định lý chính về độ phức tạp tham số, được thực hiện cho Courcell, ông cung cấp thuật toán về thời gian chạy cho một số loại vấn đề được tham số hóa. Số lượng tháp của là , có nghĩa là với , là không thể. Nhưng, một nhóm đã thực hiện thuật toán của mình với một số sửa đổi trong trường hợp đặc biệt hơn và họ đã có thuật toán cực nhanh cho nắp đỉnh, hiện đang được sử dụng trong một số ga tàu điện ngầm ở Đức.2 O ( k ) k = 10
Một trong những thuật toán heuristic nhanh nhất và chính xác nhất cho TSP là: Hợp nhất tour và phân tách nhánh , sử dụng tham số hóa vấn đề (không trực tiếp, nhưng phân tách nhánh và phương pháp lập trình động mà chúng sử dụng dựa trên một số giả định tốt).
NP đầy đủ là về khả năng hấp dẫn trường hợp xấu nhất. Tùy thuộc vào vấn đề bạn đang giải quyết, nhiều lớp thể hiện có thể giải quyết được trong thời gian hợp lý trong thực tế (mặc dù bạn có thể cần một thuật toán chuyên biệt hơn để có được thời gian chạy tốt).
Xem xét liệu có sự giảm thiểu hiệu quả từ vấn đề của bạn sang vấn đề với các bộ giải tốt có sẵn, chẳng hạn như Sự hài lòng của Boolean hoặc Lập trình tuyến tính Integer.
Bạn có ba lựa chọn nói chung: Cách thứ nhất là xem xét các trường hợp đặc biệt về vấn đề của bạn . Trong một số trường hợp đặc biệt, vấn đề của bạn có thể giải quyết được đa thức, ví dụ: xác định xem có tồn tại một đường dẫn đơn giản từ đến đến trong đồ thị có hướng tùy ý là NP-Complete hay không, nó sẽ là đa thức (tuyến tính) khi có thể rút gọn. Tùy chọn thứ hai là sử dụng thuật toán ước lượng tốt để giải quyết vấn đề của bạn. Các thuật toán ước tính cung cấp câu trả lời gần tối ưu cho vấn đề của bạn. Nếu bạn không thể sử dụng các tùy chọn trước đó, cách duy nhất còn lại sẽ là: sử dụng thuật toán có thể chấp nhận để giải quyết vấn đề của bạn theo thời gian theo cấp số nhânv j v k G G. Trong số các thuật toán theo cấp số nhân, thời gian chạy của một số trong số chúng có thể được chấp nhận khi kích thước đầu vào của vấn đề của bạn nhỏ hơn một giá trị cụ thể.
Mặc dù được đề cập ngắn gọn trong một số câu trả lời, tôi xin nhấn mạnh rằng trong thực tế, các vấn đề hoàn thành NP được giải quyết (hoặc gần đúng) mọi lúc. Lý do chính mà bạn có thể giải quyết các vấn đề hoàn thành NP trong thực tế là:
Trường hợp gặp phải trong thực tế không phải là "trường hợp xấu nhất".
Một lý do khác cho sự khác biệt là:
Rất khó để phân tích các thuật toán heuristic chính thức.
Trong thực tế, bạn sử dụng các thuật toán heuristic để giải quyết các vấn đề hoàn thành NP của mình và hy vọng điều tốt nhất. Các kết quả thường tuyệt đẹp.
Một vấn đề khác gây xúc động trong các câu trả lời khác là:
Đôi khi các thuật toán theo cấp số nhân là đủ nhanh.
Điều đó tất nhiên phụ thuộc vào vấn đề. Khi có dữ liệu lớn, chúng ta có câu châm ngôn ngược lại:
Đôi khi các thuật toán khả thi duy nhất là quasilinear.
Tôi sợ rằng đám đông ở đây nghiêng về mặt lý thuyết. Bạn có thể nhận được câu trả lời tốt hơn trên trang web stackexchange chính.