我会找到全局最小值,绘图显示此函数有许多局部最小值。
f[x_] = 0.5 x^2 + Cos[Pi x] 2 Sin[Pi x] + Cos[Pi x] + 2 Sin[Pi x];
plt1 = Plot[f[x], {x, -5, 5}, PlotStyle -> RGBColor[1, 0, 0],Frame -> True]
根据论文(http://ww.w.sliponline.org/Publications/Conferences/24/c24.pdf),我会实施SA算法,但性能非常慢。
fTmp = fBest = xBest = xTmp = 999.0;
k = 0;
LIMIT = 10^6;
tTmp = tInit = 300;
Alpha = 0.999999999;
For [tTmp = tTmp * Alpha;, k < LIMIT, k++,
xTmp = RandomReal[{-5, 5}];
fTmp = f[xTmp];
If [fTmp < fBest, fBest = fTmp; xBest = xTmp,
PRA = N[Min[{1, Exp[-(fTmp - fBest)/tTmp]}]];
R = RandomReal[{0.0, 1.0}];
If [R < PRA, fBest = fTmp; xBest = xTmp; k++,];
];
tTmp = tTmp * Alpha;
];
Print[xBest]
Print[fBest]
-0.390741
-2.10428
是否有可能提高模拟退火的性能和精度?请随时发表评论,谢谢。
答案 0 :(得分:1)
为了提高准确性,您可以做以下几件事:
不使用10 ^ 6次迭代的固定循环可以提高性能。相反,使用连续解决方案之间的值差异小于某个指定的容差。
您还可以利用系统可能具有的多个核心来运行具有不同初始值的算法的多个实例。虽然这不会直接提高性能,但在同一时间段内可能会从相同的资源中获得更多。如果这还不够,我建议尝试其他一些全局优化算法,例如遗传算法。