蚁群算法--------解决TSP问题


1.蚂蚁觅食行为

  (1)路径上释放信息素,信息素浓度的大小代表了蚂蚁所走路径的长短

  (2)信息素的浓度随着时间的推进而逐渐减少

2.蚁群算法求解优化问题的基本思路

  (1)蚂蚁的行走路径表示待优化问题的可行解

  (2)所有蚂蚁构成的蚂蚁群体所走的路径就构成了待优化问题的解空间

  路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高, 选择该路径的蚂蚁个数也愈来愈多。 最终, 整个蚂蚁会在正反馈的作用下集中到最佳的路径上, 此时对应的便是待优化问题的最优解。


  步骤:初始化----路径构造----自动更新----得出结果

  流程如图:

        

3.求解TSP问题

  (1)符号说明以及计算公式

      蚂蚁数量:m

      城市数量:n

      城市i与城市j之间的距离:dij (i,j<1,2,...,n)  


 具体代码如下(代码巨详细,小白都看得懂):

%% 清空环境变量
clear;
clc;
tic
%% 导入数据
load citys_data.mat
%% 计算各城市间距离d
n=size(citys,1);%总的城市个数
D=zeros(n,n);
for i=1:n
    for j=1:n
        if i~=j
            D(i,j)=sqrt(sum((citys(i,:)-citys(j,:)).^2));
        else
            D(i,j)=1e-4;
        end
    end
end
%% 初始化参数
m=100;%蚂蚁数量
alpha=2;%信息素启发因子(若减少到0,则变成随机贪婪算法,一般情况下取值[1,2])
rho=0.5;%信息素挥发系数
beta=5;%自启发因子(取值过大,易于陷入局部最优;取值国小,将导致蚁群陷入随机搜索,收敛慢,不易于寻优)
Eta=1./D;%启发函数(也称为先验知识能见度,该函数不固定)
Q=1;%循环一次释放信息素的总和
Table=zeros(m,n);%路径记录表(也就是禁忌表)
Tau=ones(n,n);%信息素矩阵
iter=1;%迭代次数初始值
iter_max=260;%最大迭代次数
Route_best=zeros(iter_max,n);%每一代最佳路径
Length_best=zeros(iter_max,1);%每一代最佳路径长度
%% 用while循环 经迭代寻找最佳路径
while iter <=iter_max
    iter
    %随机产生蚂蚁所在城市
    start=zeros(m,1);
    for i=1:m
        temp=randperm(n);%1-n里面的随机整数序列
        start(i)=temp(1);
    end
    Table(:,1)=start;
    citys_index=1:n;%城市索引
    %逐个蚂蚁路劲选择
    for i=1:m
        %逐个城市路径选择
        for j=2:n
            tabu=Table(i,1:(j-1));%已经访问的城市(一共n-1个城市,禁忌表)
            allow_index=~ismember(citys_index,tabu);
            %ismember(A,B)表示B中元素在A中是否出现,出现则返回值1,否则为0
            %~表示取反
            allow=citys_index(allow_index);%未访问城市集合
            P=allow;
            %城市间转移概率计算
            for k=1:length(allow)
                P(k)=Tau(tabu(end),allow(k))^alpha*Eta(tabu(end),allow(k))^beta;
            end
            P=P/sum(P);
            %运用轮盘赌选择下一个访问城市
               Pc=cumsum(P);%cumsum累加函数,cumsum(A,2)表示返回每行的累加和
               target_index=find(Pc>=rand);
               target=allow(target_index(1));
%                 target_index=max(Pc);
%                 target=allow(target_index(1));
               Table(i,j)=target;
        end
    end
    %计算各个蚂蚁路径距离
    Length=zeros(m,1);
    for i=1:m
        Route=Table(i,:);
        for j=1:(n-1)
            Length(i)=Length(i)+D(Route(j),Route(j+1));
        end
        Length(i)=Length(i)+D(Route(n),Route(1));
    end
    %计算最短路径距离以及平均距离
    if iter==1
        [min_length,min_index]=min(Length);
        Length_best(iter)=min_length;
        Route_best(iter,:)=Table(min_index,:);
    else
        [min_length,min_index]=min(Length);
        Length_best(iter)=min(Length_best(iter-1),min_length);
        if Length_best(iter)==min_length
            Route_best(iter,:)=Table(min_index,:);
        else
            Route_best(iter,:)=Table(min_index,:);
        end
    end
    Delta_Tau=zeros(n,n);
    %信息素更新模型有三种
    for i=1:m
        for j=1:(n-1)
            Delta_Tau(Table(i,j),Table(i,j+1))=Delta_Tau(Table(i,j),Table(i,j+1))+Q/Length(i);
        end
        Delta_Tau(Table(i,n),Table(i,1))=Delta_Tau(Table(i,n),Table(i,1))+Q/Length(i);
    end
    Tau=(1-rho)*Tau+Delta_Tau;%信息浓度更新方程
    iter=iter+1;
    Table=zeros(m,n);
end
  %% 结果显示
  [Short_length,index]=min(Length_best);
  Short_route=Route_best(index,:);
  disp(['最短距离:' num2str(Short_length)]);
  disp(['最短路径' num2str([Short_route Short_route(1)])]);
  %% 绘图
  figure(1)
  plot([citys(Short_route,1);citys(Short_route(1),1)],...
      [citys(Short_route,2);citys(Short_route(1),2)],'*-');
  grid on
  for i=1:size(citys,1)
      text(citys(i,1),citys(i,2),[' ' num2str(i)]);
  end
   text(citys(Short_route(1),1),citys(Short_route(1),2) ,'起点');   
   text(citys(Short_route(end),1),citys(Short_route(end),2),'    终点');
   xlabel('城市位置横坐标')
   ylabel('城市位置纵坐标')
  title(['蚁群算法优化路径(最短距离:' num2str(Short_length) ')'])
  toc

  求解如图:

TSP数据集下载地址

  http://elib.zib.de/pub/mp-testdata/tsp/tsplib/tsp/index.html