1

300ユニットなど、一定の量があります。この量は、40 の「スロット」または「ビン」にできるだけ均等に分散する必要があります。各スロットが同じであれば簡単です。つまり、各スロットで 7.5 になります。ただし、スロットのサイズはさまざまであり、たとえば 4 つしかない場合、その「サイズ」が許容する以上に「埋める」ことはできません。4 を超えて「埋める」ことができないもの。もの。

別の制限があると仮定しましょう: 一般的な充填制限は、たとえば 5 です。これは、スロットに 12 と言う十分なサイズがあり、残りのユニットが 11 と言う十分なサイズがある場合でも、5 しか充填できないことを意味します。すべてのスロットが埋まった後に超過した値は、別の残りのスロットに配置する必要があります。充填プロセスごとに、最大充填容量のどれだけがパーセントで使用されているかという数値も取得する必要があります。つまり、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)
4

1 に答える 1

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)
于 2012-07-02T08:43:37.063 に答える