优化/矢量化R中的循环,从输入向量中的范围生成random?

use*_*004 2 loops r vector vectorization genetic-algorithm

问题:

我在R中使用一个循环从两个("父")向量创建一个新向量,为新向量中的每个位置生成一个随机值,该值位于父对象在此位置的值范围内(它是为遗传算法中的交叉阶段).请注意,我不想要x和y的平均值,而是要求各个位置上的值范围内的随机值.

示例代码:

x = c(0.1, 0.7, 1, 0.8)
y = c(0, 0.9, 0.2, 1)
child = rep(NA, length(x))
for(i in 1:length(x)){
  child[i] = sample(seq(min(x[i], y[i]),  
                        max(x[i],y[i]), by=0.01), 1)
}
# This might yield, for example: 0.02 0.83 0.73 0.88 
Run Code Online (Sandbox Code Playgroud)

题:

它工作正常,但我想也许有一种更有效的方法来做到这一点(因为我需要在数千次迭代中的每一次为100-1000个人做这件事).在R,有喜欢漂亮的快捷功能ifelse,colMeans,max.col,match,rollmean,等,在载体的工作,所以我想知道,是否有类似的东西,我的目的呢?(根据apply我的理解,这个团伙可能在这里帮不了多少).或者像这样的循环真的是我能做的最好的?

jer*_*ycg 6

我们可以使用runif从均匀分布得到的随机数,并pmaxpmin向量化的最小值和最大值:

round(runif(length(x), pmin(x, y), pmax(x, y)), 2)
Run Code Online (Sandbox Code Playgroud)

一个小基准:

library(microbenchmark)

set.seed(42)
x <- runif(1000)
y <- runif(1000)

microbenchmark(vectorize ={round(runif(length(x), pmin(x, y), pmax(x, y)), 2)},
               mapply =  {mapply(runif, 1, pmin(x, y), pmax(x, y))},
               lapply = {unlist(lapply(seq_along(x), function(p, q, i) { sample(seq(min(p[i], q[i]), max(p[i],q[i]), by=0.01), 1) }, p=x, q=y))})

Unit: microseconds
      expr       min        lq       mean     median        uq       max neval cld
 vectorize   316.417   321.026   341.6501   336.0015   342.914   529.154   100 a  
    mapply  4311.559  4429.640  4733.0420  4543.6875  4806.535  9935.631   100  b 
    lapply 46987.459 47718.980 50484.6058 48474.5015 53599.756 60043.093   100   c
Run Code Online (Sandbox Code Playgroud)