Anggaplah saya seorang programmer dan saya punya masalah NP-complete yang saya butuhkan untuk menyelesaikannya. Metode apa yang tersedia untuk menangani masalah NPC? Apakah ada survei atau yang serupa dengan topik ini?
43
Anggaplah saya seorang programmer dan saya punya masalah NP-complete yang saya butuhkan untuk menyelesaikannya. Metode apa yang tersedia untuk menangani masalah NPC? Apakah ada survei atau yang serupa dengan topik ini?
Jawaban:
Ada sejumlah strategi yang dipelajari dengan baik; mana yang terbaik dalam aplikasi Anda tergantung pada keadaan.
Tingkatkan runtime kasus terburukO(cn) c<1.3 Ω(2n)
Dengan menggunakan wawasan khusus masalah, Anda seringkali dapat meningkatkan algoritme naif. Misalnya, adaalgoritmauntuk Vertex Cover dengan[1]; ini adalah peningkatan besar di atas naifdan mungkin membuat ukuran contoh yang relevan untuk Anda penurut.
Tingkatkan runtime yang diharapkan
Dengan menggunakan heuristik, Anda seringkali dapat merancang algoritma yang cepat pada banyak contoh. Jika itu termasuk sebagian besar yang Anda temui dalam latihan, Anda adalah emas. Contohnya adalah SAT yang solvernya cukup terlibat, dan algoritma Simplex (yang memecahkan masalah polinomial, tapi tetap saja). Salah satu teknik dasar yang sering membantu adalah cabang dan terikat .
Batasi masalah
Jika Anda dapat membuat lebih banyak asumsi pada input Anda, masalahnya mungkin menjadi mudah.
Input Anda mungkin memiliki properti yang menyederhanakan penyelesaian masalah, misalnya planaritas, bipartiteness, atau melewatkan minor untuk grafik. Lihat di sini untuk beberapa contoh kelas grafik yang mudah untuk CLIQUE.
. Hal lain yang perlu dilihat adalah kompleksitas parameterised ; beberapa masalah dapat diselesaikan dalam waktu untuk beberapa parameter instance (derajat simpul maksimum, berat tepi maksimum, ...) dan konstan. Jika Anda dapat terikat dengan fungsi polylogarithmic di dalam pengaturan Anda, Anda mendapatkan algoritma polinomial. Saeed Amiri memberikan rincian dalam jawabannya .
Selanjutnya, beberapa masalah mengakui algoritma yang berjalan dalam waktu polinomial semu , yaitu runtime mereka dibatasi oleh fungsi polinomial dalam angka yang merupakan bagian dari input; contoh primitif yang naif adalah contohnya. Ini berarti bahwa jika jumlah yang dikodekan dalam instance Anda memiliki ukuran yang masuk akal, Anda mungkin memiliki algoritma sederhana yang berperilaku baik untuk Anda.
Lemahkan hasilnya
Ini berarti Anda menoleransi hasil yang salah atau tidak lengkap. Ada dua rasa utama:
Anda hanya mendapatkan hasil yang benar dengan beberapa probabilitas. Ada beberapa varian, algoritma Monte-Carlo dan Las-Vegas yang paling terkenal . Contoh yang terkenal adalah tes primality Miller-Rabin .
Anda tidak lagi mencari solusi optimal tetapi hampir optimal. Beberapa algoritma mengakui relatif ("tidak lebih buruk dari dua kali lipat optimal"), yang lain mutlak ("tidak lebih buruk dari ditambah optimum") terikat pada kesalahan. Untuk banyak masalah, terbuka seberapa baik mereka dapat diperkirakan. Ada beberapa yang dapat diperkirakan secara sewenang-wenang dalam waktu polinomial, sementara yang lain diketahui tidak mengizinkannya; periksa teori skema perkiraan polinomial-waktu .
Rujuk ke Algoritma untuk Masalah Sulit oleh Hromkovič untuk perawatan menyeluruh.
sumber
Jawaban lain telah membahas ini dari perspektif yang lebih teoretis. Ini pendekatan yang lebih praktis.
Untuk "khas" masalah keputusan NP-complete ( "apakah ada hal yang memenuhi semua kendala ini?" ), Inilah yang akan saya coba dulu:
Tulis program sederhana yang mengkodekan instance masalah Anda sebagai instance SAT .
Kemudian ambil pemecah SAT yang baik , jalankan (menggunakan komputer multi-core tercepat yang Anda miliki), dan lihat apa yang terjadi.
Cobalah dengan contoh yang lebih kecil terlebih dahulu untuk mengetahui berapa lama waktu yang dibutuhkan.
Anehnya, pendekatan ini jauh lebih baik daripada mencoba mengimplementasikan solver Anda sendiri khusus untuk masalah Anda saat ini:
Pemecah SAT sangat pintar dan dioptimalkan dengan baik. Mereka dengan mudah mengungguli implementasi Anda sendiri dari pencarian mundur (tidak peduli berapa banyak waktu Anda buang mengoptimalkan kode Anda) Mereka juga dengan mudah mengungguli banyak alternatif off-the-self seperti pemecah program linear integer.
Ini membutuhkan pemrograman yang sangat sedikit. Langkah 1 relatif mudah dan tidak kritis terhadap kinerja; Anda dapat menggunakan bahasa skrip seperti Python. Orang lain sudah berhati-hati dalam mengimplementasikan semua yang Anda butuhkan untuk langkah 2.
Untuk masalah pengoptimalan NP-hard biasa ( "temukan benda terkecil yang memenuhi semua kendala ini" ) pendekatan ini mungkin berhasil atau tidak.
Jika Anda dapat dengan mudah mengubahnya menjadi masalah keputusan ( "apakah ada benda berukuran 4 yang memenuhi semua kendala ini?" , "Bagaimana dengan ukuran 3?" ), Bagus, ikuti pendekatan yang sama seperti di atas dengan masalah keputusan.
Jika tidak, Anda mungkin ingin menggunakan pemecah heuristik yang mencoba menemukan solusi kecil (belum tentu solusi terkecil ). Sebagai contoh:
Encode masalah Anda sebagai instance MAX-SAT (terbobot) .
Gunakan pemecah heuristik dari paket UBCSAT . Pemecah heuristik berparalel sepele; coba temukan cluster komputer dengan ratusan komputer. Anda dapat menjalankan solver selama yang Anda inginkan, dan kemudian mengambil solusi terbaik yang telah Anda temukan sejauh ini.
sumber
Kompleksitas Parametrized
Salah satu cara untuk menyerang kepraktisan adalah memikirkan masalah dalam konteks kompleksitas yang ditentukan.
Dalam kompleksitas parametrized kami menyelesaikan masalah dengan memperbaiki beberapa parameter (misalkan ). Jika kita dapat menyelesaikan beberapa masalah dalam waktu , kita katakan bahwa masalahnya adalah parameter tetap yang dapat ditelusurakan dalam . Di sini hanyalah beberapa fungsi yang dapat dihitung. Ada banyak masalah NP-hard yang FPT, namun, ada banyak masalah dalam NP yang diyakini tidak bisa diperbaiki parameter trable.k f(k)⋅p(n) k f(k)
Jika dengan memperbaiki beberapa parameter kita dapat memecahkan masalah dalam waktu , masalah ini dikatakan berada di XP. Kami percaya bahwa XP tidak sama dengan FPT (seperti halnya kami percaya P NP). Tetapi ada juga banyak masalah di antara keduanya (FPT dan XP), dan kami telah mendefinisikan hierarki (sebenarnya beberapa), salah satunya adalah hirarki-W. Dalam hierarki W Anda memiliki reduksi seperti pengurangan dalam kelas NP-complete, kecuali, kami tidak mencari reduksi polytime, kami hanya perlu pengurangan FPT. Kelas W [0] adalah kelas FPT.O(nf(k)) ≠
Ini adalah beberapa sampel di berbagai kelas hirarki W:
Ini adalah tingkat kompleksitas lain untuk mengklasifikasikan masalah NP dengan cara yang lebih tepat dan jika Anda menginginkan lebih, Anda dapat melihat Kompleksitas Sirkuit Parameter dan W Hierarki oleh Downey et al (1998).
Dan jika Anda ingin lebih banyak lagi baik untuk membaca Teori Kompleksitas Parameter Flum dan Grohe .
Dan akhirnya:
Algoritme parametrized versus Approximation:
Diketahui bahwa jika masalahnya memiliki FPTAS ( skema pendekatan sepenuhnya polinomial-waktu ) maka itu juga FPT (yang jelas). Namun tidak ada yang diketahui secara terbalik, juga ada beberapa karya tentang hubungan PTAS dan XP, tetapi ada tidak hubungan yang sangat erat antara PTAS dan hirarki W (setidaknya saya tidak tahu saat ini).
Juga dalam beberapa kasus mungkin kita memperbaiki beberapa parameter yang berbeda, misalnya: panjang lintasan terpanjang dalam grafik dibatasi dan ukuran solusi dibatasi (misalnya dalam set simpul umpan balik), ...
Contoh penggunaan praktis:
Mungkin sebagian orang percaya bahwa kompleksitas parametrized tidak berguna dalam praktiknya. Tapi ini salah. Banyak algoritma parametrized ditemukan di aplikasi dunia nyata, ketika Anda dapat memperbaiki beberapa parameter, berikut adalah contohnya:
Salah satu teorema utama dalam kompleksitas parametrized, adalah lakukan untuk Courcell, ia menyediakan algoritma waktu berjalan untuk beberapa kelas masalah parametrized. Jumlah menara adalah , yang berarti untuk , tidak mungkin. Namun, satu kelompok menerapkan algoritme dengan beberapa modifikasi pada kasus yang lebih khusus, dan mereka mendapatkan algoritma yang sangat cepat untuk penutup vertex, yang saat ini digunakan di beberapa stasiun kereta bawah tanah di Jerman.2...2O(n) 2 O(k) k=10
Salah satu algoritma heuristik tercepat dan paling akurat untuk TSP adalah: Penggabungan tur dan dekomposisi cabang , yang menggunakan parametriisasi masalah (tidak secara langsung, tetapi dekomposisi cabang dan pendekatan pemrograman dinamis yang mereka gunakan didasarkan pada beberapa asumsi yang baik).
sumber
Kelengkapan NP adalah tentang kepraktisan kasus terburuk. Bergantung pada masalah yang sedang Anda kerjakan, banyak kelas instance mungkin dapat dipecahkan dalam waktu yang wajar dalam praktiknya (meskipun Anda mungkin memerlukan algoritma yang lebih khusus untuk mendapatkan runtime yang baik).
Pertimbangkan untuk melihat apakah ada pengurangan yang efisien dari masalah Anda menjadi masalah dengan pemecah yang baik, seperti Boolean Satisfiability atau Integer Linear Programming.
sumber
Anda memiliki tiga opsi secara umum: Yang pertama adalah mempertimbangkan kasus khusus dari masalah Anda . Dalam beberapa kasus khusus, masalah Anda mungkin dapat dipecahkan secara polinomi misalnya menentukan apakah ada jalur sederhana dari ke ke dalam grafik yang diarahkan sewenang-wenang adalah NP-Lengkap tetapi akan polinomial (linear) ketika dapat direduksi. Opsi kedua adalah menggunakan algoritma estimasi yang baik untuk menyelesaikan masalah Anda. Algoritma estimasi menyediakan jawaban yang hampir optimal untuk masalah Anda. Jika Anda tidak dapat menggunakan opsi sebelumnya, satu-satunya cara yang tersisa adalah: menggunakan algoritma yang dapat ditoleransi untuk menyelesaikan masalah Anda dalam waktu yang eksponensialv j v k G Gvi vj vk G G . Di antara algoritma eksponensial, waktu berjalan beberapa di antaranya dapat ditoleransi ketika ukuran input masalah Anda kurang dari nilai tertentu.
sumber
Meskipun disinggung secara singkat dalam beberapa jawaban, izinkan saya menekankan bahwa dalam praktiknya, masalah NP-complete diselesaikan (atau diperkirakan) setiap saat. Alasan utama Anda dapat menyelesaikan masalah NP-complete dalam praktek adalah:
Alasan lain untuk perbedaan ini adalah:
Dalam praktiknya, Anda menggunakan algoritma heuristik untuk menyelesaikan masalah NP-complete Anda, dan berharap yang terbaik. Hasilnya seringkali menakjubkan.
Masalah lain yang tersentuh dalam jawaban lain adalah:
Itu tentu saja tergantung dari masalahnya. Ketika data besar terlibat, kami memiliki pepatah yang berlawanan:
Saya takut bahwa orang banyak di sini agak secara teoritis cenderung. Anda mungkin mendapatkan jawaban yang lebih baik di situs pertukaran stackex utama.
sumber