Давайте застосуємо Branch and Bound до Рюкзака , сподіваємось, це зрозуміє вам концепцію.
Ми маємо н предмети, марковані 1 через до н. vi - це значення iй пункт, і шiйого вага. Ми намагаємось помістити їх у рюкзак, який може містити доТ ваги загалом, і ми намагаємося максимально збільшити суму значень предмета, який ми кладемо в ранець.
Звичайний зворотній підхід - наша основа. Ми спочатку ставимоv1 в упаковці, а потім вирішіть проблему для решти n - 1предмети з рекурсією. Потім видаляємоv1 з пачки і вирішити проблему для решти n−1 Елементи знову, і ми повертаємо найкращу конфігурацію, яку ми знайшли.
Цей зворотний трек є частиною «Відділення» відгалуження та зв’язування. Ви розгалужуєте (у випадку з Рюкзаком) два випадки: 'предметi є частиною елемента "та" рішення iне є частиною рішення ". Ви можете уявити це як двійкове дерево, де ліва дитина - один випадок, а права дитина - інший. Це дерево є деревом пошуку (або пошуковим простором ): його глибина становитьnі тому воно має O(2n)вузли. Тому алгоритм має експоненціальний час у кількості елементів.
Тепер ми переходимо до частини "Обмежена": ми намагаємось знайти такі критерії, які б могли сказати: "ця конфігурація ніколи не виходить, тому ми можемо не турбуватися обчислювати це". Прикладом такого критерію є «вага предметів, які ми вже помістили в рюкзак, перевищуєT': якщо ми додали, скажімо, перше n/2 предметів у рюкзак, і тому він уже заповнений, немає сенсу намагатися ставити предмети n/2+1 через до n і в рюкзаку, але також немає сенсу намагатися вмістити будь-який підмножина n/2+1 через до n у рюкзаку, оскільки він уже повний, тому ми економимо 2n/2справ. Інший приклад - " навіть якщо я вставлю всі решта елементів, значення елементів, які я вклав, не буде перевищувати найкращу конфігурацію, яку я знайшов досі ".
Ці критерії по суті відрізають частини дерева пошуку: на якомусь вузлі ви говорите, наприклад, «ліве піддерево не дасть мені кращої конфігурації, оскільки X», тож ви забудете про це піддірева і не будете його досліджувати. Піддерево глибиниd що ви вирізали таким чином, вас економить O(2d) вузлів, які можуть бути досить трохи швидкими, якщо вам пощастить.
Зауважте, що це називається " Обмеження ", оскільки воно зазвичай включає якусь нижню або верхню межу: для критерію " навіть якщо я вставлю всі інші елементи, значення елементів, які я вклав, не перевищує найкращої конфігурації Я знайшов поки що ', значення вашої найкращої конфігурації поки що є нижньою межею для найкращої конфігурації, тому все, що ніколи не перейде через цю нижню межу, приречене на збій.
Ви можете зробити «Обмежувальну» частину настільки складною, як вам подобається. Наприклад, проблеми цілого програмування часто вирішуються за допомогою релаксації: ви розслабляєте свою програму до лінійної програми, яку ви можете вирішити в поліноміальний час, а потім можете викинути безліч справ для ваших бінарних змінних, які ніколи не вийдуть. Потім ви відгалужуєте на інші параметри.
Зауважте, що Branch and Bound зазвичай лише збільшує швидкість на практиці, але не в теорії: важко точно сказати, яка частина дерева пошуку вирізана за допомогою вашої евристики. Про це свідчить кількість різних евристик, що використовуються на практиці в таких проблемах. Якщо вам не пощастило, решта дерева пошуку залишається величезною навіть з великою кількістю обмежень.