退火算法
模拟退火算法 (Simulated Annealing)
对模拟退火算法做一个归纳总结。
知识铺垫
搜索问题描述
- 盲目搜索:按照预定的控制策略实行搜索,在搜索过程中,获取的中间信息不用来改进控制策略,成为盲目搜索。
- 启发式搜索:反之。(1)任何有助于找到问题的解,但不能保证找到接的方法均是启发式方法。(2)有助于加速求解过程和找到较优解的方法是启发式方法。
贪心算法
贪心算法伪代码
爬山算法(一种简单的贪心算法)
爬山算法伪代码
爬山算法的思想类似于爬山。从某点开始不断向四周相邻更高的点走去,当走到某顶峰,四周没有比当前更高的点,便认为当前点是目标。特点是能够快速收敛于局部最优解。但遇到平台则无以事从。
但爬山算法得出的一定是可行解(陷于局部最优),但不一定是最优解。
模拟退火算法
模拟退火算法是对爬山算法的改进,但仍是随机算法,不一定求出最优解。
但和爬山算法不同,模拟退火以一定概率接受一个比当前更低的点,使得摆脱局部最优点,寻找全局最优解。
而这个概率会随时间而不断减小。一定的概率是多大呢?
参考热力学公式:在温度为T时,出现能量差为dE的降温的概率为P(dE)= e^(dE/K∗T) ,其中K是玻尔兹曼常数,约等于1。
即P(dE)=e^(dE/T) 。 产生dE能量差的概率与时间T有关,是时间T的单调递减函数。
(详见下文中的metropolis算法)
给出伪代码
ans = 初始解
E = val(ans); //解的估值
while(T > T_min){
nE = val(next);
dE = nE - E; //能量差
if(dE > 0 || eps(dE/T) > random(0,1){
ans = next;
e = nE; //接受新点的话更新对应值
}
T = T * r;
}
其中,eps(dE/T)>random(0,1)是因为dE<0,则e^(dE/T)<e^0。随着程序进行,T越来越小,而接受更低点的概率越小。
在具体题目的代码中,T相当于步长,初始的ans和T应能覆盖所有的解,对于当前点,仅选一个是不够的,所以可以选当前点附近的若干点,再从里面选最大。同时,初始点也可以是个点集,并行扫描效果更佳。
且eps(dE/T) > random(0,1),可以改为其他,只要符合T越小接受的几率越小就行。
模拟退火算法灵感来源
物理退火过程
退火是指将固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使之冷却,最后分子以低能状态排列,固体达到某种稳定状态。即加温过程——等温过程——冷却(退火)过程。
Metropolis准则——以概率接受新状态
模拟退火算法
用R语言实现模拟退火算法
https://blog.csdn.net/qq_27755195/article/details/62505046
参考链接
https://blog.csdn.net/u012469987/article/details/51221844
https://blog.csdn.net/xianlingmao/article/details/7798647
https://blog.csdn.net/AI_BigData_wh/article/details/77943787?locationNum=2&fps=1
http://blog.jobbole.com/108559/
https://wenku.baidu.com/view/5e0cdfd376eeaeaad1f330f4.html
相关阅读
引言 在实际日常中,人们会经常遇到如下问题:在某个给定的定义域X内,求函数f(x)对应的最优值。此处以最小值问题举例(最大值问题