W algorytmiki The Problem plecak , czasami oznaczany ( KP ) (od angielskiego Knapsack problem ) jest kombinatorycznej problem optymalizacji . Modeluje sytuację analogiczną do wypełnienia plecaka , który nie może utrzymać więcej niż określony ciężar , przy czym całość lub część danego zestawu przedmiotów ma wagę i wartość . Przedmioty wkładane do plecaka muszą maksymalizować całkowitą wartość, nie przekraczając maksymalnej wagi.
Problem plecaka jest jednym z 21 NP-Complete Problemów Richarda Karpa , przedstawionych w jego artykule z 1972 roku . Jest intensywnie badane od połowy XX -tego wieku i istnieją odniesienia z 1897 roku , w artykule Jerzego Ballard Mathews (w) . Sformułowanie problemu jest bardzo proste, ale jego rozwiązanie jest bardziej złożone. Istniejące algorytmy mogą rozwiązać duże praktyczne przypadki. Jednak osobliwa struktura problemu i fakt, że występuje on jako podproblem innych, bardziej ogólnych problemów, sprawiają, że jest to główny temat badań .
Ten problem jest podstawą pierwszego asymetrycznego (lub „klucza publicznego”) algorytmu szyfrowania przedstawionego przez Martina Hellmana , Ralpha Merkle'a i Whitfielda Diffiego na Uniwersytecie Stanforda w 1976 roku . Jednak mimo że pomysł zrodził się z problemu plecaka (od którego pochodzi nazwa algorytmu), jest on uważany za pierwszy prawdziwy asymetryczny algorytm szyfrowania tuż przed wydaniem RSA w następnym roku.
Wersja NP-difficile tego problemu została wykorzystana w prymitywach i protokołach kryptograficznych , takich jak kryptosystem Merkle-Hellmana lub kryptosystem Chor-Rivest . Ich przewagą w stosunku do asymetrycznych kryptosystemów, wynikającą z trudności faktoringu, jest szybkość szyfrowania i deszyfrowania. Jednak algorytm Hellmana, Merkle'a i Diffiego podlega algorytmicznym „tylnym drzwiom”, co oznacza, że jest „zepsuty”, czyli poddany kryptoanalizacji . Problem plecaka jest klasycznym przykładem błędnego przekonania o związkach między NP-kompletnością a kryptografią. Następnie przedstawiono poprawioną wersję algorytmu z iteracją problemu plecaka, która ma zostać jak najszybciej złamana. Do tej pory wszystkie algorytmy szyfrowania asymetrycznego oparte na plecakach zostały złamane, a najnowszym jest algorytm Chor-Rivest.
Służy również do modelowania następujących sytuacji, czasami jako podproblem:
Innym powodem do zainteresowania się tym problemem jest jego pojawienie się w niektórych zastosowaniach metod generowania kolumn (np. W przypadku problemu „ upakowania pojemników ” ).
Anegdotycznie, a tym samym uzasadniając nazwę problemu, turysta staje przed nim przygotowując się do wyprawy: plecak ma ograniczoną pojemność i dlatego trzeba zdecydować, czy wziąć np. Dwie puszki i pięćdziesięciocentymetrową tykwę, czy pojedyncza puszka i litrowa tykwa.
Dane dotyczące problemu można wyrazić w kategoriach matematycznych. Obiekty są ponumerowane według indeksu i wahającego się od 1 do n . Liczby w i oraz p i reprezentują odpowiednio wagę i wartość numeru obiektu i . Pojemność worka oznaczona W .
Istnieje wiele sposobów na wypełnienie plecaka. Aby opisać jeden z nich, konieczne jest wskazanie dla każdego elementu, czy jest on pobrany, czy nie. Możemy zastosować kodowanie binarne: stan i-tego elementu będzie równy x i = 1, jeśli element zostanie umieszczony w woreczku, lub x i = 0, jeśli zostanie pozostawiony na boku. Jeden ze sposobów napełniania worka jest zatem całkowicie opisany przez wektor , zwany wektorem zawartym lub po prostu zawarty :; a waga powiązana, jak również wartość związana z tym wypełnieniem, mogą być następnie wyrażone jako funkcja zawartego wektora.
Dla danej zawartości X , całkowita wartość zawarta w worku to naturalnie:
Podobnie suma wag wybranych obiektów to:
Problem można następnie przeformułować jako poszukiwanie zawartego wektora (składowe są równe 0 lub 1), realizując maksimum funkcji wartości całkowitej z ( X ) , pod warunkiem: (1) To znaczy, że suma wag wybranych przedmiotów nie przekracza pojemności plecaka.
Ogólnie rzecz biorąc, w celu uniknięcia pojedynczych przypadków dodaje się następujące ograniczenia:
Terminologia:
Problem plecaka można przedstawić w formie decyzyjnej, zastępując maksymalizację następującym pytaniem: dana liczba k , czy istnieje wartość, dla której w odniesieniu do ograniczenia? W jego postaci decyzyjnej, gdy liczby są reprezentowane w notacji binarnej, problem jest NP-zupełny , co oznacza, że nie jest znana ogólna metoda konstruowania optymalnego rozwiązania, inna niż systematyczne badanie wszystkich rozwiązań. Problem optymalizacyjny jest NP-trudny, jego rozwiązanie jest co najmniej tak samo trudne jak rozwiązanie problemu decyzyjnego, a nie ma znanego algorytmu wielomianowego (wielomian w liczbie cyfr opisujących instancję), który mając rozwiązanie, może powiedzieć jeśli jest optymalny (co oznaczałoby stwierdzenie, że nie ma rozwiązania z większym k , a więc rozwiązać problem decyzyjny NP-zupełny).
Istnieje powiązanie między wersją "decyzyjną" a wersją "optymalizacyjną" problemu, ponieważ jeśli istnieje algorytm wielomianowy, który rozwiązuje wersję "decyzyjną", to możemy znaleźć maksymalną wartość dla problemu optymalizacji w sposób wielomianowy wykonując dychotomię w celu znalezienia k między 1 a i wywołując algorytm wielomianowy, który rozwiązuje wersję „decyzyjną” (uważaj, jeśli przejdziemy przez wszystkie wartości k od 1 do , otrzymamy algorytm wykładniczy w instancji rozmiar). Z drugiej strony, jeśli algorytm znajdzie optymalną wartość problemu optymalizacji w czasie wielomianowym, to problem decyzyjny można rozwiązać w czasie wielomianowym, porównując wartość rozwiązania uzyskanego przez ten algorytm z wartością k . Zatem obie wersje problemu mają podobne trudności.
Ten systematyczny przegląd można przeprowadzić przy użyciu drzewa eksploracji binarnych, takiego jak pokazane (trójkąty reprezentują poddrzewa).
Drzewo jest opisane przez zstępowanie od góry do dołu trójkątów (liści drzewa). Każde pole odpowiada jednej możliwej trasie. Postępując zgodnie ze wskazówkami podanymi wzdłuż krawędzi drzewa, każdej ścieżce odpowiada szereg wartości tworzących wektor zawarty. W każdej komórce można wtedy wprowadzić całkowitą wartość i całkowitą wagę odpowiedniej zawartości. Pozostaje tylko wyeliminować skrzynki, które nie spełniają tego ograniczenia, i wybrać spośród tych, które pozostają tym (lub jednym z nich), który nadaje największą wartość funkcji celu .
Za każdym razem, gdy obiekt jest dodawany do listy dostępnych obiektów, poziom jest dodawany do binarnego drzewa eksploracji, a liczba pól jest mnożona przez 2. Eksploracja drzewa i wypełnianie komórek ma zatem koszt, który rośnie wykładniczo wraz z liczba n obiektów.
Ten dowód NP-kompletności został przedstawiony przez Michaila G. Lagoudakisa na podstawie artykułu Richarda Karpa i artykułu JE Savage'a.
Szczegóły dowodówDowód na NP-kompletność odbywa się za pomocą problemu plecaka w postaci problemu decyzyjnego. Odbywa się to w dwóch krokach, po pierwsze, aby sprawdzić, czy ( KP ) należy do klasy NP, a po drugie, aby pokazać, że ( KP ) jest NP-trudne.
Jako dowód przynależności do NP-difficile użyjemy sumy wersji podzbiorów (patrz warianty poniżej), oznaczonej ( SSE ), konkretnej wersji plecaka, w której zysk przedmiotu jest równy jego wadze. Jeśli ta konkretna wersja jest NP-trudna, to ( KP ) w całej swojej ogólności też jest.
Problem ( SSE ) można uzyskać z powyższego problemu plecaka, ustawiając w i = p i . Ustawiając W = k , otrzymujemy:
Znajdź X takie, że
Najpierw musimy udowodnić, że ( KP ) należy do klasy NP, to znaczy istnieje algorytm wielomianowy, który mając rozwiązanie problemu, może zweryfikować poprawność tego rozwiązania. Aby zweryfikować rozwiązanie, wystarczy obliczyć sumę mas wybranych obiektów i porównać ją z W , a także sumę ich wartości do porównania z k . Wszystko jest oczywiście wielomianowe.
Członkostwo w NP-difficileTeraz chodzi o pokazanie, że ( SSE ) jest problemem NP-trudnym poprzez przekształcenie problemu dokładnego pokrycia (oznaczonego ( EC ), z angielskiego dokładnego pokrycia ) w problem ( SSE ). Problem ( EC ) wyraża się następująco:
Niech Ü zestaw elementów oraz zbiór podzbiorów U . Czy istnieje podzbiór S * od S takie, że:
Problem ( EC ) jest NP-zupełny. Pokazując, że dowolne wystąpienie ( EC ) można przekształcić wielomianowo w wystąpienie ( SSE ), udowodnimy, że (a zatem ( KP )) należy do klasy problemów NP-trudnych.
Niech I = ( U , S ) będzie dowolnym wystąpieniem ( EC ). Rozważymy to bez utraty ogólności . Zwrócimy uwagę:
stan zbioru S i ( x i = 1 wtedy i tylko wtedy, gdy ); przynależność wartości j do zbioru S i ( y ij = 1 wtedy i tylko wtedy ).Albo . Zmienne problemu ( SSE ), to x i tego problemu ( WE ). Określamy ich wagę w następujący sposób:
.Zdefiniujemy pojemność W wg
.Waga obiektu i jest sumą potęg b i b j -1 pojawia się we w i wtedy i tylko wtedy, gdy . Dlatego istnieje zgodność jeden do jednego między rozwiązaniem skonstruowanego problemu ( SSE ) a instancją ( EC ). Każda wartość w i jest obliczana w O (| U |), a wartość W jest obliczana w O (1) . Transformacja ma zatem złożoność czasową w O ( n | U |) .
Podobnie jak w przypadku większości problemów NP-zupełnych, znalezienie wykonalnych, ale nie optymalnych rozwiązań może być interesujące. Najlepiej z gwarancją różnicy między wartością znalezionego rozwiązania a wartością rozwiązania optymalnego.
Wydajność przedmiotu nazywany jest stosunkiem wartości od jego wagi. Im większa wartość przedmiotu w stosunku do tego, co konsumuje, tym bardziej wydajny jest przedmiot.
Najprostszym algorytmem jest chciwy algorytm . Chodzi o to, aby priorytetowo dodawać najskuteczniejsze przedmioty, dopóki worek nie zostanie nasycony:
trier les objets par ordre décroissant d'efficacité w_conso := 0 pour i de 1 à n si w[i] + w_conso ≤ W alors x[i] := 1 w_conso := w_conso + w[i] sinon x[i] := 0 fin si fin pour Analiza zachłannego algorytmuOznaczymy przez z * wartość rozwiązań optymalnych.
Rozwiązanie X zwrócone przez chciwy algorytm może być możliwie niskiej jakości. Weźmy na przykład pod uwagę, że mamy tylko dwa przedmioty do umieszczenia w torbie. Pierwszy ma wzmocnienie 2 i masie 1, drugi ma przewagę i ciężar równy zarówno W . Pierwszym celem wynalazku jest bardziej skuteczny zostanie wybrana pierwsza i uniemożliwia odpływ z drugim, co daje wartość 1 jako roztworu optymalna jest biała . Istnieją zatem wartości problemu, dla których stosunek znalezionego rozwiązania do rozwiązania optymalnego jest jak najbardziej bliski zeru.
Istnieją inne algorytmy aproksymacyjne dla problemu plecakowego, które umożliwiają uzyskanie rozwiązania gwarantowanego w odległości k lub przy współczynniku ε optymalnej jakości rozwiązania. To znaczy, że rozwiązanie znalezione przez X jest takie, że lub . Złożoność czas z tych algorytmów jest na ogół funkcją odwrotności spodziewanej jakości; na przykład lub . Czas realizacji może być bardzo ważny.
Metody metaheurystyczne , takie jak algorytmy genetyczne lub optymalizacje oparte na algorytmach kolonii mrówek , pozwalają uzyskać rozsądne przybliżenie przy jednoczesnym uniknięciu monopolizacji zbyt wielu zasobów.
Algorytm genetycznyTe algorytmy genetyczne są często stosowane w trudnych problemów optymalizacyjnych jak plecak. Są stosunkowo łatwe w realizacji i pozwalają na szybkie uzyskanie satysfakcjonującego rozwiązania, nawet jeśli problem jest duży.
Tworzymy populację osób, których chromosomy symbolizują rozwiązanie problemu. Reprezentacja osoby jest binarna, ponieważ każdy przedmiot zostanie zatrzymany lub usunięty z torby. Liczba bitów w genomie każdego osobnika odpowiada liczbie dostępnych obiektów.
Optymalizacja przebiega zgodnie ze zwykłymi zasadami algorytmu genetycznego. Osobniki są oceniane, a następnie wybierane do reprodukcji najlepsze. Zgodnie z obranym przebiegiem operatory reprodukcji mogą być mniej lub bardziej złożone (cross-over), mogą również wystąpić mutacje (zamiana 0 na 1 lub odwrotnie). Możemy też zdecydować się na skopiowanie najlepszego osobnika dla następnego pokolenia (elitaryzm). Po określonej liczbie pokoleń populacja dąży do optymalnego, a nawet dokładnego rozwiązania.
Algorytmy oparte na koloniach mrówekKoncepcja ta została wykorzystana do rozwiązania problemu wielowymiarowego plecaka, w którym musi być spełnionych kilka ograniczeń. Pierwsze algorytmy opierały się na idei algorytmu zachłannego: mrówki stopniowo wybierały najciekawsze obiekty. Ten dobór może się różnić, ale zawsze opiera się na śladach feromonów osadzonych przez mrówki, które warunkują kolejne wybory. Wśród proponowanych rozwiązań można wymienić osadzanie feromonów na najlepszych obiektach, osadzanie się na parach obiektów wstawianych jeden po drugim w roztworze czy też dodawanie feromonów na pary obiektów, niezależnie od kolejności wstawiania.
Synteza przeprowadzona przez badaczy tunezyjskich i francuskich wykazała, że algorytm pozostawiania śladów na parach kolejno wybranych obiektów jest mniej skuteczny niż warianty skupiające się na obiekcie lub dowolnych parach. Jednak ulepszenia są nadal możliwe, ponieważ algorytmy te można łączyć z innymi metaheurystykami w celu uzyskania optymalnego rozwiązania.
Problem plecaka w jego klasycznej wersji został dogłębnie zbadany. Obecnie istnieje wiele metod rozwiązania tego problemu. Większość z tych metod to ulepszona wersja jednej z poniższych metod.
Problem plecaka ma właściwość optymalnej podkonstrukcji , to znaczy, że możemy zbudować optymalne rozwiązanie problemu ze zmiennymi i z zadania ze zmiennymi i -1 . Użyj tej właściwości, aby użyć dynamicznej programowej metody rozstrzygania .
Oznaczymy przez KP ( i , c ) problem zredukowany do i zmiennych i pojemności c . Pomysł jest następujący:
Biorąc pod uwagę zmienną i oraz pojemność c , optymalnymi rozwiązaniami KP ( i , c ) są:
Problem plecaka o zmiennej zerowej ( KP (0, *) ) ma optymalne rozwiązanie o wartości zerowej.
Następnie konstruujemy tablicę T [i, c] zawierającą wartości optymalnych rozwiązań dowolnego problemu KP ( i , c ) w następujący sposób:
pour c de 0 à W faire T[0,c] := 0 fin pour pour i de 1 à n faire pour c de 0 à W faire si c>=w[i] alors T[i,c] := max(T[i-1,c], T[i-1, c-w[i]] + p[i]) sinon T[i,c] := T[i-1,c] fin si fin pour fin pourPo skonstruowaniu tabeli wszystko, co musisz zrobić, to zacząć od pudełka T [n, W] i wydedukować stan obiektów, przechodząc do pudełka T [0, *].
Pojemność worka | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Pudła | Wartość worka | ||||||||||||||||
Wartość | Waga | ||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 2 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 5 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
3 | 7 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 5 | 5 | 6 | 6 |
7 | 12 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 7 | 7 | 8 | 8 |
10 | 9 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 10 | 10 | 11 | 11 | 11 | 12 | 12 |
Algorytm ten ma czasową i przestrzenną złożoność w O ( nW ) . Jednak dodając algorytm dziel i zwyciężaj , możemy zmniejszyć zużycie pamięci do O ( n + W ) , a nawet, jeśli ważna jest tylko wartość rozwiązania optymalnego, do O ( W ) . Ma dwie zalety:
i wada:
Zauważ, że ten algorytm nie działa w czasie wielomianowym w odniesieniu do rozmiaru danych wejściowych. Rzeczywiście, złożoność jest proporcjonalna do pojemności worka W , jest wykładnicza w odniesieniu do jego kodowania. Jeśli wagi przedmiotów są dziesiętne , wymusza to pomnożenie wagi przedmiotów i pojemności torby, aby uzyskać całość. Ta operacja może następnie spowolnić działanie algorytmu.
To podejście pochodzi od Garfinkela i Nemhausera (1972).
Jak każdy problem kombinatoryczny, problem plecaka można rozwiązać za pomocą procedury separacji i oceny (PSE). Funkcja oceny węzeł składa się często w rozwiązaniu problemu w zmiennych ciągłych (patrz poniżej). Wdrożenie zaproponowane przez Martello i Totha (1990) stało się punktem odniesienia. Wyróżnia się:
Zaletą tej metody jest niskie zużycie pamięci .
Podejście hybrydowe nie jest tak naprawdę nową metodą rozwiązywania. Polega po prostu na połączeniu dwóch poprzednich metod w celu uzyskania wszystkich korzyści. Zazwyczaj zastosujemy PSE do głębokości wyszukiwania, przy której podproblem zostanie oceniony jako wystarczająco mały, aby można go było rozwiązać za pomocą programowania dynamicznego.
Prekursorami tego podejścia są Plateau i Elkihel (1985), a następnie Martello i Toth (1990). Od tego czasu wprowadzono inne ulepszenia.
Przedstawiony dotychczas problem to, dokładniej, problem plecaka ze zmienną binarną ( 01KP ). W rzeczywistości jest to jedna z wielu odmian. Ta sekcja przedstawia te różne warianty. Szczegóły dotyczą dziedziny zmiennych, liczby wartości przedmiotów, liczby wymiarów torby itp. Te funkcje można również łączyć.
Problem plecaka ze zmienną ciągłą ( LKP ) osiąga się poprzez usunięcie ograniczenia integralności zmiennych. To znaczy, że ktoś jest upoważniony do podjęcia tylko część obiektów w plecaku: . LKP należy do klasy P złożoności .
Oto algorytm obliczania optymalnego rozwiązania problemu LKP :
trier les objets en ordre décroissant d'efficacité i := 1 w_dispo := W tant que w_dispo >= w[i] faire x[i] := 1 w_dispo := w_dispo - w[i] i := i + 1 fin tant que x[i] := w_dispo / w[i] tant que i < n faire i := i + 1 x[i] := 0 fin tant queNależy zauważyć, że wartość optymalnego rozwiązania LKP jest co najwyżej równa dwukrotności wartości optymalnego rozwiązania odpowiedniego problemu KP :
W przypadku problemu plecaka ze zmiennymi całkowitymi rozważamy, że mamy kilka kopii każdego obiektu. Problem polega zatem na znalezieniu liczby kopii do wykonania dla każdego.
Jeśli liczba kopii jest ograniczona, będziemy mówić o plecaku w oprawie ( BKP ), w przeciwnym razie o plecaku bez ograniczeń ( UKP ). Problem BKP można bez trudu przekształcić w 01KP .
Uważamy tutaj, że plecak ma wymiary d , gdzie d > 0 ( d-KP ). Na przykład możemy sobie wyobrazić pudełko. Każdy obiekt ma trzy wymiary i nie powinien przenikać do żadnego z wymiarów. Następnie ograniczenie (1) zastępuje się:
Praktyczne użycieW praktyce wersja wielowymiarowa może służyć do modelowania i rozwiązywania problemu napełnienia pojemnika, którego objętość i maksymalne obciążenie są ograniczone.
Innym przykładem jest zarządzanie personelem. W wersji uproszczonej oceniamy produktywność lub kompetencje każdej osoby (jego „wagę” w problemie) i przypisujemy mu inne zmienne: koszt i dyspozycyjność. Każdy z tych parametrów określa wymiar plecaka. Na koniec określasz ograniczenia związane z Twoim projektem w odniesieniu do poprzednich parametrów: dostępny budżet i czas przeznaczony na wykonanie prac. Uchwała pozwala określić, kto powinien zostać zatrzymany do realizacji projektu.
Wariant problemu polega na tym, że z obiektów posiadających kilka wartości, aby zmaksymalizować kilka funkcji celu, jest to problem plecaka wielocelowego ( MOKP ). W związku z tym wkraczamy w obszar optymalizacji wielocelowej .
Na przykład załóżmy, że zaczynamy firmę specjalizującą się w rejsach wycieczkowych . Aby dać się poznać, postanawiamy zaprosić znane osoby na pokład najpiękniejszej łodzi . Ta łódź nie może pomieścić więcej niż tonę pasażerów (będzie to stałe W ). Każdy pasażer ma masę ( w i ), rozgłos swoją popularnością ( s1
i : indeks popularności) i prosi o wynagrodzenie ( s2
i : wynagrodzenie ujemne). Naturalnie staramy się zmaksymalizować dostarczaną reklamę i zminimalizować całkowitą pensję do wypłaty (zmaksymalizować ujemną pensję). Ponadto chcemy, aby na łodzi znajdowało się jak najwięcej osób ( s3
i= 1). Dlatego należy zmaksymalizować trzy kwoty.
W kategoriach matematycznych szukamy wektora X znanych osób spełniających problem:
pod ograniczeniami
: łódź nie może tonąć.Ogólnie rzecz biorąc, zastępujemy funkcję celu w pierwotnym problemie rodziną funkcji celu:
Problem z plecakiem kwadratowym jest oznaczony przez QKP . Tutaj mamy dodatkowe wzmocnienie g ij, gdy dwa obiekty ( i i j ) są brane jednocześnie. Na przykład załóżmy, że chcemy zmaksymalizować jakość kawy podczas wyprawy z plecakiem. Możemy zrozumieć, że bardziej interesujące jest przyniesienie łyżki i cukru niż tylko jednego z nich.
Następnie zapisujemy funkcję celu:
Specyfika problemu sumy podzbiorów (w języku angielskim: suma podzbiorów ) polega na tym, że wartość i waga obiektów są identyczne ( p i = w i ). Jest to ważny problem z zakresu kryptografii , stosowany w kilku systemach generowania kluczy publicznych .
W przypadku problemu z plecakiem wielokrotnego wyboru ( MCKP ) obiekty są pogrupowane w klasy, a dla każdej klasy należy wziąć tylko jednego przedstawiciela.
Na przykład jesteśmy w trakcie tworzenia Twojego zestawu narzędzi . Jeśli masz pięć kluczy nastawnych , możesz wybrać najlżejszy, aby wziąć potężny młotek , lub wybrać najmocniejszy klucz i młotek z niższej półki, albo pójść na kompromis. Ogólna idea jest taka, że nie możesz wziąć więcej niż jednego klucza ani więcej niż jednego młotka.
Jeśli obiekty są ułożone w k klas, oznaczymy zbiór indeksów obiektów należących do klasy j . Uważamy oczywiście, że obiekt należy tylko do jednej klasy. Sformułowanie problemu wygląda następująco:
pod ograniczeniami:
Problem z wieloma plecakami ( MKP ) polega na podzieleniu zestawu przedmiotów na wiele plecaków o różnej pojemności. Wartość przedmiotu zależy teraz od worka, w którym został umieszczony. Na przykład możemy uznać, że euro ma większą wartość na rachunku oszczędnościowym niż na rachunku bieżącym .
Jeśli mamy k plecaków, zanotujemy, czy przedmiot i jest umieszczony w torbie j . Sformułowanie problemu wygląda następująco:
pod ograniczeniami
Istnieje wariant tego problemu, w którym wszystkie torby mają taką samą pojemność, zaznaczono MKP-I .
(en) Hans Kellerer, Ulright Pferschy i David Pisinger, Knapsack Problems , Springer, 2004 ( ISBN 3-540-40286-1 ) .