Xử lý sự khó hiểu: Các vấn đề hoàn thành NP


43

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?


4
Nó sẽ hữu ích để nêu vấn đề mà bạn có.
Dave Clarke

2
Câu hỏi này không phải là về một vấn đề cụ thể. Tôi muốn biết các kỹ thuật để tôi có thể áp dụng chúng trong tương lai nếu tôi cần.
Ẩn danh

1
Điều này giống như hỏi: làm thế nào để tôi giải quyết một vấn đề trong thời gian đa thức nói chung? Có hàng trăm vấn đề và mỗi vấn đề có giải pháp chuyên biệt riêng.
Dave Clarke

3
@DaveClarke: Có những kỹ thuật đã được thiết lập, vì vậy tôi nghĩ câu hỏi là hợp lệ; một câu hỏi tập trung hơn có thể tốt hơn, mặc dù.
Raphael

Câu trả lời:


54

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.O(cn)c<1.3Ω(2n)

  • 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.

    • Thuộc tính cấu trúc
      Đầu vào của bạn có thể có các thuộc tính giúp đơn giản hóa việc giải quyết vấn đề, ví dụ như tính phẳng, tính lưỡng cực hoặc thiếu một phụ cho biểu đồ. Xem ở đây để biết một số ví dụ về các lớp biểu đồ mà CLIQUE dễ dàng.
    • Các hàm giới hạn của đầu vào
      Một điều khác cần xem xét là độ phức tạp tham số ; một số vấn đề có thể giải quyết được trong thời gian đối với một số tham số thể hiện (mức độ nút tối đa, trọng lượng cạnh tối đa, ...) và không đổi. Nếu bạn có thể ràng buộc bởi một hàm đa bội trong trong cài đặt của mình, bạn sẽ nhận được các thuật toán đa thức. Saeed Amiri cho biết chi tiết trong câu trả lời của mình .k m k nO(2knm)kmkn
    • Giới hạn số lượng đầu vào
      Ngoài ra, một số vấn đề thừa nhận các thuật toán chạy trong thời gian giả đa thức , đó là thời gian chạy của chúng bị giới hạn bởi một hàm đa thức trong một số là một phần của đầu vào; kiểm tra nguyên thủy ngây thơ là một ví dụ. Điều này có nghĩa là nếu số lượng được mã hóa trong các phiên bản của bạn có kích thước hợp lý, bạn có thể có các thuật toán đơn giản phù hợp với bạn.
  • 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:

    • Các thuật toán xác suất
      Bạn chỉ nhận được kết quả chính xác với một số xác suất. Có một số biến thể, đáng chú ý nhất là thuật toán Monte-CarloLas-Vegas . Một ví dụ nổi tiếng là bài kiểm tra tính nguyên thủy Miller-Rabin .
    • Các thuật toán gần đúng
      Bạn không còn tìm kiếm các giải pháp tối ưu mà gần như là các giải pháp tối ưu. Một số thuật toán thừa nhận tương đối ("không tệ hơn gấp đôi mức tối ưu"), một số thuật toán khác tuyệt đối ("không tệ hơn cộng với mức tối ưu") về lỗi. Đối với nhiều vấn đề, nó mở ra như thế nào chúng có thể được xấp xỉ. Có một số có thể được xấp xỉ tùy ý tốt trong thời gian đa thức, trong khi một số khác được biết là không cho phép điều đó; kiểm tra lý thuyết về các sơ đồ gần đúng thời gian đa thức .5

Tham khảo Thuật toán cho các vấn đề khó khăn của Hromkovič để được điều trị triệt để.


  1. Đơn giản là vẻ đẹp: Các giới hạn trên được cải thiện cho bìa đỉnh của Chen Jianer, Iyad A. Kanj, Ge Xia (2005)

4
tất nhiên một thuật toán monte carlo hoặc las vegas rất khó có thể chạy trong polytime đối với bài toán NP-hard
Sasho Nikolov

12

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:

  1. 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 .

  2. 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ụ:

  1. Mã hóa vấn đề của bạn dưới dạng ví dụ MAX-SAT (có trọng số) .

  2. 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.


8

Độ phức tạp tham số

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 )kf(k)p(n)kf(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.O(nf(k))

Đâ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:

  1. Vỏ bọc của Vertex là FPT (đường dẫn phân tách đỉnh cũng vậy trên đồ thị không có hướng)
  2. Bộ độc lập và Clique đều là W [1] -complete
  3. Tập thống trị là W [2] -Complete.

Đâ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:

Độ phức tạp tham số so với thuật toán xấp xỉ:

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), ...

Tập quán mẫu thực tế:

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ụ:

  1. 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 = 102...2O(n)2O(k)k=10

  2. 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).


5

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.


4

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 GvivjvkGG. 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ể.


2

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.

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.