【问题标题】:R: Distributing an amount as evenly as possible IIR:尽可能均匀地分配数量 II
【发布时间】:2012-07-02 14:03:18
【问题描述】:

我们有一定数量,例如300个单位。该数量应尽可能均匀地分布在 40 个“槽”或“箱”上。如果每个插槽都相同,那将很容易-因此每个插槽将是 7,5。但是,插槽的大小各不相同,我们不能“填充”超过其“大小”允许的范围,例如如果只有 4 个。我们不能“填写”超过 4 个。因此,我们必须分配更多。

让我们假设还有另一个限制:一般填写限制,例如5. 这意味着即使我们在插槽中有足够的大小来填充比如 12 并且剩余的单元足够多比如 11,我们也只能填充 5。在所有插槽被填充后多余的值应该放在一个单独的剩余插槽。 在每个填充过程中,我们还应该得到一个数字,即使用了多少百分比的最大填充容量。 IE。如果我们填写4和5是一般的填写限制。我们使用了 80%。

我们之前已经在另一个问题中讨论过这个问题: Distributing an amount as evenly as possible

我有一些想法如何进一步发展这个公式,但部分它仍然卡住了。 感谢您的帮助!

# 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)

【问题讨论】:

    标签: r while-loop distribution max min


    【解决方案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)
    

    【讨论】:

    • 感谢您的回答。我现在正在移动,没有可用的 r。看起来很合理,但是您将如何管理它以获取我们填写的单独向量中的百分比数字?谢谢!
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多