Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
56
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-1.rkt
Normal file
56
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-1.rkt
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#lang racket
|
||||
; An ITEM a list of three elements:
|
||||
; a name, a weight, and, a value
|
||||
|
||||
; A SOLUTION to a knapsack01 problems is a list of three elements:
|
||||
; the total value, the total weight, and, names of the items to bag
|
||||
|
||||
(define (add i s) ; add an item i to the solution s
|
||||
(match-define (list in iw iv) i)
|
||||
(match-define (list v w is) s)
|
||||
(list (+ v iv) (+ w iw) (cons in is)))
|
||||
|
||||
(define (knapsack max-weight items)
|
||||
; return a solution to the knapsack01 problem
|
||||
(define ht (make-hash)) ; (weight number-of-items) -> items
|
||||
(define (get w no-items) (hash-ref ht (list w no-items) #f))
|
||||
(define (update w is x) (hash-set! ht (list w (length is)) is) x)
|
||||
(define (knapsack1 left items)
|
||||
; return a solution to the (left, items) problem
|
||||
(cond
|
||||
; if there are no items, then bag no items:
|
||||
[(empty? items) (list 0 0 '())]
|
||||
; look up the best solution:
|
||||
[(or (get left (length items))
|
||||
; the solution haven't been cached, so we
|
||||
; must compute it and update the cache:
|
||||
(update
|
||||
left items
|
||||
(match items
|
||||
; let us name the first item
|
||||
[(cons (and (list i w v) x) more)
|
||||
; if the first item weighs more than the space left,
|
||||
; we simply find a solution, where it is omitted:
|
||||
(cond [(> w left) (knapsack left more)]
|
||||
; there is room for the first item, but
|
||||
; we need to choose the best solutions
|
||||
; between those with it and that without:
|
||||
[else
|
||||
(define without (knapsack left more))
|
||||
(define value-without (first without))
|
||||
(define with (knapsack (- left w) more))
|
||||
(define value-with (+ (first with) v))
|
||||
; choose the solutions with greatest value
|
||||
(if (> value-without value-with)
|
||||
without
|
||||
(add x with))])])))]))
|
||||
(knapsack1 max-weight items))
|
||||
|
||||
(knapsack 400
|
||||
'((map 9 150) ; 9 is weight, 150 is value
|
||||
(compass 13 35) (water 153 200) (sandwich 50 160)
|
||||
(glucose 15 60) (tin 68 45)(banana 27 60) (apple 39 40)
|
||||
(cheese 23 30) (beer 52 10) (cream 11 70) (camera 32 30)
|
||||
(T-shirt 24 15) (trousers 48 10) (umbrella 73 40)
|
||||
(trousers 42 70) (overclothes 43 75) (notecase 22 80)
|
||||
(glasses 7 20) (towel 18 12) (socks 4 50) (book 30 10)))
|
||||
|
|
@ -0,0 +1 @@
|
|||
'(1030 396 (map compass water sandwich glucose banana cream trousers overclothes notecase glasses socks))
|
||||
33
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-3.rkt
Normal file
33
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-3.rkt
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#lang racket
|
||||
|
||||
(define items '((map 9 150) (compass 13 35) (water 153 200) (sandwich 50 160)
|
||||
(glucose 15 60) (tin 68 45)(banana 27 60) (apple 39 40)
|
||||
(cheese 23 30) (beer 52 10) (cream 11 70) (camera 32 30)
|
||||
(T-shirt 24 15) (trousers 48 10) (umbrella 73 40)
|
||||
(trousers 42 70) (overclothes 43 75) (notecase 22 80)
|
||||
(glasses 7 20) (towel 18 12) (socks 4 50) (book 30 10)))
|
||||
|
||||
(define max-weight 400)
|
||||
|
||||
(define (item-value item)
|
||||
(caddr item))
|
||||
|
||||
(define (item-weight item)
|
||||
(cadr item))
|
||||
|
||||
(define (pack-weight pack)
|
||||
(apply + (map item-weight pack)))
|
||||
|
||||
(define (pack-value pack)
|
||||
(apply + (map item-value pack)))
|
||||
|
||||
(define (max-pack-value pack-with pack-without max-weight)
|
||||
(if (and
|
||||
(not (> (pack-weight pack-with) max-weight))
|
||||
(> (pack-value pack-with) (pack-value pack-without)))
|
||||
pack-with pack-without))
|
||||
|
||||
(define (display-solution pack)
|
||||
(displayln (list 'weight: (pack-weight pack)
|
||||
'value: (pack-value pack)
|
||||
'items: (map car pack))))
|
||||
17
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-4.rkt
Normal file
17
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-4.rkt
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
(define (show-brute)
|
||||
|
||||
(define empty-accumulator '())
|
||||
|
||||
(define (knapsack-brute included items)
|
||||
(cond
|
||||
((null? items) included)
|
||||
(else
|
||||
(max-pack-value
|
||||
(knapsack-brute (cons (car items) included) (cdr items))
|
||||
(knapsack-brute included (cdr items))
|
||||
max-weight
|
||||
))))
|
||||
|
||||
(display-solution (reverse (knapsack-brute empty-accumulator items))))
|
||||
|
||||
(show-brute); takes around five seconds on my machine
|
||||
24
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-5.rkt
Normal file
24
Task/Knapsack-problem-0-1/Racket/knapsack-problem-0-1-5.rkt
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
(define (show-memoized)
|
||||
|
||||
(define (memoize func)
|
||||
(let ([result-ht (make-hash)])
|
||||
(lambda args ; this is the rest-id pattern
|
||||
(when (not (hash-has-key? result-ht args))
|
||||
(hash-set! result-ht args (apply func args)))
|
||||
(hash-ref result-ht args))))
|
||||
|
||||
(define knapsack
|
||||
(memoize
|
||||
(lambda (max-weight items)
|
||||
(cond
|
||||
((null? items) '())
|
||||
(else
|
||||
(let ([item (car items)] [items (cdr items)])
|
||||
(max-pack-value
|
||||
(cons item (knapsack (- max-weight (item-weight item)) items))
|
||||
(knapsack max-weight items)
|
||||
max-weight)))))))
|
||||
|
||||
(display-solution (knapsack max-weight items)))
|
||||
|
||||
(show-memoized)
|
||||
|
|
@ -0,0 +1 @@
|
|||
(weight: 396 value: 1030 items: (map compass water sandwich glucose banana cream trousers overclothes notecase glasses socks))
|
||||
Loading…
Add table
Add a link
Reference in a new issue