模拟退火算法之旅行商(TSP)问题matlab实现

模拟退火算法之旅行商(TSP)问题matlab实现

关于模拟退火算法的理论部分,小编就不多做赘述,请看下图(如有问题请百度):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
话不多说,请看例题:
一位旅行者从出发点(200,200)出发,要求经过30个目标点,并且每个点只能经过一次,最终经过所有点后回到起点。 要求:为旅行者制定一条最短路径。
下面是利用模拟退火算法求TSP问题的代码:
由于小编比较懒,不想挨个敲坐标,就利用matlab中rand()函数自动生成30个点的坐标。如果你有坐标,换成自己的坐标就行了。
生成坐标代码如下:

x=randi([0,150],30,1);
y=randi([0,120],30,1);     %%%一时找不到数据,就自动生成了三十个坐标点(xi,yi),i=1,2...,30;
sj0=[x,y];
ss0=[200,200];             %%%出发点选取(100100);
sj=[ss0;sj0;ss0];           %%%将出发点加在30个点的开始和结束;

模拟退火求TSP问题的matlab源码

%%%(1)计算各点之间的距离,存储于距离矩阵d中
d=zeros(length(sj));       %%%距离矩阵初始化;
for i=1:length(sj)-1
    for j=i+1:length(sj)
        d(i,j)=sqrt((sj(i,1)-sj(j,1))^2+(sj(i,2)-sj(j,2))^2);
    end
end
d=d+d';
 
%%%2)求一个较好的初始解
path=[];                 %%%路线初始化;
long=inf;                %%%路线长度初始化;
rand('state',sum(clock));
for j=1:100000
    path0=[1,1+randperm(length(sj0)),length(sj)];
    temp=0;
    for i=1:length(sj)-1
        temp=temp+d(path0(i),path0(i+1));
    end
    if temp<long
        path=path0;
        long=temp;
    end
end
%%%3)退火过程
L=50000;
at=0.999;  %%%降温系数
T=100;     %%%初始温度
e=0.1^30;  %%%终止温度
long_temp=[];
m=0;
for k=1:L
    c=1+randperm(length(sj0),2);
    c=sort(c);
    c1=c(1);
    c2=c(2);
    df=d(path(c1-1),path(c2))+d(path(c1),path(c2+1))-d(path(c1-1),path(c1))-d(path(c2),path(c2+1));%%%代价函数增量
    if df<0     %%%接受准则
        path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:length(sj))];
        long=long+df;
    elseif exp(-df/T)>=rand   %%% 概率接受
        path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:length(sj))];
        long=long+df;
    end
    t=0;
    for i=1:length(sj)-1
        t=t+d(path(i),path(i+1));
    end
    long_temp=[long_temp,t];
    T=at*T;
    if T<e
        break;
    end
    m=m+1;
end
path;
long
subplot(2,1,1)
xx=sj(path,1);
yy=sj(path,2);
plot(xx,yy,'-*')
subplot(2,1,2)
plot(long_temp,'-')

在这里插入图片描述
总结:小编通过对算法和代码进行多次运行。对算法进行分析,小编个人看法,模拟退火算法在求解TSP问题上有许多优势,但是,在模拟退火过程中,由于新的状态完全依赖于上一个状态,并且在新状态接受过程中,需要满足接受概率。因此,对于同一个问题,每次运行的结果也略有不同。同时,降温速度的快慢,需要具体情况具体把握。
就本文的问题欢迎感兴趣的小伙伴私聊,同时,小编存在的问题欢迎大家随时指正。最后,喜欢小编的小伙伴点个赞,加个关注吧!小编将持续更新

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篱落~~成殇~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值