![196d91f3795916139e582c4467b72367.png](https://i-blog.csdnimg.cn/blog_migrate/4ba418f5a12706fb9d0fb3ab89081084.png)
Hello大家好,今天为各位小伙伴讲解的是使用模拟退火(SA)算法求解旅行商(TSP)问题。
一 | 模拟退火图片演示
首先为了让各位能够对模拟退火算法有一个直观的视觉冲击,现在我们想要找到下面这幅图的极大值点,很明显这幅图中有许多局部极值点,如果仅仅采用简单的爬山算法很容易陷入局部最优。
![6a6c6923acc1d848ccbade27787ef3a3.gif](https://i-blog.csdnimg.cn/blog_migrate/fc3c80f535ffac658f24e86922f4602f.gif)
(图片来源:维基百科)
这时候我们就想如果在搜索过程中陷入了局部最优,那么我们有没有什么办法从这个局部最优点“逃走”呢?
办法总比困难多,既然在搜索过程中已经陷入了局部最优,反正按照常规的思路,陷入局部最优后如果继续进行搜索,基本上找不到比这个局部最优解更好的解。
如果一直找不到比局部最优解更好的解,(PS:常规的思维是不如这个局部最优解好,我们就不对当前解进行更新),那么很明显最终的搜索结果只能是这个局部最优解。
但是,我想各位小伙伴已经注意到了,常规思维是不如这个局部最优解好,我们就不对当前解进行更新。
那么我们就不采用常规思维,我们就来点不一样的。我们就尝试着接受一下比局部最优解更差的解作为当前解(PS:当然不是说接受比局部最优解差的太多的解),然后我们就对当前解的邻域进行搜索,一旦在当前解的这个邻域中搜索到一个比局部最优解更好的解,那我们是不是赚了,此时是不是就逃离了局部最优了,这其实就是模拟退火的基本思路。
首先来展示一下使用SA求解TSP问题的动图。
![6b27347de179749bc53c297543995f34.png](https://i-blog.csdnimg.cn/blog_migrate/d5694b601c8d2e2fae68f6e9beb28281.png)
二 | 旅行商(TSP)问题
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
三 | 算法设计
01 | 模拟退火算法思想
模拟退火算法的核心思想就是以一定概率接受比当前解更差的解,然后用这个更差的解继续搜索,其实这个思想很容易理解。
02 | 编码
编码采用常规的整数编码,如果城市数目为N,那么解就可以表达为1~N的随机排列,用MATLAB中的randperm(N)进行表示。
03 | 邻域结构
(1)交换结构
比如说有6个城市,当前解为123456,我们随机选择两个位置,然后将这两个位置上的元素进行交换。
比如说,交换2和5两个位置上的元素,则交换后的解为153426。
(2)逆转结构
有6个城市,当前解为123456,我们随机选择两个位置,然后将这两个位置之间的元素进行逆序排列。
比如说,逆转2和5之间的所有元素,则逆转后的解为154326。
(3)插入结构
有6个城市,当前解为123456,我们随机选择两个位置,然后将这第一个位置上的元素插入到第二个元素后面。
比如说,第一个选择2这个位置,第二个选择5这个位置,则插入后的解为134526。
在搜索过程中,我们将以上三种邻域结构赋予不同的权重,然后采用轮盘赌的方式选择究竟使用哪个邻域结构。
04 | 接受准则
前面我们说到模拟退火算法的核心思想就是以一定概率接受比当前解更差的解,那么这个概率究竟如何计算呢?
比如说当前解用Scurr表示,当前解Scurr的某个邻域产生的一个新解用Snew表示。用f(Scurr)表示当前解的总距离,f(Snew)表示新解的总距离。我用下面这个伪代码表示接受准则。这里需要注意的是T表示当前温度,因为在外层循环中每迭代一次后,温度T都会降低,即温度T需要乘一个小于1的冷却因子来降低温度,这就体现了“退火”的思想。
if f(Snew)<=f(Scurr)
Scurr=Snew;
else
delta=(f(Snew)-f(Scurr))/f(Scurr);
p=exp(-T/delta);
if rand<=p
Scurr=Snew;
end
end
05 | 模拟退火求解TSP问题流程图
![f43806b0e205af5792fe8bef2495d49a.png](https://i-blog.csdnimg.cn/blog_migrate/5e8d501ab42bec65196a2cfe741d3d86.jpeg)
更多资源尽在微信公众号:优化算法交流地
往期精选
- 蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题(附MATLAB代码)
- 遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码
- 禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版附 MATLAB代码)
- 节约算法(CW)构造带时间窗的车辆路径(VRPTW)问题初始解MATLAB代码
- 遗传算法求解0-1背包问题(附matlab源代码)
- 多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)
- 多目标优化 | NSGA-II进阶教程(全网首个三目标优化教程)
- 遗传算法(GA)求解VRPTW问题(附MATLAB代码)
- 机器学习 | 基于遗传算法的BP神经网络优化算法(附MATLAB代码)
- 遗传算法求解车间调度问题(附MATLAB代码)
- 多目标优化 | NSGA-II
- word转换为pdf后图片失真的解决办法(全网首发)
- 机器学习 | 简单实现Bp神经网络
- 二维装箱问题之BL法修正版(附MATLAB代码)
- 快速入门文献管理软件-EndNote X9
- 最小二乘法(附MATLAB代码)
- NSGA-II多目标优化算法讲解(附MATLAB代码)
- 基于人工势场法的机器人二维路径规划(附MATLAB代码)
- 基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)
- 蚁群算法通俗讲解(附MATLAB代码)
- 混合粒子群算法通俗讲解(附MATLAB代码)