【发布时间】:2019-06-09 15:10:51
【问题描述】:
我有一个模拟退火算法的脚本,想限制搜索,在本例中为超立方体。
simulated_annealing <- function(func, s0, niter = 1, epsilon = 0.01) {
# ##s=state, f=funcion, b=best, c=current, n=neighbour
s_b <- s_c <- s_n <- s0
f_b <- f_c <- f_n <- func(s_n)
for (k in 1:niter) {
Temperatura <- (1 - epsilon)^k
s_n <- rnorm(2, s_c, 1)
f_n <- func(s_n)
if (f_n < f_c || runif(1, 0, 1) < exp(-(f_n - f_c) / Temperatura)) {
s_c <- s_n
f_c <- f_n
}
if (f_n < f_b) {
s_b <- s_n
f_b <- f_n
}
return(list(iteraciones = niter, Mejor_valor = f_b, Mejor_estado = s_b))
}}
你可以这样使用它:
sol <- simulated_annealing(rastr, niter = 100, epsilon = 0.91, s0 = c(0, 2))
我想对搜索空间添加限制,使其仅在超立方体 x_i=[-5.12,5.12] 中移动,但我不知道如何开始。我尝试使用 while 但它停止了该功能。
请,谢谢
【问题讨论】:
-
能发一个完整的函数吗?要么你的函数中有更多内容,要么你忘记了最后的大括号
}。另外,您能否举例说明您想要的用法和期望的结果?可重复的数据会很好。并告诉我们您想要“限制”什么。 -
完成。您可以与任何功能一起使用,它只是搜索 optima。我在 Rastrigin 中测试它,通常受限于提到的超立方体,但我吸进 R 并且不知道如何添加这样的限制。
标签: r optimization simulated-annealing