我们有一定的数量,例如300 单位。该数量应尽可能均匀地分布在 40 个“槽”或“箱”中。如果每个槽都相同,那就很容易了 - 所以每个槽都是 7.5。然而,插槽的大小各不相同,我们不能“填充”超过其“大小”允许的范围,例如如果只有 4 个。我们不能“填写”超过 4 个。因此,我们必须在其他项上分配更多。
让我们假设还有另一个限制:一般填充限制,例如5. 这意味着即使我们的槽位有足够的大小来填充 12,并且还有足够的剩余单位(比如 11),我们也只能填充 5。所有槽位都填满后多余的值应该放在一个单独的值中。余数槽。
在每次填充过程中,我们还应该得到一个数字,即最大填充容量的使用百分比。 IE。如果我们填写4和5就是一般的填写限额。我们用了80%。
我们之前在另一个问题中已经讨论过这一点:尽可能均匀地分配数量
我有一些想法如何进一步发展这个公式,但部分仍然存在。
感谢您的帮助!
# 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)
这个怎么样
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)