![802867deebe96adbf785fbc5eec421c4.gif](https://i-blog.csdnimg.cn/blog_migrate/ebabcfc1b09f9f8b3ae6296327d3820c.gif)
模拟退火算法概述
模拟退火算法(Simulated Annealing,简称SA)的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成:
加温过程。其目的是增强粒子的热运动,使其偏离平衡位置。当温度足够高时,固体将熔为液体,从而消除系统原先存在的非均匀状态
等温过程。对于与周围环境交换热量而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行的,当自由能达到最小时,系统达到平衡状态。
冷却过程。使粒子热运动减弱,系统能量下降,得到晶体结构。
加温过程相当于对算法设定初值,等温过程对应算法的Metropolis抽样过程,冷却过程对应控制参数的下降。这里能量的变化就是目标函数,我们要得到的最优解就是能量最低态。其中Metropolis准则是SA算法收敛于全局最优解的关键所在,Metropolis准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷阱。
SA算法的Metropolis准则允许接受一定的恶化解,具体来讲,是以一定概率来接受非最优解。举个例子,相当于保留一些“潜力股”,使解空间里有更多的可能性。对比轮盘赌法,从概率论来讲,它是对非最优解给予概率0,即全部抛弃。
模拟退火本身是求一个最小值问题,但可以转化为求最大值问题,只需要对目标函数加个负号或者取倒数。
算法步骤
![000be6d67ba8399a7ddc7ac1b8f25ef7.png](https://i-blog.csdnimg.cn/blog_migrate/755f908b979e19515ae3d699ec5520f8.png)
![b25cfb7aae4109a09a6b76e91fd8ab1f.png](https://i-blog.csdnimg.cn/blog_migrate/0c717483e8b57bfe6ceaf7ae6db8d4c2.png)
其中,P为算法选择较差解的概率;T 为温度的模拟参数;
![26bf1cfa397cb27f9ea4823b4e45f620.png](https://i-blog.csdnimg.cn/blog_migrate/8d796b0b0aa625511e948ce82f607cc2.png)
当T很大时,,此时算法以较大概率选择非当前最优解;P的值随着T的减小而减小;
当T趋于0时,,此时算法几乎只选择最优解,等同于贪心算法。
算法特点
• 与遗传算法、粒子群优化算法和蚁群算法等不同,模拟退火算法不属于群优化算法,不需要初始化种群操作。
• 收敛速度较慢。原因在于
1)它初始温度一般设定得很高,而终止温度设定得低,这样才符合物体规律,认为物质处于最低能量平衡点;
2)它接受恶化解,并不是全程都在收敛的过程中。这一点可以类比GA中的变异,使得它不是持续在收敛的,所以耗时更多一些。
• 温度管理(起始、终止温度)、退火速度(衰减函数)等对寻优结果均有影响。比如T的衰减速度如果太快,就会导致可能寻找不到全局最优解。
模拟退火算法MATLAB实现
【例1】一元/多元函数优化
一元函数:x = [1,2]范围内 y = sin(10*pi*x) / x 的极值
![6400d72803a613f0fe5a74519cc413f7.png](https://i-blog.csdnimg.cn/blog_migrate/34a73b3506f68ae02d500d83d6969d3a.png)
二元函数:
在x,y都是[-5,5]范围内找z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20 的极值
![3538939f1ad4aad47c9f6be94bbe57b1.png](https://i-blog.csdnimg.cn/blog_migrate/170194c6c438a3b07b1023c2fc60a4cb.png)
【例2】TSP问题
我们的TSP中城市是自己虚拟的14座城市。
main.m:
![1a644269dfbe133c6f35eda3ab15a44d.png](https://i-blog.csdnimg.cn/blog_migrate/3f1dd9e3c26e0ff8493b921ad4814e3d.png)
![698e3f7f3563701f33abdbc0e8367dbe.png](https://i-blog.csdnimg.cn/blog_migrate/10b325eb4c877d467491b189415df028.png)
![0625dc33e548e523a9d3a697fe3ab427.png](https://i-blog.csdnimg.cn/blog_migrate/11f3c9f15e982a62324d66add0453ffd.png)
计算距离的函数Distance.m:
![402014b67e3b046f0f1fb0174da30a14.png](https://i-blog.csdnimg.cn/blog_migrate/420267dc2106c658750742a8191c828d.png)
画出路径的函数DrawPath.m:
![511228c5e39105d437e3c61aedda3bad.png](https://i-blog.csdnimg.cn/blog_migrate/d16ffd23d763ad51651eef954da0f43c.png)
输出路径函数OutputPath.m:
![7dd16c7c2cb4361272cf4c95dee1238f.png](https://i-blog.csdnimg.cn/blog_migrate/9487a74b0c254b43a30ed52052112a29.png)
PathLength.m:
![71298b42e770185f3eff6433e07447b7.png](https://i-blog.csdnimg.cn/blog_migrate/9cb00b567a9005db1921f1623f661806.png)
增加随机扰动产生新解NewAnswer.m:
![71298b42e770185f3eff6433e07447b7.png](https://i-blog.csdnimg.cn/blog_migrate/9cb00b567a9005db1921f1623f661806.png)
我们的做法是随机产生两个城市让他们交换位置,从而得到一个新的路径。当然,这只是这个问题的一个做法,也有其他“增加随机扰动”的做法,而且对于多元函数问题更加简单,只要在当前解的附近增加一些小的值即可。
Metropolis准则的实现:
![eb0ccd3bc4d0da5f5c0668f6272dca54.png](https://i-blog.csdnimg.cn/blog_migrate/f03549d7763dfd2de0a29a5d59049d04.png)
程序结果:
![0d5b22273079d7e48c5af51f6de2d8c9.png](https://i-blog.csdnimg.cn/blog_migrate/8869b437a90e8bc31a7aff9e2f8c71e3.png)
![2d253e53d4fdc63e36a3c69ae29aac5f.png](https://i-blog.csdnimg.cn/blog_migrate/a75b6d3374a2279430db4aa31951687a.png)
![a2b338fb19599432197dacf7d6bda22f.png](https://i-blog.csdnimg.cn/blog_migrate/668780b17cbd0d6dd49ae868ef491457.png)
【例3】
选择30个点作为仿真研究对象,它们在坐标平面的坐标 (Location)如表1所示。
![b3ad315c1ba639513e1d4b7de63412bb.png](https://i-blog.csdnimg.cn/blog_migrate/8fbc684f0598a03790083ab735616c74.png)
采用上述程序中随机排列的方法产生初始路径 ,其 排列结果如图1所示 。选择接受函数为Boltzmann 概率分布函数,温度的起始值为70,温度下降律为0.5,经过运行最终得到结果如图2所示,由该 图可知经过优化后找到了最小路径。
![8903d7a6d250ae665e6db5b58fc1582c.png](https://i-blog.csdnimg.cn/blog_migrate/e3ec13bd9d4a9b146f6537f26bff1791.png)
![4ceb65c73e2090dad84c6f63daa5f9ee.png](https://i-blog.csdnimg.cn/blog_migrate/dca3e3f021d8ceea167fb954f05abf73.png)
参考资料
曲 强 ,陈 雪 波,基 于 M A TL A B 的模拟 退火算 法 的实现
CSDN博主,奔跑的Yancy,模拟退火(Simulated Annealing, SA)算法简介与MATLAB实现
- End -
模友们可能已经发现:现在公众号推送文章的顺序,已经不会按时间排列了。这种变化,可能会让各位模友错过我们每天的推送。
所以,如果你还想像往常一样,聚焦数模乐园,就需要将“数模乐园”标为星标公众号,同时在阅读完文章后,别忘了给一个“在看”哦。
星标步骤
(1)点击页面最上方“数模乐园”,进入公众号主页
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
![6fb4dd5b4e4a543638ccb1fd0a455f50.gif](https://i-blog.csdnimg.cn/blog_migrate/ba318d3e4d7bc2bb8ecac304fa26c1a2.gif)
![a5d4cce4d6a53fab9554995cc46311ec.png](https://i-blog.csdnimg.cn/blog_migrate/635321d31eeee1e913e1f3f60f005949.jpeg)
扫码关注我们
![7e8fe50d842ebe5413049b811133de94.png](https://i-blog.csdnimg.cn/blog_migrate/aed02db329375d89292f7f2a21981d6b.jpeg)
2020夏令营QQ交流群
![acfa7fccb9da728b4dc7eec6cd72049b.png](https://i-blog.csdnimg.cn/blog_migrate/4b14b18bb6cabc0bcd6065256dd23bf1.jpeg)
![2bda43041f1b507a2405bdfda5e01ce3.gif](https://i-blog.csdnimg.cn/blog_migrate/cb8312a4b8e4517c12f18cf4f51a2ade.gif)
球分享
![2bda43041f1b507a2405bdfda5e01ce3.gif](https://i-blog.csdnimg.cn/blog_migrate/cb8312a4b8e4517c12f18cf4f51a2ade.gif)
球点赞
![2bda43041f1b507a2405bdfda5e01ce3.gif](https://i-blog.csdnimg.cn/blog_migrate/cb8312a4b8e4517c12f18cf4f51a2ade.gif)
球在看