Tidak ada peluru ajaib; Bukti NP-hardness sulit. Namun, ada kerangka umum untuk semua bukti tersebut. Banyak siswa yang berjuang dengan bukti kekerasan NP bingung tentang apa yang seharusnya mereka lakukan, yang jelas membuat tidak mungkin untuk mengetahui bagaimana melakukannya. Jadi di sini adalah apa yang harus dilakukan untuk membuktikan masalah NP-hard.
Pertama, kecuali Anda hanya mengerjakan pekerjaan rumah, Anda harus memutuskan masalah NP-hard mana yang harus dikurangi menjadi masalah Anda . Ini sebagian besar adalah pertanyaan tentang "bau". Jika jumlah 3 muncul di mana saja di pernyataan masalah, cobalah mengurangi dari atau 3 C o l o r atau 3 P a r t i t i o n . (Ya, saya serius.) Jika masalah Anda melibatkan menemukan urutan atau permutasi atau jalur yang optimal, coba kurangi dari H a m i l t o n i a3SAT3Color3Partition atau H a m i l t o n i a n P a t h . Jika masalah Anda meminta subset terkecil dengan properti tertentu, coba C l i q u e ; jika meminta untuk subset terbesar dengan properti tertentu, coba saya n d e p e n d e n t S e t . Jika masalah Anda melibatkan melakukan sesuatu di pesawat, cobalah PHamiltonianCycleHamiltonianPathCliqueIndependentSet atau P l a n a r T S P . Dan seterusnya. Jika masalah Anda tidak "berbau" seperti apa pun, 3 S A T atau C i r c u i t S A T mungkin merupakan taruhan terbaik Anda.PlanarCircuitSATPlanarTSP3SATCircuitSAT
Jelas, Anda harus sudah tahu persis bagaimana semua masalah ini didefinisikan , dan semakin sederhana masalah yang Anda kurangi, semakin baik. Jadi sekeren hasilnya pada akhirnya, saya tidak merekomendasikan pengurangan dari Minesweeper atau Tetris atau OneCheckersMove atau SuperMarioBros .
Kedua, reduksi aktual. Untuk mengurangi masalah X (yang Anda tahu adalah NP-hard) ke masalah Y (yang Anda coba buktikan adalah NP-hard, Anda perlu menjelaskan algoritma yang mengubah instance X sewenang - wenang menjadi instance legal Y Algoritma reduksi perlu melakukan sesuatu yang spesifik dengan setiap "fitur" dari instance-X; porsi output untuk setiap "fitur" biasanya disebut gadget .
Tapi apa itu fitur? Itu tergantung pada masalah X. Misalnya:
Untuk mengubah instance dari , Anda akan memerlukan gadget untuk setiap variabel dan untuk setiap klausa dalam formula input. Setiap gadget variabel harus memiliki dua "status" yang sesuai dengan "benar" dan "salah". Setiap gadget klausa juga harus memiliki beberapa "status", yang masing-masingnya entah bagaimana memaksa setidaknya satu literal dalam klausa itu menjadi benar. (Status bukan bagian dari output dari algoritma reduksi.)3SAT
Untuk mengubah instance , Anda akan memerlukan gadget untuk setiap titik dan setiap tepi grafik input, dan gadget lain untuk menentukan tiga warna.3Color
Untuk mengubah sebuah contoh dari , Anda akan memerlukan gadget untuk setiap masukan, untuk masing-masing kawat, dan untuk setiap gerbang di sirkuit masukan.PlanarCircuitSat
Bentuk sebenarnya dari gadget tergantung pada masalah Y, yang Anda mengurangi ke . Misalnya, jika Anda mereduksi masalah tentang grafik, gadget Anda akan menjadi subgraph kecil; lihat artikel Wikipedia. Jika Anda mengurangi masalah tentang penjadwalan, setiap gadget akan menjadi satu set pekerjaan yang dijadwalkan. Jika Anda mengurangi masalah tentang Mario , setiap gadget akan menjadi satu set balok dan batu bata dan Koopa.
Ini bisa membingungkan jika kedua masalah melibatkan jenis objek yang sama. Misalnya, jika X dan Y merupakan masalah tentang grafik, algoritme Anda akan mengubah satu grafik (turunan X) menjadi grafik yang berbeda (turunan Y). Pilih notasi Anda dengan bijak, sehingga Anda tidak membingungkan kedua grafik ini. Saya juga sangat menyarankan menggunakan beberapa warna tinta.
Akhirnya, algoritma reduksi Anda harus memenuhi tiga properti:
Ini berjalan dalam waktu polinomial. (Ini biasanya mudah.)
Jika algoritma reduksi Anda diberi instance X positif sebagai input, ia menghasilkan instance Y positif sebagai output.
Jika algoritma reduksi Anda menghasilkan instance positif dari Y sebagai output, itu harus diberikan instance positif dari X sebagai input.
Ada kehalusan penting di sini. Algoritma reduksi Anda hanya berfungsi dalam satu arah, dari instance X ke instance Y, tetapi membuktikan algoritma yang benar memerlukan alasan tentang transformasi di kedua arah. Anda juga harus ingat bahwa algoritma reduksi Anda tidak dapat memastikan apakah instance X yang diberikan adalah positif atau negatif — yang akan membutuhkan penyelesaian masalah NP-hard dalam waktu polinomial!
Itu apa . The bagaimana hanya datang dengan praktek.