R中重新排列行的置换和爬山方法

时间:2019-05-23 19:58:56

标签: r sorting permutation sample hill-climbing

我有以下问题:

  • 我有df,它由一列和60行组成,如df = rnorm(60,0.06,0.2)
  • 我想对60行进行重新排序,以使cumprod(df + 1)[60]-cumprod(df + 1)[55]尽可能接近1。
  • 另外,我希望max(cumprod(df + 1))小于1.305且大于1.295。

我的代码如下

start.time <- Sys.time()
set.seed(42)
vs = rnorm(60, 0.06, 0.2)


max_attempts = 200000


swaps_made = 0
for (step in 1:max_attempts) {
    # Copy the vector and swap two random values

    vs_new = vs

    swap_inds1 = sample(55:60, 2, replace = FALSE)
    swap_inds2 = sample(length(vs), 2, replace = FALSE) 
    vs_new[swap_inds1] = vs_new[swap_inds2]
    vs_new[swap_inds2] = vs_new[swap_inds1]



    vs2 <- as_tibble(cumprod(1+vs_new))
    vs3 <- as_tibble(cumprod(1+vs))

    if (abs(vs2[60,1]-vs2[55,1]) < abs(vs3[60,1]-vs3[55,1])) {
        vs = vs_new
        }

    flat = ((vs2[60,1]-vs2[55,1]) < 1.05) & ((vs2[60,1]-vs2[55,1]) > 0.95)
    peak= (max(vs2) < 1.305) & (max(vs2) > 1.295)
    swaps_made = swaps_made + 1

    if (peak && flat) {

                break

    }
}
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

这种“爬坡”(我不知道是否可以这样命名)方法不会为我带来任何结果。

我的下一个想法是使用排列包,并为我的数据子集创建置换,合并置换后的子集,并检查是否满足条件。不过,我担心这可能是我可能要走的另一次不必要的弯路,想问一下您是否对如何解决此问题有任何了解?

0 个答案:

没有答案