Graf dan Batas Komputasi · Pelajaran 10 dari 10

P, NP, dan masalah yang sulit

9 menit baca · BelajarCode

Sejauh ini, hampir semua masalah yang kita selesaikan punya algoritma polinomial. Tetapi ada banyak masalah penting yang, sejauh diketahui, tidak punya algoritma polinomial.

Kelas P dan NP

Kelas kompleksitas
KelasArtinyaContoh
PMasalah keputusan yang bisa diselesaikan dalam waktu polinomialApakah ada jalur dari A ke B? Apakah array terurut?
NPMasalah keputusan yang jawabannya "ya" bisa diperiksa dalam waktu polinomial jika diberi buktiApakah ada himpunan bagian yang jumlahnya tepat K?
NP-completeMasalah tersulit di NP: jika satu saja bisa diselesaikan dalam waktu polinomial, semua masalah NP juga bisaSAT, subset sum, pewarnaan graf dengan 3 warna, versi keputusan knapsack
NP-hardSetidaknya sesulit NP-complete, belum tentu termasuk NPVersi optimisasi dari travelling salesman

Setiap masalah di P juga termasuk NP: jika bisa diselesaikan cepat, tentu bisa diperiksa cepat. Pertanyaan apakah P = NP, yaitu apakah setiap masalah yang mudah diperiksa juga mudah diselesaikan, adalah salah satu masalah terbuka terbesar dalam ilmu komputer dan matematika.

Memeriksa jauh lebih mudah dari menemukan

Python
1from itertools import combinations23angka = [267, 961, 1153, 1000, 1922, 493, 1598, 869, 1766, 1246]4target = 580256def periksa(pilihan):7    return all(x in angka for x in pilihan) and sum(pilihan) == target89print("Memeriksa satu bukti:", periksa([961, 1153, 1922, 1766]))1011dicoba = 012ditemukan = None13for r in range(1, len(angka) + 1):14    for pilihan in combinations(angka, r):15        dicoba += 116        if sum(pilihan) == target:17            ditemukan = pilihan18            break19    if ditemukan:20        break21print("Menemukan:", ditemukan, "setelah mencoba", dicoba, "himpunan bagian")22print("Paling banyak yang harus dicoba:", 2 ** len(angka) - 1)
Keluaran
Memeriksa satu bukti: True
Menemukan: (961, 1153, 1922, 1766) setelah mencoba 269 himpunan bagian
Paling banyak yang harus dicoba: 1023

Memeriksa sebuah bukti hanya butuh penjumlahan, Θ(n). Menemukan buktinya, sejauh yang diketahui, bisa membutuhkan pemeriksaan sampai 2ⁿ himpunan bagian. Untuk n = 100, angka itu jauh melampaui kemampuan semua komputer di dunia.

Apa yang dilakukan saat bertemu masalah NP-hard?

  • Algoritma eksak untuk ukuran kecil, misalnya backtracking dengan pemangkasan atau DP pseudo-polinomial seperti knapsack.
  • Algoritma aproksimasi yang menjamin hasil dalam faktor tertentu dari optimal.
  • Heuristik, seperti greedy atau pencarian lokal, yang cepat dan sering cukup baik walaupun tanpa jaminan.
  • Membatasi masalah ke kasus khusus yang punya algoritma polinomial, misalnya graf berbentuk pohon.

Kenapa penting bagi programmer

Mengenali bahwa sebuah masalah setara dengan masalah NP-complete menghemat banyak waktu: daripada mencari algoritma polinomial yang kemungkinan besar tidak ada, kamu bisa langsung memilih strategi aproksimasi atau heuristik yang tepat. Penjadwalan ujian dengan banyak batasan, misalnya, berkaitan erat dengan pewarnaan graf.

Cek pemahaman

Jika suatu hari terbukti ada algoritma polinomial untuk SAT, apa akibatnya?

Latihan

Aproksimasi untuk vertex cover

Vertex cover adalah himpunan simpul yang menyentuh setiap sisi graf. Mencari vertex cover terkecil adalah NP-hard. Implementasikan aproksimasi faktor 2: selama masih ada sisi yang belum tersentuh, ambil sisi itu dan masukkan kedua ujungnya. Bandingkan dengan solusi optimal hasil brute force.

Graf: A-B, A-C, B-C, B-D, C-E, D-E, D-F.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi