Không có viên đạn nhiệm màu; Bằng chứng độ cứng NP là cứng. Tuy nhiên, có một khuôn khổ chung cho tất cả các bằng chứng như vậy. Nhiều sinh viên đấu tranh với bằng chứng độ cứng NP tỏ ra bối rối về những gì họ phải làm, điều này rõ ràng khiến họ không thể tìm ra cách thực hiện. Vì vậy, đây là những gì cần làm để chứng minh một vấn đề NP-hard.
Đầu tiên, trừ khi bạn chỉ làm bài tập về nhà, bạn phải quyết định vấn đề NP-hard nào để giảm bớt vấn đề của bạn . Đây phần lớn là một câu hỏi về "mùi". Nếu số 3 xuất hiện ở bất cứ đâu trong báo cáo sự cố, hãy thử giảm từ hoặc 3 C o l o r hoặc 3 P a r t i t i o n . (Vâng, tôi nghiêm túc.) Nếu vấn đề của bạn liên quan đến việc tìm kiếm một con đường hoặc hoán vị hoặc đường dẫn tối ưu, hãy thử giảm từ H a m i l t o n i n3SAT3Color3Partition hoặc H a m i l t o n i a n P a t h . Nếu vấn đề của bạn yêu cầu tập hợp con nhỏ nhất với một thuộc tính nhất định, hãy thử C l i q u e ; nếu nó yêu cầu tập hợp con lớn nhất với một thuộc tính nhất định, hãy thử I n d e p e n d e n t S e t . Nếu vấn đề của bạn liên quan đến việc làm một cái gì đó trong máy bay, hãy thử PHamiltonianCycleHamiltonianPathCliqueIndependentSet hoặc P l một n một r T S P . Và như vậy. Nếu vấn đề của bạn không "ngửi" như bất cứ điều gì, 3 S A T hoặc C i r c u i t S A T có lẽ là lựa chọn tốt nhất của bạn.PlanarCircuitSATPlanarTSP3SATCircuitSAT
Rõ ràng, bạn cần phải biết chính xác làm thế nào tất cả những vấn đề này được xác định , và vấn đề bạn giảm bớt càng đơn giản thì càng tốt. Vì vậy, khi mát mẻ như là kết quả có thể nhìn cuối cùng, tôi không khuyên bạn nên giảm từ Minesweeper hay Tetris hoặc OneCheckersMove hay SuperMarioBros .
Thứ hai, thực tế giảm. Để giảm vấn đề X (vấn đề bạn biết là NP-hard) thành vấn đề Y (vấn đề bạn đang cố chứng minh là NP-hard, bạn cần mô tả thuật toán biến đổi một thể hiện X tùy ý thành một thể hiện hợp pháp của Y Thuật toán rút gọn cần phải làm một cái gì đó cụ thể với từng "tính năng" của thể hiện X, phần đầu ra cho mỗi "tính năng" thường được gọi là một tiện ích .
Nhưng tính năng là gì? Điều đó phụ thuộc vào vấn đề X. Ví dụ:
Để chuyển đổi một thể hiện của , bạn sẽ cần một tiện ích cho từng biến và cho từng mệnh đề trong công thức nhập. Mỗi tiện ích biến phải có hai "trạng thái" tương ứng với "đúng" và "sai". Mỗi tiện ích mệnh đề cũng phải có nhiều "trạng thái", mỗi trạng thái bằng cách nào đó buộc ít nhất một trong số các chữ trong mệnh đề đó là đúng. (Các trạng thái không phải là một phần của đầu ra của thuật toán khử.)3SAT
Để chuyển đổi một thể hiện của , bạn sẽ cần một tiện ích cho từng đỉnh và từng cạnh của biểu đồ đầu vào và một tiện ích khác để xác định ba màu.3Color
Để chuyển đổi một thể hiện của , bạn sẽ cần một tiện ích cho mỗi đầu vào, cho mỗi dây và cho mỗi cổng trong mạch đầu vào.PlanarCircuitSat
Hình thức thực tế của các tiện ích phụ thuộc vào vấn đề Y, là bạn đang giảm đến . Ví dụ: nếu bạn đang giảm một vấn đề về đồ thị, các tiện ích của bạn sẽ là các sơ đồ nhỏ; xem bài viết Wikipedia. Nếu bạn đang giảm bớt một vấn đề về lập lịch, mỗi tiện ích sẽ là một tập hợp các công việc sẽ được lên lịch. Nếu bạn đang giảm bớt một vấn đề về Mario , mỗi tiện ích sẽ là một tập hợp các khối và gạch và Koopas.
Điều này có thể gây nhầm lẫn nếu cả hai vấn đề liên quan đến cùng một loại đối tượng. Ví dụ: nếu cả X và Y là các vấn đề về đồ thị, thuật toán của bạn sẽ chuyển đổi một biểu đồ (một thể hiện của X) thành một biểu đồ khác (một thể hiện của Y). Chọn ký hiệu của bạn một cách khôn ngoan, để bạn không nhầm lẫn hai biểu đồ này. Tôi cũng khuyên bạn nên sử dụng nhiều màu mực.
Cuối cùng, thuật toán rút gọn của bạn phải đáp ứng ba thuộc tính:
Nó chạy trong thời gian đa thức. (Điều này thường dễ dàng.)
Nếu thuật toán rút gọn của bạn được đưa ra một thể hiện dương của X làm đầu vào, thì nó tạo ra một thể hiện dương của Y là đầu ra.
Nếu thuật toán rút gọn của bạn tạo ra một thể hiện dương của Y là đầu ra, thì nó phải được đưa ra một thể hiện dương của X làm đầu vào.
Có một sự tinh tế quan trọng ở đây. Thuật toán rút gọn của bạn chỉ hoạt động theo một hướng, từ các thể hiện của X đến các thể hiện của Y, nhưng để chứng minh thuật toán chính xác đòi hỏi phải có lý do về việc chuyển đổi theo cả hai hướng. Bạn cũng phải nhớ rằng thuật toán giảm của bạn không thể biết liệu một thể hiện X đã cho là tích cực hay phủ định sẽ yêu cầu giải quyết vấn đề NP-hard trong thời gian đa thức!
Đó là những gì . Các cách chỉ đi kèm với thực hành.