the Knapsack problem
Jag hittade Knapsack problem knepigt och intressant samtidigt. Jag är säker på om du besöker den här sidan, du redan vet problemet uttalande men bara för att slutföra :
Problem:
givet en ryggsäck med en maximal kapacitet på W och N objekt var och en med sitt eget värde och vikt, kasta in objekt inuti ryggsäcken så att det slutliga innehållet har det maximala värdet. Usch !!,
här är det allmänna sättet som problemet förklaras – överväga att en tjuv kommer in i ett hem att råna och han bär en ryggsäck. Det finns fast antal objekt i hemmet-var och en med sin egen vikt och värde – smycken, med mindre vikt och högsta värde vs tabeller, med mindre värde men mycket tung. För att lägga till bränsle i elden har tjuven en gammal ryggsäck som har begränsad kapacitet. Självklart kan han inte dela bordet i hälften eller smycken i 3 / 4ths., Han tar det eller lämnar det
exempel :
Knapsack Max weight : W = 10 (units)Total items : N = 4Values of items : v = {10, 40, 30, 50}Weight of items : w = {5, 4, 6, 3}
en snabb titt på exempeldata berättar att det högsta värdet som vi kunde rymma med gränsen för maxvikt på 10 är 50 + 40 = 90 med en vikt på 7.
tillvägagångssätt:
det sätt som detta är optimalt löst är att använda dynamisk programmeringslösning för mindre uppsättningar av ryggsäcksproblem och sedan expandera dem för det större problemet.,
låt oss bygga ett objekt x vikt array kallas V (värde array):
V = 4 rows * 10 columns
var och en av värdena i denna matris representerar en mindre ryggsäck problem.
basfall 1 : Låt oss ta fallet med 0: e kolumnen. Det betyder bara att ryggsäcken har 0 kapacitet. Vad kan du hålla i dem? Ingenting. Så, låt oss fylla dem alla med 0s.
basfall 2 : Låt oss ta fallet med 0 rad. Det betyder bara att det inte finns några föremål i huset. Vad håller du i din ryggsäck om det inte finns några föremål. Inget mer !!! Alla nollor.,
lösning:
1) Låt oss nu börja fylla i matrisraden. Vad betyder rad 1 och kolumn 1? Det med tanke på det första objektet (rad), kan du rymma det i ryggsäcken med kapacitet 1 (kolumn). Nepp. Vikten av det första objektet är 5. Så, låt oss fylla i 0. Faktum är att vi inte skulle kunna fylla i någonting förrän vi når kolumnen 5 (vikt 5).
2) när vi når kolumn 5 (som representerar vikt 5) på första raden betyder det att vi kan rymma punkt 1., Låt oss fylla i 10 där (kom ihåg, det här är ett värde array):
3) går vidare, för vikt 6 (kolumn 6), kan vi rymma något annat med den återstående vikten på 1 (viktvikt för detta objekt => 6 – 5). Kom ihåg att vi är på första föremålet. Så det är ganska intuitivt att resten av raden bara kommer att vara samma värde också eftersom vi inte kan lägga till något annat objekt för den extra vikt som vi har fått.,
4) så händer nästa intressanta sak när vi når kolumnen 4 i tredje raden. Den nuvarande körvikten är 4.
vi bör kontrollera följande fall.
1) kan vi rymma punkt 2 – Ja, det kan vi. Punkt 2s vikt är 4.
2) är värdet för den aktuella vikten högre utan punkt 2? – Kontrollera föregående rad för samma vikt. Nepp. föregående rad * har 0 i det, eftersom vi inte kunde rymma objekt 1 i vikt 4.
3) kan vi rymma två objekt i samma vikt så att vi kan maximera värdet? – Nej., Den återstående vikten efter avdrag för objektets vikt är 0.
varför föregående rad?
helt enkelt för att föregående rad vid vikt 4 i sig är en mindre ryggsäck lösning som ger det högsta värdet som kan ackumuleras för den vikten fram till den punkten (korsning genom objekten).,
exemplifierande,
1) värdet av det aktuella objektet = 40
2) vikten av det aktuella objektet = 4
3) vikten som lämnas över = 4 – 4 = 0
4) Kontrollera raden ovan (objektet ovan vid punkt 1 eller det kumulativa maxvärdet vid resten av raderna). För den återstående vikten 0, kan vi rymma punkt 1? Enkelt uttryckt, finns det något värde alls i raden ovan för den givna vikten?,
beräkningen går så :
1) Ta maxvärdet för samma vikt utan det här objektet:
previous row, same weight = 0=> V
2) Ta värdet av det aktuella objektet + värde som vi kunde rymma med den återstående vikten:
Max bland de två är 40 (0 och 40).
3) Nästa och viktigaste händelsen händer i kolumn 9 och rad 2. Vilket innebär att vi har en vikt på 9 och vi har två objekt. Om man tittar på exempeldata kunde vi rymma de två första punkterna., Här anser vi några saker:
- värdet på det aktuella objektet = 40
- vikten av det aktuella objektet = 4
- vikten som lämnas över = 9 – 4 = 5
- kontrollera raden ovan. Vid återstående vikt 5, kan vi rymma punkt 1.
så är beräkningen :
1) Ta maxvärdet för samma vikt utan det här objektet:
previous row, same weight = 10
2) Ta värdet på det aktuella objektet + värde som vi kunde ackumulera med den återstående vikten:
Value of current item (40)+ value in previous row with weight 5 (total weight until now (9) - weight of the current item (4))= 10
Value of current item (40)+ value in previous row with weight 5 (total weight until now (9) - weight of the current item (4))= 10
10 vs 50 = 50.,
i slutet av att lösa alla dessa mindre problem behöver vi bara returnera värdet vid V – Item 4 vid Vikt 10:
komplexitet
analysera komplexiteten i lösningen är ganska rakt framåt. Vi har bara en slinga för W inom en slinga av N => O (NW)
implementering:
Här kommer den obligatoriska implementeringskoden i Java: