1 算法介绍
1.1 TSP介绍
“旅行商问题”(Traveling Salesman Problem,TSP)可简单描述为:一位销售商从n个城市中的某一城市出发,不重复地走完其余n-1个城市并回到原出发点,在所有可能路径中求出路径长度最短的一条。
旅行商的路线可以看作是对n城市所设计的一个环形,或者是对一列n个城市的排列。由于对n个城市所有可能的遍历数目可达(n-1)!个,因此解决这个问题需要O(n!)的计算时间。而由美国密执根大学的Holland教授发展起来的遗传算法,是一种求解问题的高效并行全局搜索方法,能够解决复杂的全局优化问题,解决TSP问题也成为遗传算法界的一个目标。
1.2 模拟退火算法
模拟退火算法在处理全局优化、离散变量优化等困难问题中,具有传统优化算法无可比拟的优势。模拟退火算法的思想最早由Metorpolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成:
1)*加温过程:*其目的是增强粒子的热运动,使其偏离平衡位置。当温度足够高时,固体将熔为液体,从而消除系统原先存在的非均匀状态。
2)*等温过程:*对于与周围环境交换热量而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡状态。
3)*冷却过程:*使粒子热运动减弱,系统能量下降,得到晶体结构。其中,加温过程对应算法的设定初温,等温过程对应算法的Metropolis抽样过程,冷却过程对应控制参数的下降。这里能量的变化就是目标函数,我们要得到的最优解就是能量最低态。其中Metropolis准则是SA算法收敛于全局最优解的关键所在,Metropoli、准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷阱。
2 部分代码
%%%%%%%%%%%%%%%%%%%%%%模拟退火算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;... 3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;... 2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;... 3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;... 3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;... 2370 2975]; %31个省会城市坐标 n=size(C,1); %TSP问题的规模,即城市数目 T=100*n; %初始温度 L=100; %马可夫链长度 K=0.99; %衰减参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%城市坐标结构体%%%%%%%%%%%%%%%%%%%%%%%%%% city=struct([]); for i=1:n city(i).x=C(i,1); city(i).y=C(i,2); end l=1; %统计迭代次数 len(l)=func3(city,n); %每次迭代后的路线长度 figure(1); while T>0.001 %停止迭代温度 %%%%%%%%%%%%%%%%多次迭代扰动,温度降低之前多次实验%%%%%%%%%%%%%%% for i=1:L %%%%%%%%%%%%%%%%%%%计算原路线总距离%%%%%%%%%%%%%%%%%%%%%%%%% len1=func3(city,n); %%%%%%%%%%%%%%%%%%%%%%%%%产生随机扰动%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%随机置换两个不同的城市的坐标%%%%%%%%%%%%%%%%% p1=floor(1+n*rand()); p2=floor(1+n*rand()); while p1==p2 p1=floor(1+n*rand()); p2=floor(1+n*rand()); end tmp_city=city; tmp=tmp_city(p1); tmp_city(p1)=tmp_city(p2); tmp_city(p2)=tmp; %%%%%%%%%%%%%%%%%%%%%%%%计算新路线总距离%%%%%%%%%%%%%%%%%%%% len2=func3(tmp_city,n); %%%%%%%%%%%%%%%%%%新老距离的差值,相当于能量%%%%%%%%%%%%%%%%% delta_e=len2-len1; %%%%%%%%%%%%新路线好于旧路线,用新路线代替旧路线%%%%%%%%%%%%%% if delta_e<0 city=tmp_city; else %%%%%%%%%%%%%%%%%%以概率选择是否接受新解%%%%%%%%%%%%%%%%% if exp(-delta_e/T)>rand() city=tmp_city; end end end l=l+1; %%%%%%%%%%%%%%%%%%%%%%%%%计算新路线距离%%%%%%%%%%%%%%%%%%%%%%%%%% len(l)=func3(city,n); %%%%%%%%%%%%%%%%%%%%%%%%%%%温度不断下降%%%%%%%%%%%%%%%%%%%%%%%%%% T=T*K; for i=1:n-1 plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-'); hold on; end plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-'); title(['优化最短距离:',num2str(len(l))]); hold off; pause(0.005); end figure(2); plot(len) xlabel('迭代次数') ylabel('目标函数值') title('适应度进化曲线')
3 仿真结果
4 参考文献
[1]夏仁强. 多种群自适应模拟退火遗传算法求解TSP问题[J]. 毕节学院学报, 2008(04):82-86.
[2]郭晓利, 李航宇. 模拟退火遗传算法求解TSP问题[J]. 福建电脑, 2014, 000(005):15-16.