2012-07-02 27 views
1

我们有一定的金额,例如300个单位。这个数量应该尽可能均匀地分布在40个“槽”或“箱”上。如果每个插槽都是相同的 - 那么每个插槽的容量应该是7.5。然而,这些插槽的大小各不相同,我们不能“填充”那里的尺寸超过其“尺寸”允许的尺寸。如果它只有4.我们不能“填补”超过4.因此,我们必须分配更多的其他。R:尽可能均匀地分配金额II

让我们假设还有另一个限制:例如, 5.这意味着即使我们有足够的空位来填充插槽12并且剩下足够的空位11,我们也只能填充5。在所有插槽填满后超出的值应该放在一个分开的位置剩余时间。 随着每个灌装过程中,我们也应该得到一个数字,使用百分之多少的最大灌装量。即如果我们填写4和5是一般的填充限制。我们用了80%。

我们anohter问题前面已经讨论过这个: Distributing an amount as evenly as possible

我有一些想法如何做到进一步发展这一公式,但部分仍stucks。 感谢您的帮助!

# developing slots and their "size" 
a <- rnorm(40,10,4) 
sum(a) 

# overall sum to distribute 
b <- 300 
# general filling in limit 
c <- 8 

optimal.fill <- function(a, b) 
{ 
    stopifnot(sum(a) >= b) 

    d <- rep(0, length(a)) 
    info <- rep(0, length(a)) 
    while(b > 0) { 
    has.room <- a > 0 
    num.slots <- sum(has.room) 
    min.size <- min(a[has.room]) 
    add.size <- min(b/num.slots, min.size) 
    #maximum limitation 
    add.size[add.size>c] <- c 
    #percentage info 
    info[has.room] <- add.size/c 
    d[has.room] <- d[has.room] + add.size 
    a[has.room] <- a[has.room] - add.size 
    b <- b - num.slots * add.size 
    } 
    return(d) 
} 
optimal.fill(a,b) 

回答

1

这个怎么样

optimal.fill <- function(a, b, generalLimit = 8){ 
    a <- pmax(0, pmin(a, generalLimit)) 
    if(sum(a) < b){ 
    stop("not enough room") 
    } 
    if(length(a) * min(a) <= b){ 
    result <- rep(min(a), length(a)) 
    } else { 
    result <- rep(floor(b/length(a)), length(a)) 
    } 
    while(floor((b - sum(result))/sum(result < a)) >= 1){ 
    if(min(a[result < a]) * sum(result < a) <= b - sum(result)){ 
     result[result < a] <- 
     result[result < a] + rep(min(a[result < a]), sum(result < a)) 
    } else { 
     result[result < a] <- 
     result[result < a] + 
     rep(floor((b - sum(result))/sum(result < a)), sum(result < a)) 
    } 
    } 
    extra <- sample(which(result < a), (b - sum(result)), replace = FALSE) 
    result[extra] <- result[extra] + 1 
    return(cbind(result, result/a)) 
} 
optimal.fill(ceiling(rnorm(40,10,4)), 300, 8) 
+0

谢谢您的回答。我现在在移动,并没有可用的。看起来很合理,但是如何管理它以获取分离向量中的百分比数量以填充多少?谢谢! –

+0

我已经更新了代码。 – Thierry