模拟退火算法求解TSP问题(matlab实现)

TSP问题:假设有六个城市,一销售商从其中的某一城市出发,不重复地走完其余5个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。六个城市坐标为:城市1(87,7)、城市2(91,38)、城市3(83,46)、城市4(71,44)、城市5(64,60)、城市6(68,58)。

clc;
clear all;
%输入城市坐标
city=[87,7;
    91,38;
    83,46;
    71,44;
    64,60;
    68,58];
%将城市坐标转化成距离矩阵
n=length(city);
for i=1:n
    for j=i+1:n
        d(i,j)=sqrt(sum((city(i,:)-city(j,:)).^2));
        d(j,i)=d(i,j);
    end
end
%%随机生成一个初始解
path0=randperm(n); %不是闭回路的初始路线
path0_cycle=[path0,path0(1)];%初始路线形成闭回路
path0_long=0;
for i=1:length(path0_cycle)-1
    path0_long=path0_long+d(path0_cycle(i),path0_cycle(i+1));%初始路线长度
end
%%退火过程
%参数设置
alpha=0.95;        %降温系数
T=1000;           %初始温度
Ter=1e-4;         %终止温度
%开始降温
t=T;%现在温度
while t>Ter
    path=randperm(n);
   %{
随机生成新解;其实还有其他的方式生成新解
比如随机选择两个城市交换他们的位置,称为邻域扰动,
该题解空间比较小,随机生成新解也不影响结果
    %}
    path_cycle=[path,path(1)];
    path_long=0;
    for i=1:length(path_cycle)-1
        path_long=path_long+d(path_cycle(i),path_cycle(i+1));%新路线路线长度
    end
    df=path_long-path0_long;
    if df<0
        path0=path;
        path0_long=path_long;
    else 
        p=exp(-df/t);
        if rand<p
            path0=path;
            path0_long=path_long;
        end
    end
    t=t*alpha;
end
disp(['最短路径:',num2str(path0)])
disp(['最短路径对应距离:',num2str(path0_long)])

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值