when run
weights <- 1:50 profits <- 1:50 library(adagio) knapsack(w = weights, p = profits, cap = 30) i error
error in f[, k] <- g : number of items replace not multiple of replacement length in addition: warning message: in pmax(g, h) : argument fractionally recycled but when run smaller sized vectors, like
weights <- 1:20 profits <- 1:20 knapsack(w = weights, p = profits, cap = 30) it runs fine. knapsack() slow down (and prevent running) larger sets? i'm looking use lengths in thousands eventually.
this issue passing elements weight exceeding total capacity. see issue, let's @ first few lines of knapsack function:
function (w, p, cap) { n <- length(w) x <- logical(n) f <- matrix(0, nrow = cap + 1, ncol = n) g <- matrix(0, nrow = cap + 1, ncol = 1) (k in 1:n) { f[, k] <- g h <- c(numeric(w[k]), g[1:(cap + 1 - w[k]), 1] + p[k]) g <- pmax(g, h) } when iteratively filling f matrix 1 column @ time, algorithm creates vector h following command (and computing pmax(g, h)):
h <- c(numeric(w[k]), g[1:(cap + 1 - w[k]), 1] + p[k]) numeric(w[k]) has length w[k], , when w[k] <= cap, g[1:(cap + 1 - w[k]), 1] + p[k] has length cap + 1 - w[k], meaning entire vector h has length cap+1, matching size of g. on other hand, when w[k] == cap + 1 end h vector of size cap+2, doesn't match size of g , gives trouble, , w[k] > cap + 1 error mixing positive , negative indices.
getting example function call, have weights 50 capacity of 30, yielding error:
weights <- 1:50 profits <- 1:50 knapsack(w = weights, p = profits, cap = 30) # error in f[, k] <- g : # number of items replace not multiple of replacement length # in addition: warning message: # in pmax(g, h) : argument fractionally recycled however when limit elements weight not exceeding capacity, no errors:
knapsack(w = weights[weights <= 30], p = profits[weights <= 30], cap = 30) # $capacity # [1] 30 # # $profit # [1] 30 # # $indices # [1] 1 2 3 4 5 7 8 it ideal if knapsack function gracefully removed object weight exceeding capacity (since no such elements ever used in feasible solution) , gave solution code posted, workaround remove them input knapsack function.
Comments
Post a Comment