Problem plecakowy
Z Wikipedii
Dyskretny problem plecakowy (ang. binary knapsack problem) jest jednym z najczęściej poruszanych problemów optymalizacyjnych. Formułuje się go następująco: mamy do dyspozycji plecak o maksymalnej pojemności B oraz zbiór N elementów {x1, xj, ..., xN}, przy czym każdy element ma określoną wartość cj oraz wielkość wj. Naszym zadaniem jest znalezienie takiego upakowania plecaka, aby suma wartości znajdujących się w nim elementów była jak największa. Problem plecakowy często przedstawia się jako problem złodzieja rabującego sklep – znalazł on N towarów; j - ty przedmiot jest wart cj oraz waży wj. Złodziej dąży do zabrania ze sobą jak najwartościowszego łupu, przy czym nie może zabrać więcej niż B kilogramów. Nie może też zabierać ułamkowej części przedmiotów (byłoby to możliwe w ciągłym problemie plecakowym).
[edytuj] Realizacja algorytmu
Dyskretny problem plecakowy jest zagadnieniem NP-trudnym, nie znamy więc wielomianowego algorytmu znalezienia optymalnego upakowania. Istnieje kilka sposobów rozwiązania:
- Przegląd zupełny (bruteforce, metoda siłowa)– zdecydowanie najgorszy sposób; w jego przypadku złożoność obliczeniowa algorytmu wyniesie Θ(2n), co zdecydowanie zawyży czas działania dla dużych n. Złożoność wynosi Θ(2n) ponieważ jest tyle możliwych ciągów zero jedynkowych na n polach. Złożoność można również wyliczyć ze wzoru dwumianowego Newtona (dwumian Newtona) podstawiając za a i b jedynki.
- Programowanie dynamiczne – można nazwać je rozszerzeniem metody "dziel i zwyciężaj". Problem rozwiązywany poprzez programowanie dynamiczne dzielony jest na szereg prostych do rozwiązania podproblemów, ale z uwzględnieniem dodatkowego warunku, że wyniki każdego wcześniej rozwiązanego podproblemu mogą zostać wykorzystane do późniejszego rozwiązania innych podproblemów.
Ciągły problem plecakowy można rozwiązać za pomocą algorytmu zachłannego:
- Obliczyć dla każdego elementu stosunek wartości do wagi hj = cj/wj, uszeregować uzyskane wartości od największej do najmniejszej (można to zrobić w czasie O(n*logn) ), a następnie wstawiać kolejne elementy do plecaka dopóki Σ wj < B. Nie można w ten sposób rozwiązać problemu dyskretnego.