【发布时间】:2022-01-20 21:34:14
【问题描述】:
我正在使用 R 编程语言。
我正在尝试使用带替换的随机搜索和不带替换的随机搜索来优化 Rastrign 函数:
Rastrigin <- function(x1, x2)
{
20 + x1^2 + x2^2 - 10*(cos(2*pi*x1) + cos(2*pi*x2))
}
x1 <- x2 <- seq(-5.12, 5.12, by = 0.1)
f <- outer(x1, x2, Rastrigin)
第 1 部分:带替换的随机搜索:
为了进行替换采样,我生成了 100 个点(我将这些点转换为整数格式,以便更容易查看 第 2 部分中哪些点是重复的),然后在这 100 个点上评估函数点。然后我提取了对应于函数最小值的数据行。我还记录了所用的时间:
start.time <- Sys.time()
x1 = as.integer(rnorm(100,5,5))
x2 = as.integer(rnorm(100,5,5))
func_value = 20 + x1^2 + x2^2 - 10*(cos(2*pi*x1) + cos(2*pi*x2))
frame = data.frame(x1,x2,func_value)
sort_frame <- frame[order(func_value),]
final_answer = sort_frame[1,]
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.01810408 secs
第 2 部分:没有替换的随机搜索:
由于我不知道如何为传统方式编写代码来执行不带替换的随机搜索(即生成随机值,看看这个生成的值是否已经发生:如果没有,则在这个值处评估函数,否则生成新的值,直到生成一个看不见的值) - 因为我想以 100 个值评估函数,所以我决定生成 200 个值,希望这 200 个值中至少有 100 个值是唯一的。然后,我重复了上面的过程:
start.time <- Sys.time()
x1 = as.integer(rnorm(200,5,5))
x2 = as.integer(rnorm(200,5,5))
frame = data.frame(x1,x2)
de_duplicated = frame[!(duplicated(frame) | duplicated(frame, fromLast = TRUE)), ]
#check to make sure at least 100 values in "de_duplicated"
ifelse(nrow(de_duplicated)<100, "BAD", "GOOD")
[1] "GOOD"
#only keep 100 values in de_duplicated:
de_duplicated = de_duplicated[1:100,]
func_value = 20 + de_duplicated$x1^2 + de_duplicated$x2^2 - 10*(cos(2*pi*de_duplicated$x1) + cos(2*pi*de_duplicated$x2))
final_frame = data.frame(de_duplicated$x1,de_duplicated$x2,func_value)
sort_frame <- final_frame[order(func_value),]
final_answer = sort_frame[1,]
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Time difference of 0.03689885 secs
我的问题:因为我有兴趣比较 Part 1 和 Part 2 的时间 - 我认为这不公平,因为我以非常“笨拙”的方式编写了第 2 部分的代码。
如果您以更“传统”的方式编写第 2 部分的代码,即使用“while 循环” - 这会减少 第 2 部分所需的时间>? C有人请告诉我如何做到这一点 - 使用“while 循环”编写不带替换的随机搜索(即第 2 部分)实际上是传统的方法吗?
谢谢!
【问题讨论】:
标签: r loops optimization random while-loop