Zastosujmy Branch i Bound do Knapsack , mam nadzieję, że to wyjaśni ci tę koncepcję.
Mamy n przedmioty oznaczone 1 przez do n. vja jest wartością japozycja i wjajego waga. Staramy się zmieścić je w plecaku, który może pomieścić doT. waga w sumie i staramy się zmaksymalizować sumę wartości przedmiotu, który wkładamy do plecaka.
Podstawą jest zwykłe podejście zwrotne. Najpierw stawiamyv1 w paczce, a następnie rozwiąż problem z pozostałymi n - 1przedmioty z rekurencją. Następnie usuwamyv1 z paczki i rozwiązać problem dla pozostałych n - 1 ponownie, a my zwrócimy najlepszą konfigurację, jaką znaleźliśmy.
Cofanie jest częścią „Branch” i „Bound”. Rozgałęziasz się (w przypadku plecaka) na dwa przypadki: „przedmiotja jest częścią rozwiązania ”i„ item janie jest częścią rozwiązania ”. Możesz to sobie wyobrazić jako drzewo binarne, w którym lewe dziecko to jedna sprawa, a prawe dziecko to druga sprawa. To drzewo jest drzewem wyszukiwania (lub przestrzenią wyszukiwania ): jego głębokość wynosini dlatego ma O (2)n)węzły Algorytm ma zatem wykładniczy czas działania pod względem liczby elementów.
Teraz przechodzimy do części „Związanej”: staramy się znaleźć takie kryteria, że możemy powiedzieć, że „ta konfiguracja nigdy się nie sprawdza, więc równie dobrze możemy nie zawracać sobie tym głowy”. Przykładem takiego kryterium jest „waga przedmiotów, które już włożyliśmy do plecaka, przekraczaT.„: jeśli dodaliśmy, powiedzmy, pierwszy n / 2 przedmioty do plecaka i dlatego jest już pełny, nie ma sensu wkładać przedmiotów n / 2+1 przez do n również w plecaku, ale nie ma sensu próbować dopasować żadnego podzbioru n / 2 + 1 przez do n w plecaku, ponieważ jest już pełny, więc oszczędzamy 2)n / 2skrzynie Innym przykładem jest „ nawet jeśli wstawię wszystkie pozostałe elementy, wartość przedmiotów, które włożyłem, nie przekroczy najlepszej konfiguracji, jaką do tej pory znalazłem ”.
Kryteria te zasadniczo odcinają części drzewa wyszukiwania: w pewnym węźle mówisz na przykład: „lewe poddrzewo nie da mi lepszej konfiguracji, ponieważ X”, więc zapominasz o tym poddrzewie i nie eksplorujesz go. Poddrzewo głębire że wycięty w ten sposób cię ratuje O (2)re) węzły, które mogą być nieco przyspieszone, jeśli masz szczęście.
Zauważ, że nazywa się to „ Bounding ”, ponieważ zwykle wiąże się to z pewnym dolnym lub górnym zakresem: dla kryterium „ nawet jeśli wstawię wszystkie pozostałe elementy, wartość elementów, które wprowadzę, nie przekroczy najlepszej konfiguracji Znalazłem do tej pory ”, wartość twojej najlepszej konfiguracji do tej pory stanowi dolną granicę najlepszej konfiguracji, więc wszystko, co nigdy nie przekroczy tej dolnej granicy, jest skazane na niepowodzenie.
Możesz sprawić, by część „Bounding” była tak złożona, jak tylko chcesz. Na przykład problemy z programowaniem liczb całkowitych są często rozwiązywane za pomocą relaksacji: rozluźniasz swój program do programu liniowego, który możesz rozwiązać w czasie wielomianowym, a następnie możesz wyrzucić wiele przypadków dla zmiennych binarnych, które i tak nigdy się nie sprawdzą. Następnie rozgałęziasz się na pozostałych opcjach.
Zauważ, że Rozgałęzienia i Związania zwykle dają ci tylko wzrost prędkości w praktyce, ale nie w teorii: trudno jest dokładnie powiedzieć, ile wycinanych drzewek wyszukiwania jest wycinanych za pomocą heurystyki. Świadczy o tym liczba różnych heurystyk stosowanych w praktyce w przypadku takich problemów. Jeśli masz pecha, pozostałe drzewo wyszukiwania pozostaje ogromne nawet przy dużym ograniczeniu.