2017-10-16 151 views
-1

我一直在試圖制定一個簡單的揹包問題,但我看不出爲什麼它不起作用。R中的揹包0-1

i <- c(1,2,3,4) 
v <- c(100,80,10,120) 
w <- c(10,5,10,4) 
k <- 15 

F <- function(i,k){ 
    if (i==0 | k==0){ 
    output <- 0 
    } else if (k<w[i]){ 
    output <- F(i-1,w) 
    } else { 
    output <- max(v[i]+ F(i-1, k-w[i]), F(i-1,k)) 
    } 
    return(output) 
} 

回答

0

在看看包裝慢板的knapsack功能應該可以幫助你,在這裏w是權重向量,p利潤的載體和cap是你k。 (見?knapsack

knapsack <- 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) 
    for (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) 
    } 
    fmax <- G[cap + 1, 1] 
    f <- fmax 
    j <- cap + 1 
    for (k in n:1) { 
     if (F[j, k] < f) { 
      x[k] <- TRUE 
      j <- j - w[k] 
      f <- F[j, k] 
     } 
    } 
    inds <- which(x) 
    wght <- sum(w[inds]) 
    prof <- sum(p[inds]) 
    return(list(capacity = wght, profit = prof, indices = inds)) 
} 

然而,在你的函數的問題似乎是

  1. 你沒有申報在你的函數(wv)所使用的所有對象:你也應該申報他們作爲你的函數的參數。

  2. F這是您的函數的名稱在您的函數內部調用。因此,由於(i==0 | k==0)永遠不會成立,函數永遠不會停止處理。