Skip to content

Commit

Permalink
add binary knapsack problem with tabular method
Browse files Browse the repository at this point in the history
  • Loading branch information
haalmarc committed Nov 22, 2020
1 parent 47aae5d commit d849932
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -730,6 +730,30 @@ Ved bruk av memoisering, altså dynamisk programmering, har LCS en kjøretid på

### Ryggsekkproblemet (0-1 knapsack)
<!-- [F9] Forstå løsningen på det binære ryggsekkproblemet (se appendiks D i pensumhefte) (Knapsack, Knapsack') -->
Ryggsekkproblemet handler om å finne maks verdi man kan ha i en begrenset kapasitet. Det binære ryggsekkproblemet er en variasjon hvor man enten kan legge til en ting eller ikke (til forskjell for det kontinuerlige ryggsekkproblemet, som kan løses grådig).

Benyttes en brute-force metode på det binære ryggsekkproblemet, får løsningen en eksponensiell kjøretid. Løses det med dynamisk programmering, får derimoten løsningen en kjøretid på O(n * w). n er her antall ting å velge blant og w er deres ryggsekkens vektskapasitet.

Ryggsekkproblemet kan løses på lignende måte som LCS-problemet; ved bruk av en tabell. For hver rad tar man kun hensyn til radene over.

| | | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|:-: |:-: |:-: |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| **Pi**| **Wi**| **0** | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| **1** | **2** | **1** | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| **2** | **3** | **2** | 0 | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| **5** | **4** | **3** | 0 | 0 | 1 | 2 | 5 | 5 | 6 | 7 | 7 |
| **6** | **5** | **4** | 0 | 0 | 1 | 2 | 5 | 6 | 6 | 7 | 8 |

0. Tabellen initieres med 0 verdier i kolonne 0 og rad 0, siden ingen ting er valgt ennå, og har dermed ingen verdi.
1. I rad 1 vurderes første ting, som har en vekt på 2. Først ved kolonne 2 legges inn tingen, som har en verdi på 1. Ingen flere ting kan velges for denne kolonnen, siden det for denne raden kun er en ting tilgjengelig.
2. I rad 2 gjentas gjentas kolonnene man fant frem til første verdi, her 1. Ting 2 kan man først legge inn i kolonne 3 (vekt på 3), og legger inn verdi 2. Med rad 2, har man to ting tilgjengelig og kan også velge å putte inn ting 1. Ting 1 har en vekt på 2, og kan legges inn på 5 (3+2).
3. I rad 3 har man en ting på vekt 4. Vi legger inn dens verdi på kolonne 4, altså verdien 5. Kolonnene før beholder sin verdi. Ting 3 kan kombineres med ting 1, og får en vekt på 6 med verdi 6. Ting 3 kan kombineres med ting 2 og får en vekt på 7 med verdi 7. Ting 3 kan ikke kombineres med ting 1 og 2 da det overstiger kapasiteten på 8. I vekt 5 legges inn 5; det som er maks av det over og til venstre.
4. I rad 4 har man ting4 på vekt 5, og verdien 6 legges inn. Ting4 kombineres med ting1 til en vekt på 7 med verdi 7. Ting4 kombineres med ting2 til en vekt på 8 med verdi 8.
5. Nå er alle tingene gjennomgått, og vi ønsker å finne hvilke ting som ble valgt.
5a. Vi starter nederst til høyre, og finner maks på 8. Tallet 8 er ikke funnet i andre rader, så ting4 skal være med i maksfunnet. 0001.
5b. Ting4 har verdi på 6. Maksverdi er 8. Det gjenstår å finne ting på verdi 2 (8-6). Første gang verdien 2 vises er i rad 2. Det betyr at ting2 skal være med. 0101.

Vi har nå funnet tingene som skal være med i ryggsekken for å gi mest mulig verdi.

## Grådige algoritmer
<!-- ![G1] Forstå designmetoden grådighet -->
Expand Down

0 comments on commit d849932

Please sign in to comment.