模拟退火算法全解(Simulated Annealing)文末有源码
模拟退火算法全解(Simulated Annealing)
文章目录
- 模拟退火算法全解(**Simulated Annealing**)
- 金属退火
- 算法机制
- 爬山算法
- 模拟退火
- Metropolis准则判断
- 模拟退火算法流程
- 控制参数
- 算法特点
金属退火
一种金属热处理工艺:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度(一般是缓慢冷却)冷却。退火后使得金属具备一些之前没有的特性,比如:降低硬度、改善切削加工性,细化晶粒,消除组织缺陷等,具体可百度。
所以,整个退火过程可以分为三个过程:
- 升温过程:增强粒子的热运动,消除系统原先可能存在的非均匀态;
- 等温过程:对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态。
- 冷却过程: 使粒子热运动减弱并逐渐有序,系统能量逐渐下降,从而得到低能的晶体结构。
再整个退火过程中,内能不断降低,最终达到最小内能(目标函数值)
算法机制
模拟退火算法起源:美国物理学家 N.Metropolis 和同仁在1953年发表研究复杂系统、计算其中能量分布的文章,他们使用蒙特卡罗模拟法计算多分子系统中分子的能量分布。这相当于是本文所探讨之问题的开始,事实上,模拟退火中常常被提到的一个名词就是Metropolis准则,后面我们还会介绍。
爬山算法
爬山算法是一种十分简单的贪婪搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。
比如上图中,当前解是C点,那么做一个局部搜索,它可能找到G点(注意这里是寻找最大值),,然后再从G点搜索,可能会找到D点,但是D点两侧的值都小于D点,所以它可能就认为D点为最大值,从而陷入了局部最优解。
模拟退火
模拟退火机制则在一定程度上避免陷入局部最优的情况,与爬山算法不同,在局部搜索即使找到一个比当前解差的解,也会以一定的概率跳到这个解上,从而避免了陷入局部最优。
网络上对于爬山算法和模拟退火算法有一个比喻:
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。(非常懒惰,一开始看到“最高的就接受了”)
模拟退火算法:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。
其实我觉得这个比喻对于理解模拟退火算法的局部最优的时候,也会以一定的概率跳出当前值,但我认为这个比喻还不能很好的说明模拟退火的细节,所以我们再接着看下边的流程。
在学习算法流程前,我们再来了解一下,算法中更新解的方式——Metropolis准则判断
Metropolis准则判断
刚才说了,对当前解加随机扰动,得到一个新的解,那要不要接受这个解呢?模拟退火算法则使用的蒙特卡洛判断准则,这也是模拟退火算法的灵魂。
在上式中,P为接受新解的概率。比如,当前解是x_t,对应的系统能量(目标函数)为E_t,局部搜索后,产生新解x_t+1,那要不要接受这个新解呢?判断准则就是上边的这个公式。
根据上边这个公式,我们可以看出(注意此处是寻找最小值):
当新解对应的目标函数小于当前解的目标函数值的时候,一定会接受新解(接受新解的概率为1);
当新解对应的目标函数大于当前解的目标函数值的时候,则以一定的概率接受新解,你再看细点,当其他变量一定的情况下,新解对应的目标函数值超过当前解目标函数值越多,则接受这个新解的概率越小(想一想,这是不是正好符合我们的直观感觉);此外,接受新解的概率还受到降温系数k和初始温度T的影响。
模拟退火算法流程
既然叫模拟退火算法,那就模拟的退火的过程,那算法的流程应该和退火的过程相一致。
回顾一下退火过程,在降温过程中实际上是分为两个层次的:
层次一:每降到一个温度时,会涉及到一个等温过程,见第一部分;
层次二:温度不断下降,直至达到我们指定的温度
那对应的模拟退火算法也是这样的:
一开始要给定一个相对较高的初始温度T,产生一个初始解 x 0 x_0 x0(可以采用随机产生),计算对应的目标函数值 E ( x 0 ) E(x_0) E(x0);
令T=kT,其中k是0-1的值,为温度下降系数
对当前解 x t x_t xt做随机扰动,在其领域内产生一个新解 x ( t + 1 ) x_(t+1) x(t+1),计算出其对应的函数值,根据上述蒙特卡洛判断准则进行判断是否接受新解;
在温度T下,迭代L次扰动和接受过程。(其实这里的L次被叫做马尔科夫链的长度)
判断是否到达终止温度,若到达,则终止,否则返回步骤2;
流程图如下:
在上述算法流程图中,外部的绿色线框则表示退火中的降温过程,内部的橙色线框则表示退火过程中的等温过程,结合最初对金属退火过程的理解是不是更好容易理解一点。
控制参数
该算法涉及到的各项控制参数和各个需要自行给定的变量如下表所示。
参数 | 意义 |
---|---|
T | 初始温度 |
L | 马尔科夫链的长度,即等温过程的迭代次数 |
k | 温度下降速率,为0-1之间的数 |
T 终 T_终 T终 | 算法停止温度 |
x 0 x_0 x0 | 初始解 |
上述很多参数都是需要多次调优,得到最优的参数匹配才可的。
算法特点
- 初始温度和马尔科夫链长度的设置问题。理论上来说,初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也以为这需要耗费更多的计算时间。这个可以在算法里使用控制变量法进行测试。
- 退火问题。温度下降速率k越小,温度下降就越快,对应的迭代次数就越少,这样就可能导致得不到全局最优解;此外,到后期温度衰减很慢,对于这一点,我们可以将温度下降系数k设置为动态的,即随着温度的下降,温度下降系数也不断降低,比如k = 0.99k,以加快后期温度下降,加快算法收敛。
- 扰动算子。扰动不宜过大,这样可能会错过全局最优解。
置为动态的,即随着温度的下降,温度下降系数也不断降低,比如k = 0.99k,以加快后期温度下降,加快算法收敛。 - 扰动算子。扰动不宜过大,这样可能会错过全局最优解。
源码请移步微信公众号“运筹帷幄Q”,关注后回复“模拟退火”即可获得。
模拟退火算法全解(Simulated Annealing)文末有源码相关推荐
- 模拟退火算法(SA, Simulated Annealing)
[注]朋友们,这是个人笔记,有点乱,其实差不多算是全抄了,仅作学习沟通,原内容请见<多目标智能优化算法及其应用>(雷德明等著,2009) [什么是模拟退火算法] 优化算法的一种,是一种启发 ...
- 悬浮框_纯HTML实现某宝优惠券、商品列表和活动悬浮等布局(文末有源码)
简介 最近温习一下HTML5+CSS3的一些特性,准备找个高仿的目标,最后选择了某宝粉丝福利页面,因为这个页面包含的元素比较多.例如:头部品牌信息悬浮.商品属性.优惠券.商品类别等. 实现效果 实现效 ...
- Unity 之 手把手教你实现自己Unity2D游戏寻路逻辑 【文末源码】
Unity 之 手把手教你实现自己Unity2D游戏寻路逻辑 [文末源码] 前言 一,效果展示 二,场景搭建 三,代码逻辑 四,完善场景 五,使用小结 前言 还在看别人的寻路逻辑?保姆级教程,一步步教 ...
- 零基础教你Unity制作像素鸟游戏 【文末源码】
爆肝三天终于写完了,一文教你从零开启Unity制作像素鸟游戏 前言 一,新建目录 二,制作材质 三,场景搭建 四,创建地图 五,制作管道 六,创建主角 七,小鸟动起来 八,游戏状态控制 九,摄像机跟随 ...
- 模拟退火Python实现(Simulated Annealing, SA)
模拟退火算法 一.概念 二.Python代码实现 三.应用: 一.概念 模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis [1] 等人于19 ...
- 绝了!你裁我剪,斯尼帕!文末源码
2018年我入手了一台Swithc『 你裁我剪!斯尼帕』是我玩过的最为欢乐游戏,不过为了安全安全起见,大概只玩了十几关! 因为它的威力不亚与『分手厨房』,需要两人密切配合,但这个过程很容易两个人闹矛盾 ...
- 程序员带你回味童年,一起用C语言做一个“推箱子”玩!【文末源码】
这篇文章是用C语言做了一个推箱子小游戏,实现起来比较简单,和大家一起回味一下童年捧着按键机玩推箱子的日子!文末附带万字源码! 目录 一.写在前面 二.设计思路 1.主界面函数介绍 2.选择界面函数 3 ...
- 商业智能BI全解,一文让你明白才是商业智能(BI)
目前来看,现今世界未来的发展方向基本已经确定,数字化的趋势已经化身为一股不可阻挡的浪潮,各国也都宣布了数字化.数据.数字经济.数字化转型等方面的相关发展政策法规,明确未来的战略方针.同时世界传统经济增 ...
- 【排序算法全解】之 - 插入排序(InsertSort)
目录 1.算法原理 2.分析过程和代码实现 2.1.排序趟数 2.2.每趟排序过程 3.改进与优化 3.1.改进的方法 3.2.改进前后对比测试 4.算法复杂度分析 1.算法原理 把第一个元素当成有序 ...
最新文章
- Data Science Challenge / Competition
- 通信系统概论_移动通信复习资料
- java中catalina.out_如何控制Tomcat的catalina.out的大小
- CF-525E(E. Anya and Cubes) Meet-in-the-Middle
- HDU1850(Nim游戏)
- scp windows 和 linux 远程复制 (双向)
- c#自定义控件做漂亮的列表
- scrapy使用pipeline保存不同的表单Item到数据库、本地文件
- 中国联通回应裁员传闻:严重不实 勿传勿信
- matlab 元胞数组合并(fail)
- PMP第六版十五至尊图记忆方法
- access简述报表的功能_报表的主要功能_access标签报表有什么作用
- C# 将图片转成字符画
- 好心情患者故事:节食暴食反复横跳,我确诊了重度抑郁
- android 警报声音_Android接近警报教程
- php 获取农历,PHP通过新历获取农历日期的方法
- JetsonNano国产套件成功部署YoloV5手把手图解教程
- 为什么说“去中心化”是互联网的未来?
- 测试java实现继承接口案例
- 微服务项目之电商--17.商品规格数据结构SPU和SKU
热门文章
- 体系结构 | 五段流水线 | 流水线技术
- MT6765-Preloader_流程分析--基于android 10
- 机器学习小组知识点17:对数正态分布(Logarithmic Normal Distribution)
- 【干货】Python文件打包 .exe文件反编译
- App Widgets 详解四 RemoteViews、RemoteViewsService和RemoteViewsFactory
- pringboot餐饮点餐系统毕业设计源码301749
- 2876: [Noi2012]骑行川藏
- Bot console WeChat机器人
- 桌面不显示IE浏览器图标
- 使用 JS-SDK 与 FLOW 交互