求和为100的嵌套循环,每个变量的步长、上下限变化值的组合有多少?

What is the number of combination of a nested loop with a sum of 100 and changing values of step, up and down limit for each variable?

我正在使用一个嵌套循环,它在每一步都在数组中添加一行。 有 6 个循环和 8 个变量。

总和 (a,b,c,d,e,f,g) 必须始终为 100。

当我使用 1 或 0.1 这样的小步长时。 运行 需要很多时间,因为我正在使用 rbind。所以我想预分配并使用其他函数,但是,我不知道最终 table 的大小,因为我想更改步长,每个变量的下限和上限 a ,b,c,d,e,f,g。你有没有想出一个方程式来计算这些参数的函数组合数?

这是一个可重现的例子:

combinaison_array<-array(NA,dim= c(1,8)) # define the storage array

for (a in seq(from=0, to=100, by=25)){ 
  for (b in seq(from=25, to=100-a, by=25)){ 
    for (c in seq(from=0, to=100-a-b, by=25)){ 
      for (d in seq(from=0, to=100-a-b-c, by=25)){ 
        for (e in seq(from=0, to=100-a-b-c-d, by=50)){ 
          for (f in seq(from=0, to=100-a-b-c-d-e, by=25)){ 
            g=100-a-b-c-d-e-f
            output=5*(a+b+c)*(d+e+f)
            combinaison_array<- 
            rbind(combinaison_array,c(a,b,c,d,e,f,g,output))}}}}}}
View(combinaison_array)

我还有一个问题,如果 b、c、d、e、f 从 0 以外的其他值开始,则 seq.default(from = 25, to = 100 - a,乘以 = 25)。但我认为输出数组还是对的。你怎么看?

提前感谢您的帮助

我能想到的最快的方法是使用 expnd.grid() 根据范围列出所有可能的变量组合。然后您可以根据总和约束进行过滤。请注意,这将使用大量内存,因为您将在过滤之前生成完整的网格,而不仅仅是所需的子集。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

range_list <- list( # Individual variable ranges
  a=seq(0,100,1),
  b=seq(25,100,25),
  c=seq(0,100,5),
  d=seq(0,50,5)
)


comb_array <- expand.grid(range_list) %>% # All possible combinations
  mutate(s=rowSums(.))%>%
  filter(s==100) %>% # Filter by sum constraint
  select(-s) %>% # Remove sum variable
  arrange_all() # Sort by all columns(optional)

comb_array
#>      a   b  c  d
#> 1    0  25 25 50
#> 2    0  25 30 45
#> 3    0  25 35 40
#> 4    0  25 40 35
#> 5    0  25 45 30
#> 6    0  25 50 25
#> 7    0  25 55 20
#> 8    0  25 60 15
#> 9    0  25 65 10
#> 10   0  25 70  5
#> 11   0  25 75  0
#> 12   0  50  0 50
#> 13   0  50  5 45
#> 14   0  50 10 40
#> 15   0  50 15 35
#> 16   0  50 20 30
#> 17   0  50 25 25
#> 18   0  50 30 20
#> 19   0  50 35 15
#> 20   0  50 40 10
#> 21   0  50 45  5
#> 22   0  50 50  0
#> 23   0  75  0 25
#> 24   0  75  5 20
#> 25   0  75 10 15
#> 26   0  75 15 10
#> 27   0  75 20  5
#> 28   0  75 25  0
#> 29   0 100  0  0
#> 30   5  25 20 50
#> 31   5  25 25 45
#> 32   5  25 30 40
#> 33   5  25 35 35
#> 34   5  25 40 30
#> 35   5  25 45 25
#> 36   5  25 50 20
#> 37   5  25 55 15
#> 38   5  25 60 10
#> 39   5  25 65  5
#> 40   5  25 70  0
#> 41   5  50  0 45
#> 42   5  50  5 40
#> 43   5  50 10 35
#> 44   5  50 15 30
#> 45   5  50 20 25
#> 46   5  50 25 20
#> 47   5  50 30 15
#> 48   5  50 35 10
#> 49   5  50 40  5
#> 50   5  50 45  0
#> 51   5  75  0 20
#> 52   5  75  5 15
#> 53   5  75 10 10
#> 54   5  75 15  5
#> 55   5  75 20  0
#> 56  10  25 15 50
#> 57  10  25 20 45
#> 58  10  25 25 40
#> 59  10  25 30 35
#> 60  10  25 35 30
#> 61  10  25 40 25
#> 62  10  25 45 20
#> 63  10  25 50 15
#> 64  10  25 55 10
#> 65  10  25 60  5
#> 66  10  25 65  0
#> 67  10  50  0 40
#> 68  10  50  5 35
#> 69  10  50 10 30
#> 70  10  50 15 25
#> 71  10  50 20 20
#> 72  10  50 25 15
#> 73  10  50 30 10
#> 74  10  50 35  5
#> 75  10  50 40  0
#> 76  10  75  0 15
#> 77  10  75  5 10
#> 78  10  75 10  5
#> 79  10  75 15  0
#> 80  15  25 10 50
#> 81  15  25 15 45
#> 82  15  25 20 40
#> 83  15  25 25 35
#> 84  15  25 30 30
#> 85  15  25 35 25
#> 86  15  25 40 20
#> 87  15  25 45 15
#> 88  15  25 50 10
#> 89  15  25 55  5
#> 90  15  25 60  0
#> 91  15  50  0 35
#> 92  15  50  5 30
#> 93  15  50 10 25
#> 94  15  50 15 20
#> 95  15  50 20 15
#> 96  15  50 25 10
#> 97  15  50 30  5
#> 98  15  50 35  0
#> 99  15  75  0 10
#> 100 15  75  5  5
#> 101 15  75 10  0
#> 102 20  25  5 50
#> 103 20  25 10 45
#> 104 20  25 15 40
#> 105 20  25 20 35
#> 106 20  25 25 30
#> 107 20  25 30 25
#> 108 20  25 35 20
#> 109 20  25 40 15
#> 110 20  25 45 10
#> 111 20  25 50  5
#> 112 20  25 55  0
#> 113 20  50  0 30
#> 114 20  50  5 25
#> 115 20  50 10 20
#> 116 20  50 15 15
#> 117 20  50 20 10
#> 118 20  50 25  5
#> 119 20  50 30  0
#> 120 20  75  0  5
#> 121 20  75  5  0
#> 122 25  25  0 50
#> 123 25  25  5 45
#> 124 25  25 10 40
#> 125 25  25 15 35
#> 126 25  25 20 30
#> 127 25  25 25 25
#> 128 25  25 30 20
#> 129 25  25 35 15
#> 130 25  25 40 10
#> 131 25  25 45  5
#> 132 25  25 50  0
#> 133 25  50  0 25
#> 134 25  50  5 20
#> 135 25  50 10 15
#> 136 25  50 15 10
#> 137 25  50 20  5
#> 138 25  50 25  0
#> 139 25  75  0  0
#> 140 30  25  0 45
#> 141 30  25  5 40
#> 142 30  25 10 35
#> 143 30  25 15 30
#> 144 30  25 20 25
#> 145 30  25 25 20
#> 146 30  25 30 15
#> 147 30  25 35 10
#> 148 30  25 40  5
#> 149 30  25 45  0
#> 150 30  50  0 20
#> 151 30  50  5 15
#> 152 30  50 10 10
#> 153 30  50 15  5
#> 154 30  50 20  0
#> 155 35  25  0 40
#> 156 35  25  5 35
#> 157 35  25 10 30
#> 158 35  25 15 25
#> 159 35  25 20 20
#> 160 35  25 25 15
#> 161 35  25 30 10
#> 162 35  25 35  5
#> 163 35  25 40  0
#> 164 35  50  0 15
#> 165 35  50  5 10
#> 166 35  50 10  5
#> 167 35  50 15  0
#> 168 40  25  0 35
#> 169 40  25  5 30
#> 170 40  25 10 25
#> 171 40  25 15 20
#> 172 40  25 20 15
#> 173 40  25 25 10
#> 174 40  25 30  5
#> 175 40  25 35  0
#> 176 40  50  0 10
#> 177 40  50  5  5
#> 178 40  50 10  0
#> 179 45  25  0 30
#> 180 45  25  5 25
#> 181 45  25 10 20
#> 182 45  25 15 15
#> 183 45  25 20 10
#> 184 45  25 25  5
#> 185 45  25 30  0
#> 186 45  50  0  5
#> 187 45  50  5  0
#> 188 50  25  0 25
#> 189 50  25  5 20
#> 190 50  25 10 15
#> 191 50  25 15 10
#> 192 50  25 20  5
#> 193 50  25 25  0
#> 194 50  50  0  0
#> 195 55  25  0 20
#> 196 55  25  5 15
#> 197 55  25 10 10
#> 198 55  25 15  5
#> 199 55  25 20  0
#> 200 60  25  0 15
#> 201 60  25  5 10
#> 202 60  25 10  5
#> 203 60  25 15  0
#> 204 65  25  0 10
#> 205 65  25  5  5
#> 206 65  25 10  0
#> 207 70  25  0  5
#> 208 70  25  5  0
#> 209 75  25  0  0

reprex package (v0.3.0)

于 2019-08-07 创建