WYKAD 5 Problem plecakowy Ryszard Myhan PROBLEM PLECAKOWY
WYKŁAD 5 Problem plecakowy Ryszard Myhan
PROBLEM PLECAKOWY (KNAPSACK PROBLEM) ¥ Jest jednym z najczęściej poruszanych problemów optymalizacyjnych. ¥ Zagadnienie optymalizacji zwane problemem „plecakowym” swą nazwę wzięło z analogii do sytuacji praktycznej podobnej do problemu pakowania plecaka. ¥ Chodzi o to, by zapakować maksymalnie cenny zbiór przedmiotów nie przekraczając ładowności (nośności lub pojemności) bagażu. ¥ W zależności od przyjętych założeń, występują dwie klasy tego problemu, określane jako: § ogólny problem plecakowy § dyskretny problem plecakowy.
PROBLEM PLECAKOWY & 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ż W kilogramów. Ø Nie może też zabierać ułamkowej części przedmiotów
OGÓLNY PROBLEM PLECAKOWY t Główną cechą ogólnego problemu plecakowego jest nieograniczona ilość każdej rzeczy. ð Dane: • zbiór n rzeczy R 1, R 2, …, Rn, przy czym ilość każdej z tych rzeczy jest nieograniczona; • • każdej rzeczy Ri przypisana jest pewna wielkość wi i wartość pi; maksymalna waga plecaka W. ð Wyniki: • ilości q 1, q 2, q 3, …, qn poszczególnych rzeczy, których łączna waga nie przekracza W, a ich sumaryczna wartość jest największa.
OGÓLNY PROBLEM PLECAKOWY u Formalizacja problemu: Znaleźć wartości q 1, q 2, q 3, …, qn, dla których wartość sumy, będącej całkowitą wartością plecaka, max[p 1 q 1 + p 2 q 2 + … + pnqn] jest największa, przy czym musi być spełniony warunek, że nie będzie przekroczona pojemność plecaka, czyli: w 1 q 1 + w 2 q 2 + …+ wnqn ≤ W oraz wielkości : q 1, q 2, q 3, …, qn są nieujemnymi liczbami całkowitymi.
OGÓLNY PROBLEM PLECAKOWY u Rozwiązanie dopuszczalne: Wartości q 1, q 2, q 3, …, qn , które spełniają warunek: w 1 q 1 + w 2 q 2 + …+ wnqn ≤ W gdzie q 1, q 2, q 3, …, qn są nieujemnymi liczbami całkowitymi. u Rozwiązanie optymalne: jeśli dodatkowo p 1 q 1 + p 2 q 2 + … + pnqn dla tych wartości jest największa. u Algorytm zachłanny: § § zawartość plecaka jest kompletowana krok po kroku każda decyzja polega na dokonaniu wyboru, który jest najlepszy na danym etapie
OGÓLNY PROBLEM PLECAKOWY u Algorytm zachłanny – kryteria wyboru: u wybierane są rzeczy najcenniejsze (nierosnące wartości pi) v wybierane są rzeczy zajmujące najmniej miejsca w • • • (niemalejące wartości wi) wybierane są rzeczy najcenniejsze w stosunku do swojej wagi (nierosnące wartości ilorazu pi /wi) Człowiek działając strategicznie i po kolei, podejmuje decyzje optymalne z punktu widzenia danego kroku. Tak wiec w pierwszym kroku wg planu nr 1 wziąłby rzecz najdroższą, wg planu nr 2 wziąłby dużo lekkich, zaś wg strategii nr 3 wziąłby maksymalną ilość przedmiotów o największej wartości jednostkowej. Właśnie takie działanie nazywamy działaniem zachłannym.
OGÓLNY PROBLEM PLECAKOWY u wybierane są rzeczy najcenniejsze i 1 2 3 4 5 6 W pi 6 4 5 7 10 2 - wi 6 2 3 1 23 1 7 1. wybierana jest rzecz nr. 5 ponieważ jest najcenniejsza 2. wybierane jest aż 7 sztuk ponieważ wartość wagi 3. (3 *7=21) 3. wynosi w plecaku pozostało nam miejsce na rzecz o wadze 2 4. (23 -21=2). wybierana jest rzecz nr. 4 (1 szt. ) o wartości 7 Wartość plecaka wynosi 77 (7*10 + 7) 23 21
OGÓLNY PROBLEM PLECAKOWY v wybierane są rzeczy zajmujące najmniej miejsca i 1 2 3 4 5 6 W pi 6 4 5 7 10 2 - wi 6 2 3 1 23 23 23 1. wybierane są rzeczy w kolejności rosnących wag 2. wybierane jest 23 sztuki rzeczy nr. 6 3. każda rzecz nr. 6 ma wartość 2 Wartość plecaka wynosi 46 (2*23)
OGÓLNY PROBLEM PLECAKOWY w wybierane są rzeczy najcenniejsze w stosunku do ich wagi i 1 2 3 4 5 6 W pi 6 4 5 7 10 2 - wi 6 2 3 1 23 1 22 23 11 1. plecak jest pakowany wg rosnącej kolejności ilorazów 4), 10/3 (5), nr. 4/2 (2), 2/12)(6), 5/3 (3), i/wi czyli (7/2 2. pwybierane jest(rzecz 11 sztuk rzeczy 4 (waga 6/6 (1)) 3. pozostaje 1 jednostka miejsca 23 -11*2 4. wybierana jest 1 sztuka rzeczy nr. 6. (waga 1) Wartość plecaka wynosi 79 (11*7 + 1*2)
OGÓLNY PROBLEM PLECAKOWY WNIOSKI: þ þ Żaden z tych sposobów nie daje najlepszego rozwiązania þ Najbardziej przybliżone jest 3 kryterium ( są w nim uwzględnione oba parametry, zarówno waga jaki i wartość rzeczy) Otrzymane rozwiązania są jedynie przybliżone do rozwiązania optymalnego.
OGÓLNY PROBLEM PLECAKOWY Dane: gdzie: Pi(wi, pi), i = 1, 2, …, n; Pi – przedmiot, wi – wielkość i-tego przedmiotu, pi – wartość i-tego przedmiotu Mmax – nośność (pojemność) plecaka. Uporządkowane tak, aby: Wyniki: 1. Dla kolejnych przedmiotów Pi, i= 1, 2, 3, . . , n wykonaj krok 2. 2. Określ największą wartość ki, spełniającą nierówność ki wi ≤ Mmax i przyjmij Mmax = Mmax − ki wi. 3. Znaleziona wartość plecaka wynosi: W = k 1 w 1 + k 2 w 2 + …+ kn wn
PROGRAMOWANIE DYNAMICZNE DLA OGÓLNEGO PROBLEMU PLECAKOWEGO ¥ Metoda programowania dynamicznego zapewnia znalezienie optymalnego rozwiązania problemu plecakowego. ¥ Polega ona na umiejętnym zastosowaniu zasady „dziel i zwyciężaj” – dzieląc zagadnienie, na problemy mniejsze i łatwiejsze do rozwiązania. u Zapewnia znalezienie optymalnego rozwiązania ogólnego problemu plecakowego. Ä Zasada optymalności Bellmana - w każdym kroku podejmować najlepszą decyzję z uwzględnieniem stanu wynikającego z poprzednich decyzji.
PROGRAMOWANIE DYNAMICZNE DLA OGÓLNEGO PROBLEMU PLECAKOWEGO ¥ Niech w 1, . . . , wn będzie wagą elementów oraz p 1, . . . , pn wartościami. ¥ Algorytm ma zmaksymalizować sumę wartości elementów, przy zachowaniu sumy ich wagi mniejszej bądź równej W. ¥ Niech A(i) będzie największą możliwą wartością, która może być otrzymana przy założeniu wagi mniejszej bądź równej i. § § A(0) = 0 A(i) = max { pj + A(i − wj) : wj ≤ i }
OGÓLNY PROBLEM PLECAKOWY u. Algorytm programowania dynamicznego Dane: • n rzeczy (każda w nieograniczonej ilości). • każda rzecz ma wielkość wi i wartości pi (i =1, 2, 3…, n). • W – maksymalna wartość plecaka. Wyniki: • tablica Pi, j najlepszych upakowań plecaka o pojemności j rzeczami rodzajów od 1 do i, dla i=1, 2, 3 …n oraz j=1, 2, 3…W; • skojarzona tablica rodzajów rzeczy Qi, j, dołożonych w ostatnim dopakowaniu plecaka.
OGÓLNY PROBLEM PLECAKOWY u. Algorytm programowania dynamicznego Lista kroków: Krok 1. {Ustalenie wartości początkowych w tablicach P i Q rozszerzonych dla ujednolicenia obliczeń, o wiersze i kolumny zerowe. } Dla j=1, 2, 3…W przypisz P 0, j: =0, Q 0, j: =0. Dla i=1, 2, 3…n przypisz Pi, 0: =0, Qi, 0: =0. Krok 2. Dla kolejnych rzeczy i=1, 2, 3…n wykonaj krok 3. Krok 3. Dla kolejnych pojemności j=1, 2, 3…W wykonaj krok 4. Krok 4. Jeśli j ≥ wi {czyli pojemność plecaka jest wystarczająca, by pomieścić rzecz i} oraz Pi-1, j < Pi, j-wi + pi, to przypisz Pi, j: =Pi, j-wi + pi oraz Qi, j: =i, w przeciwnym razie pozostaw wartości z poprzedniego wiersza Pi, j: =Pi-1, j oraz Qi, j: =Qi-1, j.
OGÓLNY PROBLEM PLECAKOWY Tablica P i 1 2 3 4 5 6 W pi 6 4 5 7 10 2 - wi 6 2 3 1 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 0 0 0 6 6 6 2 0 4 4 8 8 3 0 4 5 8 9 12 12 16 16 20 20 24 24 28 28 zawartość 32 32 36 plecaka 36 40 to: 40 44 44 Optymalna 4 i 136 rzecz 12 13 16 17 20 21 24 25 10 28 rzeczy 29 32 nr 33 37 nr 405 41 44 45 4 0 7 7 14 14 21 21 28 28 35 35 42 42 49 o łącznej 49 56 wadze 56 63 P=80 63 70 70 77 77 5 0 7 10 14 17 21 24 28 31 35 38 42 45 49 52 56 59 63 66 70 73 77 80 6 2 7 10 14 17 21 24 28 31 35 38 42 45 49 52 56 59 63 66 70 73 77 80 Tablica Q. 6 12 12 12 18 18 18 1 2 3 4 5 6 7 8 9 1 0 0 0 1 1 2 0 2 2 2 2 3 0 2 3 2 3 Nr rzecz włożonej do 10 11 12 13 14 15 16 17 18 19 20 22 23 plecaka na 21 końcu o 3 pozycje. wadze 3) 1 1 1 1 (rzecz 1 1 5 o 4 o wadze 2) 1 1 o (rzecz 2 pozycje. 2 2 2 o 22 pozycje. 2 2 2 2 2 (rzecz 4 o wadze 2) 2 3(rzecz 2 43 o wadze 2 3 2)2 3 2 3 4 0 4 4 4 4 4 4 5 6 0 6 4 4 5 5 4 4 5 5 4 4 5 5
OGÓLNY PROBLEM PLECAKOWY
DYSTRETNY PROBLEM PLECAKOWY t Problem różni sie tym od ogólnego, że każda rzecz pakowana do plecaka może wystąpić tylko jeden raz. Ä Ä Podejmujemy więc decyzję pakować=1 nie pakować=0. Tak zdefiniowany problem bardziej odzwierciedla rzeczywistą sytuację pakowania plecaka. ð Dane: • zbiór n rzeczy o nieograniczonej wielkości; • każdej rzeczy przypisana jest wielkość wi i wartość pi; • rzeczy są uszeregowane wg p 1/w 1 p 2/w 2 … pn/wn • maksymalna waga plecaka W. ð Wyniki: • ilości q 1, q 2, … , qn poszczególnych rzeczy (mogą być zerowe), a ich łączna waga nie przekracza W.
DYSKRETNY PROBLEM PLECAKOWY u Algorytm zachłanny – kryteria wyboru: u Dla kolejnych rzeczy i =1, 2, 3…n, uporządkowanych zgodnie z nierównościami p 1/w 1 ≥ p 2/w 2 ≥… ≥ pn/wn, wykonaj krok 2. v Jeśli wi ≤ W przyjmij W: =W- wi; qi=1, w przeciwnym w razie przyjmij qi=0. . Ładunek plecaka ma wartość p 1 q 1 + p 2 q 2 + … + pnq.
DYSKRETNY PROBLEM PLECAKOWY u Algorytm zachłanny – pseudokod posortuj nie rosnąco przedmioty wg. wartości p[j]/w[j] aktualna_waga: =0 for i: =1 to n do if w[i] + aktualna_waga <= W then dodaj i-ty przedmiot do plecaka aktualna_waga : = aktualna_waga + w[i]
DYSKRETNY PROBLEM PLECAKOWY u Algorytm zachłanny – przykład:
DYSKRETNY PROBLEM PLECAKOWY Przykład: gdy pojemność plecaka W=10 i 1 2 3 4 5 6 W i 4 5 2 6 3 1 W pi 6 4 5 7 10 2 - pi 7 10 4 2 5 6 - wi 6 2 3 1 10 wi 2 3 2 1 3 6 10 8 pi/wi 1/1 4/2 5/3 7/2 10/3 2/1 1. obliczamy dla każdej rzeczy p 1/wi 2. porządkujemy rzeczy wg p 1/w 1 ≥ p 2/w 2 ≥… ≥ pn/wn 3. wybieramy kolejno: 4, 5, 2, 6 (razem ważą 8 jednostek) plecaka wynosi 23. 3 cały plecak będzie 4. Wartość gdy zamiast 6 wybierzemy wypełniony a jego wartość będzie wynosiła 26.
DYSKRETNY PROBLEM PLECAKOWY u. Algorytm programowania dynamicznego Dane: • n rzeczy o nieograniczonej wielkości. • Każda rzecz ma wielkość wi i wartości pi (i =1, 2, 3…, n). • W – maksymalna wartość plecaka. Wyniki: • tablica Pi, j najlepszych upakowań plecaka o pojemności j rzeczami rodzajów od 1 do i, dla i=1, 2, 3 …n oraz j=1, 2, 3…W; • skojarzona tablica rodzajów rzeczy Qi, j, dołożonych w ostatnim dopakowaniu plecaka.
DYSKRETNY PROBLEM PLECAKOWY u. Algorytm programowania dynamicznego Lista kroków: Krok 1. {Ustalenie wartości początkowych w tablicach P i Q rozszerzonych dla ujednolicenia obliczeń, o wiersze i kolumny zerowe. } Dla j=1, 2, 3…W przypisz P 0, j: =0, Q 0, j: =0. Dla i=1, 2, 3…n przypisz Pi, 0: =0, Qi, 0: =0. Krok 2. Dla kolejnych rzeczy i=1, 2, 3…n wykonaj krok 3. Krok 3. Dla kolejnych pojemności j=1, 2, 3…W wykonaj krok 4. Krok 4. Jeśli j ≥ wi {Czyli pojemność plecaka jest wystarczająca, by pomieścić rzecz i} oraz Pi-1, j < Pi, j-wi + pi, to przypisz Pi, j: =Pi, j-wi + pi oraz Qi, j: =1, w przeciwnym razie pozostaw wartości z poprzedniego wiersza Pi, j: =Pi-1, j oraz Qi, j: =0.
DYSKRETNY PROBLEM PLECAKOWY Tablica P i 1 2 3 4 5 6 W pi 6 4 5 7 10 2 - wi 6 2 3 1 10 1 2 3 4 5 6 7 8 9 10 1 0 0 0 6 6 6 2 0 4 4 6 6 10 10 10 3 0 4 5 5 9 9 9 10 11 11 4 0 7 7 11 12 12 16 16 16 17 5 0 7 10 11 17 17 21 22 22 26 6 1 7 10 11 17 18 21 22 23 26 3 4 5 6 Tablica Q. 1 2 7 8 9 10 1 0 0 0 1 1 1 2 0 1 1 0 0 1 1 1 3 0 0 1 1 1 0 1 1 4 0 1 1 1 1 1 5 0 0 1 1 1 1 6 1 0 0 1 0 1 1 0
REALIZACJA ALGORYTMU t Problem plecakowy jest zagadnieniem NP-trudnym, nie ma więc wielomianowego algorytmu znalezienia optymalnego upakowania. t Istnieje kilka sposobów rozwiązania: u Przegląd zupełny (metoda siłowa) – zdecydowanie najgorszy sposób; w jego przypadku złożoność obliczeniowa algorytmu wyniesie Θ(2 n), co zdecydowanie zawyży czas działania dla dużych n. v Algorytmy przybliżone – można np. obliczyć dla każdego elementu stosunek wartości do wagi hj =pj/wj, uszeregować uzyskane wartości od największej do najmniejszej, a następnie wstawiać kolejne elementy do plecaka dopóki Σ wj < W. Wadą takiego rozwiązania jest niepewność co do optymalności otrzymanego upakowania.
REALIZACJA ALGORYTMU t Istnieje kilka sposobów rozwiązania (cd. ): w 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.
UWAGI KOŃCOWE ¥ Złożoność obliczeniowa obydwu algorytmów zachłannych jest proporcjonalna do n*ln(n). ¥ Podobnie oba algorytmy dynamiczne maja złożoność obliczeniową rzędu n*Wmax. ¥ Należy zwrócić uwagę, że programowanie dynamiczne będzie sprawdzać sie przy niewielkiej ilości elementów i niewielkiej pojemności plecaka. ¥ Dla większych liczb algorytmy programowania dynamicznego stają się mało praktyczne.
PROBLEM PLECAKOWY - PRZYKŁAD 1. Problem kasjera Problem Kasjer ma wydać resztę, będącą dowolną kwot między 0, 01$ a 0, 99$, przy użyciu minimalnej liczby monet. Rozwiązanie oparte na algorytmie zachłannym Najpierw używamy monety o największej dopuszczalnej wartości, redukując w ten sposób problem do wypłacenia mniejszej kwoty. Przykład Aby wydać 0, 94 $, kasjer wypłaci: • półdolarówkę (zostawiając do zapłacenia 0, 44 $), • następnie ćwierćdolarówkę (zostaje 0, 19 $), • dziesięciocentówkę ( zostaje 0, 09 $), • pięciocentówkę (zostaje 0, 04 $) i w końcu, • cztery jednocentówki W sumie kasjer wypłaci osiem monet. Jest to minimalna liczba i faktycznie algorytm zachłanny jest optymalny dla monet amerykańskich
PROBLEM PLECAKOWY - PRZYKŁAD 2. Problem wyboru zajęć Problem • Dany jest zbiór S = {1, 2, . . n} składający się z n proponowanych zajęć, do których mają być przydzielone zasoby, takie jak na przykład sala wykładowa, w której może się odbywać w danej chwili tylko jedno z tych zajęć. • Każde zajęcia maj swój czas rozpoczęcia si oraz czas zakończenia fi , takie, że si ≤ fi. • Jeżeli zajęcie o numerze i zostanie wytypowane, to zajmuje zasób przez prawostronnie otwarty przedział czasu [si , fi). • Zajęcia o numerze i oraz j są zgodne, jeśli przedziały [si , fi) , i [sj , fj), nie zachodzą na siebie ( czyli si ≥ fj lub sj ≥ fi). Problem wyboru zajęć polega na wyborze największego podzbioru parami zgodnych zajęć.
PROBLEM PLECAKOWY - PRZYKŁAD 2. Problem wyboru zajęć - rozwiązanie Bez utraty ogólności zakładamy, że zajęcia są uporządkowane ze względu na czas zakończenia: f 1 ≤ f 2 ≤. . . ≤ fn Jeżeli powyższe założenie jest spełnione, to przed realizacją algorytmu należy posortować ciąg czasów zakończenia (optymalny koszt sortowania O(nlogn). W procedurze zakładamy, że s i f są reprezentowane jako tablice. 1 n ← length[s] 2 A ← {1} 3 j← 1 4 for i← 2 to n 5 do if si ≥ fj 6 then A ← A {i} 7 j ← i 8 return A Wynikiem powyższej procedury jest zbiór A zawierający numery zajęć. Zmienna j zawiera ostatnio dodane do A zajęcie.
- Slides: 32