编程知识:蚁群算法在最优路径求解方案中的应用

标签:
原理求解步骤源代码并行性发现较好解 |
分类: 工业4.0/数字化/人工智能 |
【前言】
智能蚂蚁机器人的集群控制,很可能也采用到了蚁群算法这种人工智能理论与技术。
【蚁群算法简介】
蚁群算法(antcolony optimization, ACO),又称蚂蚁算法,指的是一种源于自然现象的算法,也是一种 metaheuristic,即与具体问题关系不大的优化算法,也就是它是一种用来在图中寻找优化路径的机率型技术。它由MarcoDorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。
【蚁群算法原理】
自然界中的蚂蚁是没有视觉的,既不知道向何处寻找食物,也不知道发现食物后如何返回自己的巢穴,它仅仅依赖于同类散发在周围环境中的特殊物质—信息素的轨迹,来决定自己何去何从。但是尽管没有任何先验的知识,但蚂蚁们还是有能力找到从其巢穴到食物源的最佳路径。所以大量研究发现,同一蚁群中的蚂蚁能感知信息素及其强度,后来的蚂蚁会倾向于朝信息素浓度高的方向移动,而移动留下的信息素又会对原有信息素进行加强,后续的蚂蚁而后续的蚂蚁选择该路径的可能性也越大。由于在相同时间段内越短的路径会被越多的蚂蚁访问,所以后续的蚂蚁选择较短路径的可能性也越大,最后所有的蚂蚁都走最短的那条路径。应该指出,以蚁群为基础的方法能够有效地寻找较短的路径,但不一定是最短的路径。不过,对于那些难于获得最优解的问题,如那些NP难题,这种近于最优的解法常常已经是绰绰有余了。事实上,随着城市数目的增多,寻找精确解很快就会变成一个无法对付的问题。
【蚁群算法求解步骤】
(1)本文要解决的问题(TSP问题)。TSP问题,又称为旅行商问题、货郎担问题、TSP问题,是一个多局部最优的最优化问题:有n个城市,一个推销员要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线。也即求一个最短的哈密顿回路。TSP问题是一个组合优化问题。该问题可以被证明具有NP计算复杂性。因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。旅行推销员问题是数图论中最著名的问题之一,即“已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路”。Edmonds,Cook和Karp等人发现,这批难题有一个值得注意的性质,对其中一个问题存在有效算法时,每个问题都会有有效算法。迄今为止,这类问题中没有一个找到有效算法。倾向于接受NP完全问题(NP-Complet或NPC)和NP难题(NP-Hard或NPH)不存在有效算法这一猜想,认为这类问题的大型实例不能用精确算法求解,必须寻求这类问题的有效的近似算法。此类问题中,经典的还有子集和问题;Hamilton回路问题;最大团问题。本文提出的问题是:我国31个直辖市、省会和自治区首府的巡回路线应有很多种,试着寻找一条最短路径。(2)算法求解步骤
【求解结果】
(1)TSP路线展示
(2)适应度函数变化(目标值变化情况)
【蚁群算法源代码】
function
[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%% ACATSP.m
%% Ant Colony Algorithm for Traveling Salesman Problem
%% ChengAihua,PLA Information Engineering
University,ZhengZhou,China
%% Email:aihuacheng@gmail.com
%% All rights reserved
%%-------------------------------------------------------------------------
%% 主要符号说明
%% C n个城市的坐标,n×2的矩阵
%% NC_max 最大迭代次数
%% m 蚂蚁个数
%% Alpha 表征信息素重要程度的参数
%% Beta 表征启发式因子重要程度的参数
%% Rho 信息素蒸发系数
%% Q 信息素增加强度系数
%% R_best 各代最佳路线
%% L_best 各代最佳路线的长度
%% 运行可能要很久,需要耐心等待
%%=========================================================================
n=length(C); %n 为市个数
for i=1:n %坐标矩阵转换为距离矩阵
for j=1:n
D(i,j)=sqrt((x(i,1)-x(j,1))^2+(x(i,2)-x(j,2))^2);
end
end
for i=1:n %Eta为启发因子,这里设为距离的倒数
for j=1:n %原文作者少考虑的当D=0是MATLAB提示出错
if i~=j
Eta(i,j)=1./D(i,j);
end
end
end
for i=1:n
Eta(i,i)=0;
end
Tau=ones(n,n); %Tau为信息素矩阵
Tabu=zeros(m,n); %存储并记录路径的生成
NC=1; %迭代计数器
R_best=zeros(NC_max,n); %各代最佳路线
L_best=inf.*ones(NC_max,1); %各代最佳路线的长度
L_ave=zeros(NC_max,1); %各代路线的平均长度
while NC<=NC_max %停止条件之一:达到最大迭代次数
%%第二步:将m只蚂蚁放到n个城市上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1)); %已访问的城市
J=zeros(1,(n-j+1)); %待访问的城市
P=J; %待访问城市的选择概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1;
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:输出结果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
DrawRoute(C,Shortest_Route) %调用函数绘图
【总结】
(1)蚁群算法具有很强的发现较好解的能力。由于算法本身采用正反馈原理,加快了进化过程,且不易陷入局部最优解;(2)蚁群算法具有很强的并行性,个体之间不断进行信息交流和传递,有利于发现较好解。单个个体容易收敛于局部最优,多个个体通过合作,可很快收敛于解空间的某一子集,有利于对解空间的进一步探索,从而发现较好解。存在的问题是该算法本身很复杂,一般需要较长的搜索时间;容易出现停滞现象,即搜索进行到一定程度后,所有个体所发现的解完全一致,不能对解空间进一步进行搜索,不利于发现更好的解。