matlab基于模拟退火算法求解TSP问题

Posted 博主QQ2449341593

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab基于模拟退火算法求解TSP问题相关的知识,希望对你有一定的参考价值。

文章目录

 

一,理论基础

二,TSP问题介绍

TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。

三,思路和步骤

1.算法流程
模拟退火算法求解TSP问题的流程图如图1所示。

图1 模拟退火算法求解流程图

在这里插入图片描述
2.模拟退火算法实现

控制参数的设置

需要设置的主要控制参数有降温速率q qq、初始温度T 0 T_0T0​、结束温度T e n d T_{end}Tend​以及链长L LL。

初始解

对于n nn个城市的TSP问题,得到的解就是对1~n nn的一个排序,其中每个数字对应城市的编号。

解变换生成新解

通过对当前解S 1 S_1S1​进行变换,产生新的路径数组即新解,这里采用的变换是产生随机数的方法来产生将要交换的两个城市,用二邻域变换法产生新的路径,即可行的新解S 2 S_2S2​。

Metropolis准则

降温

四,MATLAB程序实现

  • 计算距离矩阵
function D = Distance(citys)
%% 计算两两城市之间的距离
% 输入 citys  各城市的位置坐标
% 输出 D  两两城市之间的距离

n = size(citys,1);
D = zeros(n,n);
for i = 1:n
   for j = i+1:n
       D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
       D(j,i) = D(i,j);
   end
end
  • 初始解
S1=randperm(N);			% 随机产生一个初始路线
  •  
  • 生成新解
function S2 = NewAnswer(S1)
%% 输入
% S1:当前解
%% 输出
% S2:新解

N = length(S1);
S2 = S1;                
a = round(rand(1,2)*(N-1)+1); %产生两个随机位置 用来交换
W = S2(a(1));
S2(a(1)) = S2(a(2));
S2(a(2)) = W;         %得到一个新路线
  •  
  • Metropolis准则
function [S,R] = Metropolis(S1,S2,D,T)
%% 输入
% S1:  当前解
% S2:   新解
% D:    距离矩阵(两两城市的之间的距离)
% T:    当前温度
%% 输出
% S:   下一个当前解
% R:   下一个当前解的路线距离

R1 = PathLength(D,S1);  %计算路线长度
N = length(S1);         %得到城市的个数

R2 = PathLength(D,S2);  %计算路线长度
dC = R2 - R1;   %计算能力之差
if dC < 0       %如果能力降低 接受新路线
    S = S2;
    R = R2;
elseif exp(-dC/T) >= rand   %以exp(-dC/T)概率接受新路线
    S = S2;
    R = R2;
else        %不接受新路线
    S = S1;
    R = R1;
end
  • 画路线轨迹图
function DrawPath(Route,citys)
%% 画路径函数
%输入
% Route  待画路径   
% citys  各城市坐标位置

figure
plot([citys(Route,1);citys(Route(1),1)],...
     [citys(Route,2);citys(Route(1),2)],'o-');
grid on

for i = 1:size(citys,1)
    text(citys(i,1),citys(i,2),['   ' num2str(i)]);
end

text(citys(Route(1),1),citys(Route(1),2),'       起点');
text(citys(Route(end),1),citys(Route(end),2),'       终点');

  •  
  • 输出路径函数
function p = OutputPath(R)
%% 输出路径函数
% 输入:R 路径
R = [R,R(1)];
N = length(R);
p = num2str(R(1));
for i = 2:N
    p = [p,'—>',num2str(R(i))];
end
disp(p)
  • 可行解路线长度函数
function Length = PathLength(D,Route)
%% 计算各个体的路径长度
% 输入:
% D     两两城市之间的距离
% Route 个体的轨迹

Length = 0;
n = size(Route,2);
for i = 1:(n - 1)
    Length = Length + D(Route(i),Route(i + 1));
end
Length = Length + D(Route(n),Route(1));
  • 模拟退火算法主函数
    模拟退火算法参数设置如下所列。

在这里插入图片描述
主函数代码如下:

 %% I. 清空环境变量
clear all
clc

%% II. 导入城市位置数据
X = [16.4700   96.1000
     16.4700   94.4400
     20.0900   92.5400
     22.3900   93.3700
     25.2300   97.2400
     22.0000   96.0500
     20.4700   97.0200
     17.2000   96.2900
     16.3000   97.3800
     14.0500   98.1200
     16.5300   97.3800
     21.5200   95.5900
     19.4100   97.1300
     20.0900   92.5500];

%% III. 计算距离矩阵
D = Distance(X);  %计算距离矩阵
N = size(D,1);    %城市的个数

%% IV. 初始化参数
T0 = 1e10;   % 初始温度
Tend = 1e-30;  % 终止温度
L = 2;    % 各温度下的迭代次数
q = 0.9;    %降温速率
syms x;
Time = ceil(double(solve(T0*(0.9)^x == Tend)));    % 计算迭代的次数
% Time = 132;
count = 0;        %迭代计数
Obj = zeros(Time,1);         %目标值矩阵初始化
track = zeros(Time,N);       %每代的最优路线矩阵初始化

%% V. 随机产生一个初始路线
S1 = randperm(N);
DrawPath(S1,X)
disp('初始种群中的一个随机值:')
OutputPath(S1);
Rlength = PathLength(D,S1);
disp(['总距离:',num2str(Rlength)]);

%% VI. 迭代优化
while T0 > Tend
    count = count + 1;     %更新迭代次数
    temp = zeros(L,N+1);
    %%
    for k = 1:L
        % 1. 产生新解
        S2 = NewAnswer(S1);
        % 2. Metropolis法则判断是否接受新解
        [S1 R] = Metropolis(S1, S2, D, T0);   % Metropolis抽样算法
        temp(k, :) = [S1 R];            % 记录下一路线及其长度
    end
    %% 3. 记录每次迭代过程的最优路线
    [d0, index] = min(temp(:, end));    % 找出当前温度下最优路线
    if count == 1 || d0 <= Obj(count-1)
        Obj(count) = d0;                    % 如果当前温度下最优路程小于上一路程则记录当前路程
    else
        Obj(count) = Obj(count-1);    % 如果当前温度下最优路程大于上一路程则记录上一路程
    end
    track(count, :) = temp(index, 1:end-1);  % 记录当前温度的最优路线
    %降温
    T0 = q * T0;
end

%% VII. 优化过程迭代图
figure
plot(1:count,Obj)
xlabel('迭代次数')
ylabel('距离')
title('优化过程')

%% VIII. 绘制最优路径图
DrawPath(track(end,:),X)

%% IX. 输出最优解的路线和总距离
disp('最优解:')
S = track(end,:);
p = OutputPath(S);
disp(['总距离:',num2str(PathLength(D,S))]);

五,结果分析

优化前的一个随机路线轨迹图如图2所示。

初始种群中的一个随机值:
11—>1—>14—>12—>7—>13—>2—>9—>10—>4—>8—>5—>3—>6—>11
总距离:62.0785

优化后的路线如图3所示。

最优解:
6—>12—>7—>13—>8—>11—>9—>10—>1—>2—>14—>3—>4—>5—>6
总距离:29.3405
  •  

图2 随机路线图

在这里插入图片描述

图3 最优解路线图

在这里插入图片描述wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

优化迭代过程如图4所示。

图4 模拟退火算法优化过程图

在这里插入图片描述wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

由图4可以看出,优化前后路径长度得到很大改进,由优化前的64.7606变为29.8332,变为原来的46.1%,600多代以后路径长度已经保持不变了,可以认为已经是最优解了。

六,算法的改进

(1)使用逆转操作,即选择两个城市后,逆转这两个城市之间的所有城市。
(2)选择3个城市,将两个城市之间的城市插入到第3个城市的后面(这两个城市之间不包括第3个城市)。

七,算法的局限性

问题规模n nn比较小时,得到的一般都是最优解,但当规模比较大时,一般只能得到近似解。这时可以通过增大种群大小和增加最大迭代次数使优化值更接近最优解。

八,参考文献

[1] 张建航, 李国. 模拟退火算法及其在求解TSP中的应用[J]. 现代电子技术, 2006, 029(022):157-158.
[2] 盛国华, 陈玉金. 改进模拟退火算法求解TSP问题[J]. 电脑知识与技术, 2008(15):129-130+156.
[3] 郁磊等. MATLAB智能算法30个案例分析(第2版)[M].北京航空航天大学出版社.2015年.

代码下载https://www.cnblogs.com/matlabxiao/p/14883637.html

以上是关于matlab基于模拟退火算法求解TSP问题的主要内容,如果未能解决你的问题,请参考以下文章

TSP基于matlab模拟退火算法求解31城市旅行商问题含Matlab源码 1148期

TSP基于matlab GUI模拟退火算法求解旅行商问题含Matlab源码 1083期

TSP基于matlab遗传和模拟退火算法求解中国省会城市旅行商问题含Matlab源码 1254期

MATLAB模拟退火算法(SA)求解TSP问题

TSP基于matlab GUI模拟退火+蚁群+遗传算法求解旅行商问题含Matlab源码 1611期

TSP问题模拟退火算法求解TSP问题matlab源码