You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何指定初始参数时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:43