M模拟退火最短距离问题 Matlab代码 亲测完美运行.docx

M模拟退火最短距离问题 Matlab代码 亲测完美运行.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
M模拟退火最短距离问题 Matlab代码 亲测完美运行

模拟退火算法基于模拟退火算法的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)如果iniLK,则in=in+1并且转向3)。6)如果目标函数值小于ostd,则算法结束;否则,转向2)。1. distance.mfunction [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);%距离矩阵对称? ? endend2. myplot.mfunction []=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);endplot(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.mfunction [newpath,position]=swap(oldpath,number)%对oldpath进行互换操作%number为将要产生的新路径的个数% position为对应newpath互换的位置m=length(oldpath);%城市的个数newpath=zeros(number,m);position=sort(randi(m,number,2),2);%随机产生交换的位置fori=1:numbernewpath(i,:)=oldpath;%交换路径中选中的城市newpath(i,position(i,1))=oldpath(position(i,2));newpath(i,position(i,2))=oldpath(position(i,1));end4. pathfare.mfunction[objval]=pathpare(fare,path)%计算路径path的目标函数值objval=pathpare(fare,path)%path为1到m的排列,代表城市的访问顺序[m,n]=size(path);objval=zeros(1,m);fori=1:m? ? for j=2:n? ?? ???objval(i)=objval(i)+fare(path(i,j-1),path(i,j));? ? end? ? objval(i)=objval(i)+fa

文档评论(0)

有一二三 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档