模拟退火算法详解、误区及matlab实现

模拟退火算法

        原理:模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。[1]

一、具体过程及流程图

如果是要对于问题来说求解其目标函数的最小值

(m为温度迭代的计数,n为该温度下迭代次数的计数)

n_max、T_end、T0、a均需要提前设置好

1)初始化:首先要确定评价标准,初始化就是初步给定解的某个值(为使结果准确通过给出的初始解最好符合各种约束),得到初始解a1,然后通过初始解得到初始评价函数的大小f1。同时初始温度和迭代次数m和n(=1)都提前设定好

2)通过某种方法产生新解(扰动):对解a1按照某种方法添加扰动使其变成新解a2,然后得到新解的评价函数大小f2

3)比较f1和f2的大小(也就是\Deltaf),如果\Delta f \leq 0,那么转步骤4,否则产生一个随机数(0-1),然后将其与当前温度下的exp(-ΔT/T)进行比较,如果小于则同样接受转步骤4,如果大于就转步骤5

   此时

4)用新解a2和其评价函数f2替换解a1和评价函数f1,n=n+1,转到步骤6

5)保持原有的解a1和评价函数f1,n=n+1,转步骤6

6)判断n是否大于提前设置的单一温度下的迭代次数n_max,如果小于转步骤2,如果大于转步骤7

7)记录该温度下的最优解a1和f1,并储存,然后找到已经迭代过的温度下的历史最优解a1_max和f1_max,通过T'=aT使温度下降

8)判断T'是否小于T_end,如果小于等于则跳出,以当前a1和f1作为下一个温度的初始解,否则转步骤2

二、需要注意的问题

1、初始温度T0不要过高,否则会导致初始解极其不稳定,因为T越大exp(-ΔT/T)的值就越大,使得不合理的解极其容易被接受。

2、初始解的生成尽量在合理的范围内,会使迭代次数大大减小。

3、衰减系数在0-1之间,过大会导致衰减速度过慢,迭代次数大大增加;过小则会使温度下降过快,容易陷入局部最优。

4、每个温度下的迭代次数设置要合理,通常在100-1000之间,https://blog.csdn.net/weixin_43848614/article/details/107974638这篇文章中TSP问题的求解并不完善,缺少这一部分。

5、扰动产生的方法并不是重新产生新解,而是在原有解的基础上产生新解,否则会导致迭代过程随机性过大使算法不合理。

三、案例代码

(1)TSP问题

代码:https://download.csdn.net/download/weixin_41971010/16771700?spm=1001.2014.3001.5503

对于TSP问题模拟退火非常好用,下图是30个点的tsp问题,经过一定的改善大致在50步就能够收敛,如下图所示

 

四、参考

[1]https://baike.baidu.com/item/%E6%A8%A1%E6%8B%9F%E9%80%80%E7%81%AB%E7%AE%97%E6%B3%95/355508?fr=aladdin

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是好人的墨叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值