模拟退火算法寻方程最优解MATLAB,模拟退火算法求解TSP问题(带MATLAB程...

模拟退⽕算法寻⽅程最优解MATLAB,模拟退⽕算法求解TSP问
题(带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()        公式(1)5)如果⽬标函数值⼩于istd,则直接跳出内循环。6)如果in
彩石中学有5个程序,其中mytsp是主程序。(程序是从⽹上整理的,精度不太好)
mytsp.m
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;
t=t0;
for out=1:oLK%外循环
多能干细胞ires=zeros(1,ilen);%内循环保存的⽬标函数值
for in=1:iLK%内循环
[newpath,~]=swap(path,1);%产⽣新路径
e1=pathfare(fare,newpath);%计算⽬标函数值r=min(1,exp(-(e1-e0)/t));%metropolis准则函数if rand
path=newpath;
城市肌理
e0=e1;
end
ires=[ires(2:end),e0];
if std(ires,1)
break;
end
苏州通安事件end
ores=[ores(2:end),e0];
if std(ores,1)
break;
韩金凤
end
t=lam*t;
end
pathfar=e0;
fprintf('近似最优路径为:\');
disp(path);
fprintf('近似最优路径长度\tpathfare=');
disp(pathfar);
myplot(path,coord,pathfar);
distance.m
function [fare]=distance(coord)
%coord为各城市的坐标
%fare为城市间的距离矩阵
[~,m]=size(coord);
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
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
swap.m
function [newpath,position]=swap(oldpath,number) %number为将要产⽣的新路径的个数
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
myplot.m
function []=myplot(path,coord,pathfar)
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;

本文发布于:2024-09-22 02:00:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/592250.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:循环   路径   城市   函数   计算   温度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议