模拟退火与爬山算法
来源:互联网 发布:星星网络在线星盘 编辑:程序博客网 时间:2024/06/04 18:17
前言
最近学习了一些元启发算法,感觉这些算法的原理都挺有趣的
结合了物理,生物学的现象
(不得不感叹一下前人的脑洞)
爬山算法
先来讲下爬山算法。
考虑这样一个问题:
假设有一个函数
画出它的图像如下:
每次在当前位置的两侧判断是否比当前更高
就像爬山一样往高处爬,最终会到达一个较高的位置
但是这通常不是整体最优解,而是局部最优解
像这样:
登山者到第一个峰就认为自己登顶了,却没有到达箭头所指的最高点
这就是爬山算法的缺陷
由于爬山算法缺陷巨大,故在一般情况下不使用
何为“退火”?
根据物理学原理,一个高温物体冷却的过程是这样的:
温度逐渐下降,并且下降的速率随时间推移而减小,最终与室温一致
模拟退火算法就是模拟这种物理过程来得到解的
模拟退火
前面讲到,爬山算法的缺陷在于不能找到整体最优解
如何改进呢?
还是看刚才的问题:
如果在第一个山峰上继续往右走一段距离,就会到达最高峰
模拟退火算法在转移状态时,提供了这种可能性。
具体地说:
- 若下一状态更优,则转移至下一状态
- 否则有一定的概率转移至下一状态
这个概率函数如何确定呢?就要用到“退火”原理了
设状态的变化量为
则概率函数为
写成代码就是:
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.99)即可
直到降到“室温”(一般设为0.01)为止
模拟退火算法可以表示为如下流程:
- 初始化温度,选定一个初始状态
- 选定一个随机的下一状态
- 判断是否要转移状态
- 降温
- 若温度已经达到室温,则结束,否则继续进行第2步
几个小技巧:
下一状态 与 当前状态 的差别可以与温度挂钩
这样,随着温度的减小,已经得到的解越来越不容易丢失
这也体现了模拟退火算法“最终趋于稳定”的特性
每次降温的过程中,可以同时多生成几个下一状态(内循环)
这样出解的概率会大一点
例题
POJ2420
求广义费马点,很适合用来练手
- 模拟退火与爬山算法
- 爬山算法与模拟退火算法
- 爬山算法->模拟退火
- 爬山算法&模拟退火
- 爬山算法,模拟退火算法
- 爬山算法,模拟退火算法
- 爬山算法、模拟退火算法
- 贪心、爬山、模拟退火算法
- 优化算法 - 爬山,模拟退火算法
- 简述 爬山算法、模拟退火算法
- 爬山算法和模拟退火算法
- 优化算法-爬山法和模拟退火
- 关于爬山算法、模拟退火算法和遗传算法区别
- 模拟退火算法和爬山算法,遗传算法
- [Tyvj1551]平衡的爱 (爬山算法||模拟退火)
- bzoj2428 均分数据 爬山算法or模拟退火
- 【模拟退火\爬山算法】[HYSBZ/BZOJ3680]吊打XXX(吊打GTY)
- [Poj2420]A Star not a Tree? (爬山算法||模拟退火算法)
- CodeForces
- hash原理
- oracle实现分页数据重复
- redis单点实例搭建
- 剑指offer刷刷题
- 模拟退火与爬山算法
- js 判断数组是否为空
- eclipse 怎么开启断言
- 随便写点
- Central Europe Regional Contest 2014 [Gym
- ARP攻击
- I/O多路复用之水平触发和边沿触发模式
- 快速排序,归并排序
- Pandas:DataFrame对象的基础操作