R 尽可能均匀地分配数量

R 尽可能均匀地分配数量,r,distribution,minimum,evenly,R,Distribution,Minimum,Evenly,我们有一定数量,例如300件。该数量应尽可能均匀地分布在40个“槽”上。如果每个插槽都是相同的,那就很容易了——因此每个插槽都是7,5。然而,插槽大小不同,我们不能在其“大小”允许的范围内“填充”,例如,如果其仅为5。我们不能“填充”的东西,我们必须比其他东西分配更多 我有一些基本的想法,但我远不是一个专家,我希望有一个简单的方法来解决这个问题。 举个例子,这是什么样子的。在数组“a”中,这些值代表插槽可以接受的最大值。a[i]是第i个插槽的最大值。“b”是指我们必须全部分发的内容,例如300

我们有一定数量,例如300件。该数量应尽可能均匀地分布在40个“槽”上。如果每个插槽都是相同的,那就很容易了——因此每个插槽都是7,5。然而,插槽大小不同,我们不能在其“大小”允许的范围内“填充”,例如,如果其仅为5。我们不能“填充”的东西,我们必须比其他东西分配更多

我有一些基本的想法,但我远不是一个专家,我希望有一个简单的方法来解决这个问题。 举个例子,这是什么样子的。在数组“a”中,这些值代表插槽可以接受的最大值。a[i]是第i个插槽的最大值。“b”是指我们必须全部分发的内容,例如300

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

 # overall sum to distribute
 b <- 300 
#开发插槽及其“大小”

第一个版本,使用while循环:

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

  d <- 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)
    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=b)
d(0){
他有一个房间
num.slots这里是另一个选项:

optimal.fill2 <- function(a,b) {
  o <- rank(a)
  a <- sort(a)
  ca <- cumsum(a)
  foo <- (b-ca)/((length(a)-1):0)
  ok <- foo >= a
  a[!ok] <- foo[max(which(ok))]
  a[o]
}

optimal.fill2我不明白。关于每个插槽可以容纳的大小的信息在哪里?你有单独的信息吗?就像40个插槽中的每个插槽可以容纳的大小一样。数组a表示每个插槽可以容纳的大小。b感谢ideads!让我们假设我们可以独立于大小o来填充插槽的大小有另一个限制例如,最后一个槽有30个,我们还有25个,但我们最多可以填20个。然后我们必须把剩下的5个放在一个单独的剩余槽中。如果“填充”,我们可能需要使用一个条件超过一个最大值,我们必须将其添加到余数池中。但是我不确定如何创建它。在早上再次查看之后,我认为这与@flodel的第二个答案的想法相同。@FabianStolz:与其在评论中提问,不如修改问题或提出新问题。在这种情况下,我认为新问题是合适的,尽管一定要这样做这是新问题的链接:如果某人能看一看就好了。
optimal.fill <- function(a, b) {
  stopifnot(sum(a) >= b)

  slot.order   <- order(a)
  sorted.sizes <- a[slot.order]
  can.fill     <- sorted.sizes * rev(seq_along(a))
  full.slots   <- slot.order[which(cumsum(can.fill) <= b)]

  d <- rep(0, length(a))
  d[ full.slots] <- a[full.slots]
  d[!full.slots] <- (b - sum(a[full.slots])) /
                    (length(a) - length(full.slots))

  return(d)
}
optimal.fill2 <- function(a,b) {
  o <- rank(a)
  a <- sort(a)
  ca <- cumsum(a)
  foo <- (b-ca)/((length(a)-1):0)
  ok <- foo >= a
  a[!ok] <- foo[max(which(ok))]
  a[o]
}