M模拟退火最短距离问题 Matlab代码 亲测完美运行
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟退火算法
基于模拟退火算法的TSP问题求解具体步骤如下:
1)随机产生一个初始解path(作为当前最优路径),计算目标函数值pathfare(fare,path)=e0,并设置初始温度t0,内循环终止方差istd,外循环终止方差ostd降温系数lam,温度更新函数tk=lam*tk-1,并令k=1,输入各城市坐标coord,计算城市间的距离fare。
2)根据控制参数更新函数来控制温度的下降过程,给定最大循环步数iLK,设置循环计数器的初始值in=1。
3)对当前的最优路径作随机变动,产生一个新路径newpath,计算新路径的目标函数值pathfare(fare,newpath)=e1和目标函数值的增量e1-e04)根据Metropolis准则,如果增量(e1-e0)<0,则接受新产生的路径newpath作为当前最优路径;如果(e1-e0)>=0,则以公式(1)来决定新路径newpath是否代替path。rand()随机产生一个在[0,1]之间的随机数。exp[-(e1-e0)/t]>rand()
4)如果目标函数值小于istd,则直接跳出内循环。
5)如果in 6)如果目标函数值小于ostd,则算法结束;否则,转向2)。 1. distance.m function [fare]=distance(coord) %coord为各城市的坐标 %fare为城市间的距离矩阵 [~,m]=size(coord); %m为城市的个数 fare=zeros(m); for i=1:m %外层为行 for j=1:m %内层为列 fare(i,j)=(sum((coord(:,i)-coord(:,j)).^2))^0.5; fare(j,i)=fare(i,j); %距离矩阵对称 end end 2. myplot.m function []=myplot(path,coord,pathfar) %做出路径的图形 %path为要做图的路径,coord为各个城市的坐标 %pathfar为路径path对应的费用 len=length(path); clf; hold on; title(['近似最短路径下的目标函数值',num2str(pathfar)]); xlabel('各城市坐标x'); ylabel('各城市坐标y'); plot(coord(1,:),coord(2,:),'ok'); pause(0.4); for ii=2:len plot(coord(1,path([ii-1,ii])),coord(2,path([ii-1,ii])),'-b'); x=sum(coord(1,path([ii-1,ii])))/2; y=sum(coord(2,path([ii-1,ii])))/2; text(x,y,['(',num2str(ii-1),')']);pause(0.4); end plot(coord(1,path([1,len])),coord(2,path([1,len])),'-b'); x=sum(coord(1,path([1,len])))/2; y=sum(coord(2,path([1,len])))/2; text(x,y,['(',num2str(ii-1),')']); pause(0.4);hold off; 3. swap.m function [newpath,position]=swap(oldpath,number) %对oldpath进行互换操作 %number为将要产生的新路径的个数 % position为对应newpath互换的位置 m=length(oldpath); %城市的个数 newpath=zeros(number,m); position=sort(randi(m,number,2),2); %随机产生交换的位置for i=1:number newpath(i,:)=oldpath; %交换路径中选中的城市newpath(i,position(i,1))=oldpath(position(i,2)); newpath(i,position(i,2))=oldpath(position(i,1)); end 4. pathfare.m function[objval]=pathpare(fare,path) %计算路径path的目标函数值objval=pathpare(fare,path) %path为1到m的排列,代表城市的访问顺序 [m,n]=size(path); objval=zeros(1,m); for i=1:m for j=2:n objval(i)=objval(i)+fare(path(i,j-1),path(i,j)); end objval(i)=objval(i)+fare(path(i,n),path(i,1)); end 5. 主程序 clear all; %输入各城市坐标 coord=[0.6683,0.6195,0.4,0.2439,0.1707,0.2293,0.5171,0.8732,0. 6878,0.8488; 0.2536,0.2634,0.4439,0.1463,0.2293,0.761,0.9414,0.6536,0.5219, 0.3609]; %参数的设定 t0=1; %初始温度 iLK=20; %内循环最大迭代次数 oLK=50; %外循环最大迭代次数 lam=0.95; %降温系数 istd=0.001; %内循环结束标准 ostd=0.001; %外循环结束标准 ilen=5; %内循环保存的目标函数值的个数 olen=5; %外循环保存的目标函数值的个数 [~,m]=size(coord); %城市的个数 fare=distance(coord); %计算城市间的距离矩阵 path=1:m; %产生初始解(作为当前最优路径)pathfar=pathfare(fare,path); %计算目标函数值 ores=zeros(1,olen); %外循环保存的目标函数值 e0=pathfar;