Dyskretny problem plecakowy Problem można prosto zobrazować

Transkrypt

Dyskretny problem plecakowy Problem można prosto zobrazować
Dyskretny problem plecakowy
Problem można prosto zobrazować poprzez dylemat złodzieja – mając do wyboru
zestaw przedmiotów o podanej wartości i masie/objętości oraz plecak o ograniczonej
pojemności należy zdecydować, które przedmioty wziąć, a które zostawić, tak by
zmaksymalizować łup.
Bardziej formalnie, dany jest zbiór P = {p1, p2, … , pn} zawierający n przedmiotów.
i-ty przedmiot ma masę mi oraz wartość wi. Dany jest też plecak o pojemności B.
Optymalnym rozwiązaniem jest taki zbiór przedmiotów P', że:
1. P' jest podzbiorem P.
2. Suma mas przedmiotów w zbiorze P' jest nie większa niż B.
3. Suma wartości przedmiotów w zbiorze P' jest największa z możliwych.
Opiszemy teraz kilka przybliżonych algorytmów rozwiązania tego problemu.
Zachłanny algorytm przybliżony
1. Dla każdego przedmiotu zdefiniuj stosunek wartości do masy si=wi/mi.
2. Posortuj przedmioty malejąco według si.
3. Przeglądnij posortowane przedmioty. Jeśli dany przedmiot mieści się jeszcze
do plecaka, to dodaj go do plecaka. Jeśli przedmiot się nie mieści to przejdź do
kolejnego.
Algorytm ten działa w czasie liniowym, ale dla dowolnego R > 0 można znaleźć taką
instancję problemu, dla której błąd ε będzie większy niż R.
PTAS
Algorytm jest dosyć skomplikowany i trudny do wyjaśnienia, dlatego najpierw zaleca
się zająć algorytmem FPTAS.
Przeanalizujmy najpierw algorytm siłowy (przegląd zupełny). Algorytm ten sprawdza
wszystkie możliwe podzbiory zbioru P (których jest 2P). Sprawdza więc podzbiory o
długości (liczbie elementów) 1, potem podzbiory o długości 2, 3, …, n – 2, n – 1 aż
do n.
Na i-tym "poziomie" należy przejrzeć wszystkie podzbiory o długości i. Na poziomie
i-tym jest:
n = n!
i i!(n−i)!
()
podzbiorów, gdzie n jest ogólną liczbą przedmiotów.
Przykładowe sprawdzenie podzbioru { 1 , 3 , 5 } polega na próbie włożenia do
plecaka przedmiotów 1, 3 i 5. Jeśli wszystkie przedmioty się mieszczą, to podzbiór
ten opisuje dopuszczalne rozwiązanie i należy obliczyć zysk. Jeśli przedmioty się nie
mieszczą, to rozwiązanie nie jest dopuszczalne i należy je zignorować.
Po zakończeniu pracy algorytm siłowy dostarcza to rozwiązanie dopuszczalne, które
daje największy zysk. Ponieważ przejrzeliśmy wszystkie rozwiązania, to dostarczone
rozwiązanie jest optymalne.
Algorytm PTAS działa jako modyfikacja przeglądu zupełnego:
1. Na wejściu dana jest dodatkowo liczba całkowita k < n. Liczba ta będzie
sterować błędem algorytmu – im wyższe k, tym większa dokładność, ale
dłuższy czas pracy algorytmu.
2. Podobnie jak dla algorytmu siłowego, rozpatruj podzbiory, z tym, że:
1. Rozpatruj jedynie podzbiory o długości i ≤ k.
2. Jeśli rozpatrywany podzbiór jest dopuszczalny, to spróbuj go dopełnić
metodą opisaną powyżej przy okazji algorytmu zachłannego. Tzn. jeśli i = 2
oraz n = 6, to dla każdego 2-elementowego zbioru próbujemy dodać do
plecaka pozostałe 4 elementy według malejącego współczynnika wartości
do masy. Jeśli element można schować do plecaka, to go chowamy, jeśli nie
to go pomijamy. Możliwe jest, że nie uda się "dorzucić" żadnego
przedmiotu.
3. Po próbie "dopełnienia" zbioru standardowo obliczamy zysk.
3. Algorytm PTAS zwraca najlepszy ze sprawdzonych i (ewentualnie)
dopełnionych podzbiorów.
FPTAS
Algorytm FPTAS działa następująco:
1. Na wejściu dany jest dodatkowo parametr ε.
2. W = max wi (największa wartość spośród wszystkich przedmiotów).
3.
K=
εW
.
n
4. Dla każdego i:
1.
⌊ ⌋ (przeskalowanie wartości przedmiotów, zaokrąglenie w dół).
w 'i=
wi
K
5. Rozwiąż nowy problem z wartościami w'i zamiast wi, korzystając
z algorytmu programowania dynamicznego.
6. Rozwiązaniem oryginalnego problemu jest ten sam zbiór przedmiotów, który
stanowi rozwiązanie problemu z punktu 5. Należy jedynie pamiętać o tym, że
podając rozwiązanie (zysk) należy sumować oryginalne wartości wi, a nie w'i.
Algorytm programowania dynamicznego opisany jest na polskiej wikipedii (link).
Uwaga! Interesuje nas algorytm dla dyskretnej wersji problemu, a nie dla wersji
z wielokrotnym użyciem elementu!