求和为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 是循环的索引。它们中的每一个都可以在定义的下限和定义的上限之间取一个值,包括在 (0:100) 中,并具有已知的步长值。
g 也取一个介于 (0:100) 的下限和上限之间的值,步长值已知
输出:是用a,b,c,d,e,f,g
计算的值
总和 (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 创建
我正在使用一个嵌套循环,它在每一步都在数组中添加一行。 有 6 个循环和 8 个变量。
a,b,c,d,e,f 是循环的索引。它们中的每一个都可以在定义的下限和定义的上限之间取一个值,包括在 (0:100) 中,并具有已知的步长值。
g 也取一个介于 (0:100) 的下限和上限之间的值,步长值已知
输出:是用a,b,c,d,e,f,g
计算的值
总和 (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 创建