Mari kita terapkan Branch and Bound ke Knapsack , semoga ini akan membuat konsepnya jelas bagi Anda.
Kami memiliki item, berlabel 1 hingga n . v i adalah nilai dari i butir th, dan w i berat. Kami mencoba memasukkannya ke dalam ransel yang dapat memuat total T , dan kami berusaha memaksimalkan jumlah nilai dari barang yang kami masukkan ke ransel.n1nvsayasayawsayaT
Pendekatan backtrack biasa adalah basis kami. Kami pertama-tama memasukkan dalam paket, dan kemudian menyelesaikan masalah untuk item n - 1 yang tersisa dengan rekursi. Kami kemudian menghapus v 1 dari paket dan menyelesaikan masalah untuk item n - 1 yang tersisa lagi, dan kami mengembalikan konfigurasi terbaik yang kami temukan.v1n - 1v1n - 1
Mundur ini adalah bagian 'Cabang' dari Cabang dan Terikat. Anda bercabang pada (dalam kasus Knapsack) dua kasus: 'item adalah bagian dari solusi' dan 'item i bukan bagian dari solusi'. Anda dapat memvisualisasikan ini sebagai pohon biner, di mana anak kiri adalah satu case dan anak kanan adalah case lainnya. Pohon ini adalah pohon pencarian (atau ruang pencarian ): kedalamannya adalah n , dan karenanya memiliki simpul O ( 2 n ) . Algoritma karena itu memiliki eksponensial waktu berjalan dalam jumlah item.sayasayanO ( 2n)
Sekarang kita sampai pada bagian 'Bound': kita mencoba menemukan kriteria sehingga kita dapat mengatakan 'konfigurasi ini tidak pernah berhasil, jadi kita mungkin juga tidak repot menghitung ini'. Contoh dari kriteria seperti itu adalah 'berat barang yang sudah kita masukkan ke dalam ransel melebihi ': jika kita telah menambahkan, katakanlah, item n / 2 pertama ke ransel dan karena itu sudah penuh, ada tidak ada gunanya mencoba memasukkan item n / 2 + 1 hingga ke n di ransel juga, tetapi juga tidak ada gunanya mencoba menyesuaikan setiap subset dari n / 2 + 1 hingga nTn / 2n / 2 + 1nn / 2 + 1ndi ransel, karena sudah penuh, jadi kami menghemat sekitar kasus. Contoh lain adalah ' bahkan jika saya memasukkan semua item yang tersisa, nilai item yang saya masukkan tidak akan melebihi konfigurasi terbaik yang saya temukan sejauh ini '.2n / 2
Kriteria ini pada dasarnya memotong bagian dari pohon pencarian: pada beberapa node, Anda mengatakan misalnya 'subtree kiri tidak akan memberi saya konfigurasi yang lebih baik, karena X', jadi Anda lupa tentang subtree itu dan Anda tidak menjelajahinya. Subtinggi kedalaman yang Anda potong dengan cara ini menghemat Anda O ( 2 d ) node, yang bisa jadi sedikit peningkatan kecepatan jika Anda beruntung.dO ( 2d)
Perhatikan bahwa ini disebut ' Bounding ' karena biasanya melibatkan semacam batas bawah atau atas: untuk kriteria ' bahkan jika saya memasukkan semua item yang tersisa, nilai item yang saya masukkan tidak akan melebihi konfigurasi terbaik Saya telah menemukan sejauh ini ', nilai konfigurasi terbaik Anda sejauh ini adalah batas bawah pada konfigurasi terbaik, jadi apa pun yang tidak akan pernah berhasil melewati batas bawah ini pasti akan gagal.
Anda dapat membuat bagian 'Bounding' serumit yang Anda suka. Misalnya, masalah pemrograman bilangan bulat sering diselesaikan dengan menggunakan relaksasi: Anda mengendurkan program Anda menjadi program linier, yang dapat Anda selesaikan dalam waktu polinomial, dan kemudian Anda dapat membuang banyak kasus untuk variabel biner Anda yang toh tidak akan pernah berhasil. Anda kemudian bercabang pada opsi yang tersisa.
Perhatikan bahwa Branch dan Bound biasanya hanya memberi Anda peningkatan kecepatan dalam latihan, tetapi tidak dalam teori: sulit untuk mengatakan dengan tepat berapa banyak pohon pencarian yang dipotong menggunakan heuristik Anda. Ini dibuktikan dengan jumlah heuristik yang berbeda yang digunakan dalam praktek pada masalah seperti itu. Jika Anda kurang beruntung, pohon pencarian yang tersisa tetap besar bahkan dengan banyak ikatan.