模拟退火的实施;如何提高性能?

时间:2016-04-28 06:49:45

标签: optimization

更新

我会找到全局最小值,绘图显示此函数有许多局部最小值。

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

是否有可能提高模拟退火的性能和精度?请随时发表评论,谢谢。

1 个答案:

答案 0 :(得分:1)

为了提高准确性,您可以做以下几件事:

  1. 更改算法的参数。在类似问题上利用SA的研究论文将描述他们对参数的选择。或者,您可以针对问题的参数运行自己的元优化。有关不同类型的示例,请参阅https://en.wikipedia.org/wiki/Hyperparameter_optimization
  2. 执行多个优化步骤。在这种情况下,您可以使用新运行中第一次运行中的最佳解决方案重新运行算法,依此类推。您甚至可以使用不同的算法搜索最佳解决方案。在您的具体情况下,您接近最佳解决方案,因此对您的解决方案进行强力搜索可能会产生更好的结果。
  3. 不使用10 ^ 6次迭代的固定循环可以提高性能。相反,使用连续解决方案之间的值差异小于某个指定的容差。

    您还可以利用系统可能具有的多个核心来运行具有不同初始值的算法的多个实例。虽然这不会直接提高性能,但在同一时间段内可能会从相同的资源中获得更多。如果这还不够,我建议尝试其他一些全局优化算法,例如遗传算法。