模拟退火算法寻方程最优解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;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值