模拟退火算法(Simulated Annealing)

简单直观解释:   https://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html

模拟退火算法详细解释:   https://blog.csdn.net/huahua19891221/article/details/81737053

应用实例笔记:   https://zhuanlan.zhihu.com/p/33184423

模拟退火算法路径规划(python):   https://blog.csdn.net/qq_34942642/article/details/106332121

物理退火:   https://blog.csdn.net/weixin_40562999/article/details/80853354

航迹规划: https://www.guyuehome.com/17847 

是一种适用于大规模组合优化问题的有效近似算法。

本质是在每一步都有一定概率接受 比当前解更差 的结果,以有助于跳出局部极小。接受次优解的概率随着过程而下降,使算法收敛。类似于 ε-贪心算法。

 

模拟退火(SA,Simulated Annealing)思想

         爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解B后,不是就此结束,而是会以一定的概率接受向右的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最优值B。

迭代方向如何选择???

 

         模拟退火算法思想描述:

         若J( Y(i+1) )>= J( Y(i) )  (即移动后得到更优解),则总是接受该移动

         若J( Y(i+1) )< J( Y(i) )  (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)

  这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。

  根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

    P(dE) = exp( dE/(kT) )

  其中k是一个常数,exp表示自然指数,且dE<0。其实这条公式更直观意思就是:温度越高,出现一次能量差为p(dE)的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。

  随着温度T的降低,P(dE)会逐渐降低。

  我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。

在实际问题中,假定当前可行解为x,迭代更新后的解为x_{new},那么对应的“能量差”定义为:

\Delta f = f(x_{new}) - f(x)

其对应的“一定概率”为:

最小值优化:p(\Delta f)=exp(-\frac{\Delta f}{kT})

最大值优化:p(\Delta f)=exp(\frac{\Delta f}{kT})

注:在实际问题中,可以设定k=1,即将参数kT合并。

 

模拟退火算法描述

初始化:初始温度T(充分大),温度下限T_{min}(充分小),初始解状态x(是算法迭代的起点),每个T值的迭代次数L

l=1, 2, ..., L做下列循环:   

  •  产生新解x_{new}x_{new}=x+\Delta x\Delta x[d_{min}, d_{max}]之间的随机数。   迭代方向如何选择???
  •  利计算增量\Delta f = f(x_{new}) - f(x),其中f(x)为优化目标;
  •  若\Delta f<0(若寻找最大值,\Delta f>0)则接受x_{new}作为新的当前解,否则以概率exp(-\Delta f / (kT))接受x_{new}作为新的当前解;
  •  如果满足终止条件则输出当前解作为最优解,结束程序。(终止条件通常取为连续若干个新解都没有被接受时终止算法。);

T逐渐减少,且T>T_{min},然后转第2步。

注意:生成新的x后,要判断是否在定义域内,对于超出的x值要抛弃。

 

模拟退火算法的优缺点

模拟退火算法的应用很广泛,可以高效地求解NP完全问题,如货郎担问题(Travelling Salesman Problem,简记为TSP)、最大截问题(Max Cut Problem)、0-1背包问题(Zero One Knapsack Problem)、图着色问题(Graph Colouring Problem)等等,但其参数难以控制,不能保证一次就收敛到最优值,一般需要多次尝试才能获得(大部分情况下还是会陷入局部最优值)。观察模拟退火算法的过程,发现其主要存在如下三个参数问题:

(1) 温度T的初始值设置问题 

温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。

(2) 退火速度问题,即每个T值的迭代次数

模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索是相当必要的,但这也需要计算时间。循环次数增加必定带来计算开销的增大。

(3) 温度管理问题 

温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:

T=\alpha \times T , \alpha \in (0, 1)

注:为了保证较大的搜索空间,α一般取接近于1的值,如0.95、0.9。

模拟退火算法应用

使用模拟退火算法解决旅行商问题

  旅行商问题 ( TSP , Traveling Salesman Problem ) :有N个城市,要求从其中某个问题出发,唯一遍历所有城市,再回到出发的城市,求最短的路线。

  旅行商问题属于所谓的NP完全问题,精确的解决TSP只能通过穷举所有的路径组合,其时间复杂度是O(N!) 。

  使用模拟退火算法可以比较快的求出TSP的一条近似最优路径。(使用遗传算法也是可以的,我将在下一篇文章中介绍)模拟退火解决TSP的思路:

1. 产生一条新的遍历路径P(i+1),计算路径P(i+1)的长度L( P(i+1) )

2. 若L(P(i+1)) < L(P(i)),则接受P(i+1)为新的路径,否则以模拟退火的那个概率接受P(i+1) ,然后降温

3. 重复步骤1,2直到满足退出条件

  产生新的遍历路径的方法有很多,下面列举其中3种:

1. 随机选择2个节点,交换路径中的这2个节点的顺序。

2. 随机选择2个节点,将路径中这2个节点间的节点顺序逆转。

3. 随机选择3个节点m,n,k,然后将节点m与n间的节点移位到节点k后面。

 

posted @ 2021-01-21 14:22  星火-AI  阅读(993)  评论(0编辑  收藏  举报