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!