蚁群算法--------解决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