0/1 Knapsekkproblemfiks ved hjelp av dynamisk programmeringseksempel
Hva er ryggsekkproblemet?
Rullesekk problem Algoritme er et svรฆrt nyttig problem i kombinatorikk. I supermarkedet er det n pakker (n โค 100) pakken i har vekt W[i] โค 100 og verdi V[i] โค 100. En tyv bryter seg inn i supermarkedet, tyven kan ikke bรฆre vekt som overstiger M (M โค 100 ). Problemet som skal lรธses her er: hvilke pakker vil tyven ta for รฅ fรฅ hรธyest verdi?
Inngang:
- Maksimal vekt M og antall pakker n.
- Array av vekt W[i] og tilsvarende verdi V[i].
Utgang:
- Maksimer verdi og tilsvarende vekt i kapasitet.
- Hvilke pakker vil tyven ta med seg.
Ryggsekkalgoritmen kan videre deles inn i to typer:
- 0/1 Knapsack-problemet ved bruk av dynamisk programmering. I denne typen napsekkalgoritme kan hver pakke tas eller ikke tas. Dessuten kan ikke tyven ta en brรธkdel av en tatt pakke eller ta en pakke mer enn รฉn gang. Denne typen kan lรธses ved Dynamic Programming Approach.
- Fractional Napsack problem algoritme. Denne typen kan lรธses av Greedy Strategy.
Hvordan lรธse Knapsack-problem ved hjelp av dynamisk programmering med eksempel
I del-og-hersk-strategien deler du opp problemet som skal lรธses i delproblemer. Delproblemene er videre delt inn i mindre delproblemer. Den oppgaven vil fortsette til du fรฅr delproblemer som enkelt kan lรธses. I prosessen med en slik deling kan du imidlertid stรธte pรฅ det samme problemet mange ganger.
Den grunnleggende ideen med Knapsack dynamisk programmering er รฅ bruke en tabell for รฅ lagre lรธsningene av lรธste delproblemer. Stรฅr du overfor et delproblem igjen, trenger du bare รฅ ta lรธsningen i tabellen uten รฅ mรฅtte lรธse det pรฅ nytt. Derfor er algoritmene designet av dynamisk programmering svรฆrt effektive.
For รฅ lรธse et problem ved dynamisk programmering, mรฅ du gjรธre fรธlgende oppgaver:
- Finn lรธsninger pรฅ de minste delproblemene.
- Finn ut formelen (eller regelen) for รฅ bygge en lรธsning av delproblem gjennom lรธsninger av selv de minste delproblemer.
- Lag en tabell som lagrer lรธsningene til delproblemer. Regn deretter ut lรธsningen av delproblemet i henhold til den funnet formelen og lagre i tabellen.
- Fra de lรธste deloppgavene finner du lรธsningen pรฅ det opprinnelige problemet.
Analyser 0/1 ryggsekkproblemet
Nรฅr du analyserer 0/1 Knapsack-problem ved hjelp av dynamisk programmering, kan du finne noen merkbare punkter. Verdien av ryggsekkalgoritmen avhenger av to faktorer:
- Hvor mange pakker vurderes
- Den gjenvรฆrende vekten som ryggsekken kan lagre.
Derfor har du to variable mengder.
Med dynamisk programmering har du nyttig informasjon:
- objektivfunksjonen vil avhenge av to variable stรธrrelser
- tabellen over alternativer vil vรฆre en 2-dimensjonal tabell.
Hvis รฅ ringe B[i][j] er den maksimalt mulige verdien ved รฅ velge i pakkene {1, 2, โฆ, i} med vektgrense j.
- Den maksimale verdien nรฅr valgt i n pakker med vektgrensen M er B[n][M]. Med andre ord: Nรฅr det er i-pakker รฅ velge, er B[i][j] den optimale vekten nรฅr ryggsekkens maksimale vekt er j.
- Den optimale vekten er alltid mindre enn eller lik maksimalvekten: B[i][j] โค j.
For eksempel: B[4][10] = 8. Det betyr at i det optimale tilfellet er totalvekten pรฅ de valgte pakkene 8, nรฅr det er 4 fรธrste pakker รฅ velge mellom (1. til 4. pakke) og maksimal vekt av ryggsekken er 10. Det er ikke nรธdvendig at alle 4 varene velges.
Formel for รฅ beregne B[i][j]
Inndata, du definerer:
- W[i], V[i] er igjen vekten og verdien av pakke i, der i
{1, โฆ, n}.
- M er den maksimale vekten ryggsekken kan bรฆre.
I tilfelle du bare har 1 pakke รฅ velge. Du beregner B[1][j] for hver j: som betyr at ryggsekkens maksimale vekt โฅ vekten av den fรธrste pakken
B[1][j] = W[1]
Med vektgrensen j vil de optimale valgene blant pakkene {1, 2, โฆ, i โ 1, i} for รฅ ha den stรธrste verdien ha to muligheter:
- Hvis pakke i ikke er valgt, er B[i][j] den maksimalt mulige verdien ved รฅ velge blant pakkene {1, 2, โฆ, i โ 1} med vektgrense pรฅ j. Du har:
B[i][j] = B[i โ 1][j]
- Hvis pakke i er valgt (selvfรธlgelig vurdere kun dette tilfellet nรฅr W[i] โค j) sรฅ er B[i][j] lik verdien V[i] til pakke i pluss den maksimale verdien kan oppnรฅs ved รฅ velge blant pakker {1, 2, โฆ, i โ 1} med vektgrense (j โ W[i]). Det vil si nรฅr det gjelder verdien du har:
B[i][j] = V[i] + B[i โ 1][j โ W[i]]
Pรฅ grunn av opprettelsen av B[i][j], som er den maksimalt mulige verdien, vil B[i][j] vรฆre maks av de 2 verdiene ovenfor.
Grunnlag for dynamisk programmering
Sรฅ du mรฅ vurdere om det er bedre รฅ velge pakke i eller ikke. Derfra har du den rekursive formelen som fรธlger:
B[i][j]= max(B[i โ 1][j], V[i]+B[i โ 1][j โ W[i]]
Det er lett รฅ se B[0][j] = maksimal verdi ved รฅ velge fra 0 pakke = 0.
Beregn alternativtabellen
Du bygger en tabell med alternativer basert pรฅ den rekursive formelen ovenfor. For รฅ sjekke om resultatene er korrekte (hvis ikke nรธyaktig, bygger du om objektivfunksjonen B[i][j]). Gjennom opprettelsen av objektivfunksjonen B[i][j] og tabellen med alternativer, vil du orientere sporingen.
Tabell over alternativer B inkluderer n + 1 linjer, M + 1 kolonner,
- For det fรธrste fylt med grunnlaget for dynamisk programmering: Linje 0 inkluderer alle nuller.
- Bruk rekursive formler, bruk linje 0 til รฅ beregne linje 1, bruk linje 1 til รฅ beregne linje 2, osv. โฆ til alle linjene er beregnet.

Trace
Nรฅr du beregner tabellen med alternativer, er du interessert i B[n][M] som er den maksimale verdien som oppnรฅs nรฅr du velger i alle n pakker med vektgrensen M.
- If B[n][M] = B[n โ 1][M] da er ikke pakke n valgt, du sporer B[n โ 1][M].
- If B[n][M] โ B[n โ 1][M], merker du at det optimale utvalget har pakken n og spor B[n โ 1][M โ W[n]].
Fortsett รฅ spore til du nรฅr rad 0 i tabellen med alternativer.
Algoritme for รฅ slรฅ opp alternativtabellen for รฅ finne de valgte pakkene
Merk: Hvis B[i][j] = B[i โ 1][j], er ikke pakken i valgt. B[n][W] er den optimale totale verdien av pakken lagt i ryggsekken.
Trinn for sporing:
- Trinn 1: Starter fra i = n, j = M.
- Trinn 2: Se i kolonne j, opp fra bunnen, finner du linjen i slik at B[i][j] > B[i โ 1][j]. Merk valgt pakke i: Velg [i] = sant;
- Trinn 3: j = B[i][j] โ W[i]. Hvis j > 0, gรฅ til trinn 2, ellers gรฅ til trinn 4
- Trinn 4: Basert pรฅ tabellen med alternativer for รฅ skrive ut de valgte pakkene.
Java Kode
public void knapsackDyProg(int W[], int V[], int M, int n) {
int B[][] = new int[n + 1][M + 1];
for (int i=0; i<=n; i++)
for (int j=0; j<=M; j++) {
B[i][j] = 0;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= M; j++) {
B[i][j] = B[i - 1][j];
if ((j >= W[i-1]) && (B[i][j] < B[i - 1][j - W[i - 1]] + V[i - 1])) {
B[i][j] = B[i - 1][j - W[i - 1]] + V[i - 1];
}
System.out.print(B[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("Max Value:\t" + B[n][M]);
System.out.println("Selected Packs: ");
while (n != 0) {
if (B[n][M] != B[n - 1][M]) {
System.out.println("\tPackage " + n + " with W = " + W[n - 1] + " and Value = " + V[n - 1]);
M = M - W[n-1];
}
n--;
}
}
Forklaring av ryggsekkkode:
- Lag tabell B[][]. Angi standardverdi for hver celle er 0.
- Bygg tabell B[][] nedenfra og opp. Beregn tabellen med alternativer med gjenfinningsformelen.
- Regn ut B[i][j]. Hvis du ikke velger pakke i.
- Evaluer deretter: hvis du velger pakke i, vil det vรฆre mer fordelaktig enn รฅ tilbakestille B[i][j].
- Spor tabellen fra rad n til rad 0.
- Hvis du velger pakke n. Nรฅr du har valgt pakke n, kan du bare legge til vekt M โ W[n โ 1].
I denne opplรฆringen har du to eksempler. Her er java-kode for รฅ kjรธre programmet ovenfor med to eksempler:
public void run() {
/*
* Pack and Weight - Value
*/
//int W[] = new int[]{3, 4, 5, 9, 4};
int W[] = new int[]{12, 2, 1, 1, 4};
//int V[] = new int[]{3, 4, 4, 10, 4};
int V[] = new int[]{4, 2, 1, 2, 10};
/*
* Max Weight
*/
//int M = 11;
int M = 15;
int n = V.length;
/*
* Run the algorithm
*/
knapsackDyProg(W, V, M, n);
}
Du har utgangen:
- Fรธrste eksempel:
0 0 0 3 3 3 3 3 3 3 3 3 0 0 0 3 4 4 4 7 7 7 7 7 0 0 0 3 4 4 4 7 7 8 8 8 0 0 0 3 4 4 4 7 7 10 10 10 0 0 0 3 4 4 4 7 8 10 10 11 Max Value: 11 Selected Packs: Package 5 with W = 4 and Value = 4 Package 2 with W = 4 and Value = 4 Package 1 with W = 3 and Value = 3
- Andre eksempel:
0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 2 2 2 2 2 2 2 2 2 2 4 4 6 6 0 1 2 3 3 3 3 3 3 3 3 3 4 5 6 7 0 2 3 4 5 5 5 5 5 5 5 5 5 6 7 8 0 2 3 4 10 12 13 14 15 15 15 15 15 15 15 15 Max Value: 15 Selected Packs: Package 5 with W = 4 and Value = 10 Package 4 with W = 1 and Value = 2 Package 3 with W = 1 and Value = 1 Package 2 with W = 2 and Value = 2

