模拟退火与爬山算法

来源:互联网 发布:星星网络在线星盘 编辑:程序博客网 时间:2024/06/04 18:17

前言

最近学习了一些元启发算法,感觉这些算法的原理都挺有趣的
结合了物理,生物学的现象
(不得不感叹一下前人的脑洞)


爬山算法

先来讲下爬山算法。

考虑这样一个问题:
假设有一个函数 f(x)如何求它的最大值?
画出它的图像如下:
这里写图片描述
每次在当前位置的两侧判断是否比当前更高
就像爬山一样往高处爬,最终会到达一个较高的位置

但是这通常不是整体最优解,而是局部最优解
像这样:
这里写图片描述
登山者到第一个峰就认为自己登顶了,却没有到达箭头所指的最高点

这就是爬山算法的缺陷

由于爬山算法缺陷巨大,故在一般情况下不使用

何为“退火”?

根据物理学原理,一个高温物体冷却的过程是这样的:
温度逐渐下降,并且下降的速率随时间推移而减小,最终与室温一致

模拟退火算法就是模拟这种物理过程来得到解的

模拟退火

前面讲到,爬山算法的缺陷在于不能找到整体最优解
如何改进呢?
还是看刚才的问题:
这里写图片描述
如果在第一个山峰上继续往右走一段距离,就会到达最高峰
模拟退火算法在转移状态时,提供了这种可能性。

具体地说:

  • 若下一状态更优,则转移至下一状态
  • 否则有一定的概率转移至下一状态

这个概率函数如何确定呢?就要用到“退火”原理了
设状态的变化量为 Δ(Δ<0),当前温度为 T
则概率函数为 eΔT

写成代码就是:

bool check(double delta,double T){  //大的值更优    if (delta>=0) return 1;    return rand()<=exp(delta/T)*RAND_MAX;}bool check(double delta,double T){  //小的值更优    if (delta<=0) return 1;    return rand()<=exp(-delta/T)*RAND_MAX;}

显然,概率的取值为 [0,1],并且随着温度的减小,这个概率也越来越小
也就是说,当前状态的取值会越来越稳定

事实证明,如果选择的参数得当,最终有很大几率稳定在最高点
即使没有最优,也是一个较优的解
摘一张维基的图片做参考:

这里写图片描述

如何模拟“退火”的过程?
其实只需要每次把当前温度*降温系数(一般为0.99)即可
直到降到“室温”(一般设为0.01)为止

模拟退火算法可以表示为如下流程:

  1. 初始化温度,选定一个初始状态
  2. 选定一个随机的下一状态
  3. 判断是否要转移状态
  4. 降温
  5. 若温度已经达到室温,则结束,否则继续进行第2步

几个小技巧:

下一状态 与 当前状态 的差别可以与温度挂钩
这样,随着温度的减小,已经得到的解越来越不容易丢失
这也体现了模拟退火算法“最终趋于稳定”的特性

每次降温的过程中,可以同时多生成几个下一状态(内循环)
这样出解的概率会大一点


例题

POJ2420
求广义费马点,很适合用来练手

原创粉丝点击