模拟退火算法

简介与适用范围

模拟退火是一种随机化算法。当一个问题的方案数极大(甚至是无穷的)而且不是一个单峰函数时,我们常使用模拟退火求解。

解释

根据爬山算法的求解过程,我们发现:爬山算法在对于一个当前最优解附近的非最优解直接舍去了,然而很多情况下,我们需要去接受这个非最优解从而跳出此局部最优解,即为模拟退火算法。

何为退火?

当固体的温度很高时,内能比较大,内部粒子处于快速无序运动状态,当温度渐渐降低时,固体内能减小,粒子运动速度会渐渐下降,逐渐趋于有序,内部粒子基本趋于稳定,达到一个平衡状态。这个过程在金属锻造中经常出现,称为金属退火。

模拟这个退火思想,1955年,美国物理学家Metropolis发明了这一算法。它主要用于搜索全局最优解的问题。一开始设置一个高温,通常很大,然后不断的降低温度,直到最后温度趋近于0(但不等于0),在冷却的过程中,在每一个稳定的温度,都去迭代多次,从而找到当前温度下的局部最优解。直到温度最后接近0,则将当前的局部最优解输出。模拟退火算法是一个近似算法,它并不能绝对保证找到全局最优解。

基本策略

  • 在当前位置上进行一次扰动,从 x x x 跳至当前位置 x ′ x' x
  • 求出新位置的函数值 y ′ y' y,如果新位置的函数值更优,则 x − > x ′ x->x' x>x
  • 如果新位置的函数值更劣,则有一定概率 P P P 跳到新位置,也有一定的概率 P ′ P' P 留在原位置。

其中 P P P 满足一下公式(假设函数值小更优)

P = { 1 f ( x ′ ) ≤ f ( x )   e f ( x ) − f ( x ′ ) k T   f ( x ′ ) > f ( x ) P=\left\{\begin{matrix}\qquad 1 \qquad f(x')\leq f(x)\\\\ \ e^{\frac{f(x)-f(x')}{kT}} \ f(x')>f(x)\end{matrix}\right. P=1f(x)f(x) ekTf(x)f(x) f(x)>f(x)

当下一个解更优时,则跳到下一个解;如果下一个解更劣时,有一定的概率跳到下一个解。 T T T 表示初始温度, K K K 表示温度下降的速率。

可以看出,当温度越高时,越有可能跳出局部最优解;当温度越小时,越趋向于稳定,越不容易跳出局部最优解。

在温度固定的情况下,模拟退火算法需要迭代多次,迭代的次数越多,越容易找到局部最优解。这个迭代次数称为⻢尔科夫链。

但⻢尔科夫链越⻓,所需要的时间也越多。

你可能感兴趣的:(学习,c++)