为何指定初始参数时GenSA结果不受随机种子影响?
为什么指定
par参数时GenSA总是返回相同的解? 这其实并不违背模拟退火的随机搜索理念,背后是两个关键机制在起作用:
1. 初始点固定 + 随机数序列的可重复性
当你指定par = c(1,1)时,GenSA的搜索起点被固定了。而如果没有显式设置control$seed参数,GenSA的随机数生成依赖于R的全局随机状态。在你的循环中,每次调用fit2(不指定par的情况)时,消耗的随机数数量是固定的(生成初始点和后续搜索的随机操作次数一致),这导致每次回到fit1调用时,全局随机状态完全相同——因此fit1每次运行的随机扰动序列完全一致,最终收敛到同一个解。
对比之下,fit2因为每次会随机生成初始点(从lower到upper的均匀分布),初始点本身就有差异,所以即使随机序列有部分重复,最终的收敛结果也会略有不同。
2. Rastrigin函数的特性放大了这个现象
Rastrigin函数的全局最优解是(0,0)(函数值为0),而你指定的初始点(1,1)距离这个最优解很近。GenSA的模拟退火算法在这个区域的搜索效率很高,每次都能收敛到极高精度的近似解,数值上的微小差异被打印精度掩盖,看起来完全相同。
验证方法:打破随机序列的重复性
如果你想让指定par时的结果也产生随机性,只需要在每次调用GenSA时显式设置不同的随机种子:
library(GenSA) Rastrigin <- function(x) { sum(x^2 - 10 * cos(2 * pi * x)) + 10 * length(x) } niter <- 10 sol <- data.frame(with.par = NaN*seq(niter)) sol$without.par <- NaN for(i in seq(niter)){ # 每次给fit1设置不同的随机种子 fit1 <- GenSA( par = c(1,1), fn = Rastrigin, lower = c(-5.12, -5.12), upper = c(5.12, 5.12), control = list(seed = sample.int(1e6, 1)) ) fit2 <- GenSA( fn = Rastrigin, lower = c(-5.12, -5.12), upper = c(5.12, 5.12) ) sol$with.par[i] <- min(as.data.frame(fit1$trace.mat)$function.value) sol$without.par[i] <- min(as.data.frame(fit2$trace.mat)$function.value) } sol
运行这段代码后,with.par列的结果就会出现差异,符合模拟退火的随机搜索特性。
内容的提问来源于stack exchange,提问作者Marc in the box
相关产品推荐
相关产品推荐

