Метод перестановок и скалолазания для переупорядочения строк в R - PullRequest
1 голос
/ 23 мая 2019

У меня следующая проблема:

  • У меня есть 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

Это "восхождение на гору" (я не знаю, смогу ли яназовите это так) метод не дает никаких результатов для меня.

Моя следующая идея - использовать пакет договоренностей и создавать перестановки для подмножеств моих данных, объединять переставленные подмножества и проверять, выполняются ли условия.Однако я боюсь, что это может быть еще один необязательный обходной путь, который я мог бы предпринять и хотел бы спросить, есть ли у вас какие-либо идеи о том, как решить эту проблему?

...