基本蚁群算法(matlab代码)

蚁群算法
1991年,意大利学者M. Dorigo、V. Maniezzo和A. Colorni研究蚁群行为特征,提出一种模拟蚁群的进化算法,其算法原理基于正反馈机制或增强型学习系统,它通过信息素强度的变化,选择最优路径,最后收敛于最优路径结果。
1.1蚁群算法的基本原理
蚁群算法是一种智能仿生算法,用来求解最优问题,其中主要解决旅行商问题(TSP)。蚁群算法整体分为两个过程,包括状态转移和信息素更新。其基本原理如下:
① 在爬行过程中,每只蚂蚁在自身经过的支路(i,j)上都留下信息素;
② 遇见没走过的岔路口,随机选择路径,同时释放信息素,路径越长,浓度越短;
③ 后来的蚂蚁选择信息素浓度较高的路径;
④ 直到所有路径走过后,才允许蚂蚁重复之前的路径;
⑤ 最优路径上,信息素浓度会越来越大;
⑥ 最终整个蚁群寻得最优路径。
1.1.1. 状态转移
为了避免残留信息素过多导致启发信息无效,在每只蚂蚁走完一步后,要对状态进行更新。在t时刻蚂蚁k从节点i转移到可行节点j的状态转移概率公式为:
在这里插入图片描述
式中,在这里插入图片描述 为启发函数,一般为距离倒数,表示蚂蚁从节点i转移到j的期望程度。t时刻节点i与节点j连接路径上的信息素浓度为 在这里插入图片描述。 alpha为信息启发式因子,其值越大,信息素的浓度在转移中起的作用越大; beta为期望启发式因子,其值越大,启发函数在转移中的作用越大,即蚂蚁会以较大的概率转移到距离短的节点。
1.1.2. 信息素更新
信息素的更新分为蚁周模型(Ant-Cycle model),蚁量模型(Ant-Quantity model)和蚁密模型(Ant-Density model)。其区别在于:
① 蚁周模型在一个蚂蚁完成循环后,更新所有路径上的信息素;
② 蚁量和蚁密模型利用的是局部信息,即蚂蚁完成一步后更新路径上的信息素。
(1)蚁周模型的信息素更新
利用全局信息,在蚂蚁完成一次路径搜索后,对所有路径的信息素浓度进行更新,即
在这里插入图片描述
式中, 在这里插入图片描述表示第k只蚂蚁在节点i与节点j连接路径上释放的信息素浓度; 在这里插入图片描述表示所有蚂蚁在节点i与节点j连接路径上释放的信息素浓度之和。Q表示信息素强度(常值),表示蚂蚁信息素总量;Lk 为第 k只蚂蚁经过的路径长度,与搜索路径有关,和具体路径无关。 p表示信息素的挥发程度。
1.1.3. 蚁群算法主要参数选取
在这里插入图片描述
选择蚁群算法最优组合参数的有效方法步骤:
① 确定蚂蚁数目 ,根据节点规模/蚂蚁数目≈1.5来确定大概的蚂蚁数目;
② 参数粗调,即调整信息启发式因子 、期望启发式因子 和信息素强度Q等参数;
③ 参数微调,即调整信息挥发因子 。

%                         蚁群算法解决航迹规划问题
% 输入: 
%       x_start,y_start    起始点坐标 
%       x_end,y_end        	目标点坐标
% 输出: 
%       Shortest_Route      蚁群算法生成的最航迹节点
%       Shortest_Length    	最优航迹长度
%       Shortest_J          最优航迹代价
% 功能说明:采用蚁群算法寻找最优航迹
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Shortest_Route,Shortest_Length,Shortest_J]=Aco(x_start,x_end,y_start,y_end,weight)
NC_max=200;							%最大循环次数
Na=10;								%蚂蚁总数
Alpha=1;                            %信息启发式因子
Beta=0.8;                           %期望启发式因子
Rho=0.1;                            %信息挥发因子
Q=1;                                 %信息素强度
n_set=11;                           %栅格取值集合
n_grid=6;                           %起始点与目标点之间的栅格数
Eta=1./weight;                     
%启发函数,这里设为各栅格点威胁代价的倒数
Tau=ones(n_set,n_set,n_grid-1); %Tau为信息素矩阵
Tabu=zeros(Na,n_grid);            %存储并记录路径的生成
NC=1;                                 %循环计数器
R_best=zeros(NC_max,n_grid);     %每次循环的最佳路线
L_best=inf.*ones(NC_max,1);      %每次循环的最佳路线的长度
L_ave=zeros(NC_max,1);            %每次循环的路线的平均长度
b=0:5:50;
while NC<=NC_max                    %判断是否达到最大循环次数
Randpos=[];                      
%将Na只蚂蚁放到第一步位置上,位置随机产生
    for i=1:(ceil(Na/n_set))
        Randpos=[Randpos,5*randperm(10)];
    end
    for i=1:Na
        Tabu(i,1)=Randpos(i);
    end
    for j=2:n_grid                       %Na只蚂蚁按概率函数选择下一个点
        for i=1:Na      
                visited=Tabu(i,1:(j-1));  %已访问的点
                J=Jj{j};                   	 %待访问的点
                P=J;                          %待访问点的选择概率分布              
                for k=1:length(J)           %计算待选点的概率分布           
                 P(k)=(Tau(visited(end)/5+1,J(k)/5+1,j-1)^Alpha)*(Eta(visited(end)/5+1,J(k)/5+1)^Beta);     
%(信息素^信息启发式因子)*(启发函数^期望启发式因子)
                end            
                P=P/(sum(P));                %归一化
                Pcum=cumsum(P);              %对概率累加求和
                Select=find(Pcum>=rand);   
%若计算的概率大于原来的概率则选择当前路线
                to_visit=J(Select(1));     %选择下一步栅格点
                while (abs(to_visit-visited(end))>10)
                    Select=find(Pcum>=rand);
                    to_visit=J(Select(1));
                end
                Tabu(i,j)=to_visit;
        end
    end
    if NC>=2
        Tabu(1,:)=R_best(NC-1,:);           
%把上次迭代结果即最短路径序列放在本次路径序列中
    end
    L_l=zeros(Na,1);                          %记录本次迭代最佳路线
    L_t=zeros(Na,1);
    for i=1:Na
        R=Tabu(i,:);
        for j=1:(n_grid-1)
                L_l(i)=L_l(i)+sqrt(25+(R(j)-R(j+1))^2);         
%第i只蚂蚁走的路程
        end
        L_l(i)=L_l(i)+sqrt((x_start-5)^2+(y_start-R(1))^2)+sqrt((x_end-30)^2+(y_end-R(end))^2);
        L(i)=0.5*L_l(i)+0.5*L_t(i);         %一轮下来后走过的距离
    end
    L_best(NC)=min(L);                        %第NC次迭代的最短路径
    pos=find(L==L_best(NC));
    Li_best(NC)=L_l(pos(1));
    R_best(NC,:)=Tabu(pos(1),:);            %第NC次迭代的最短路径序列
    NC=NC+1;                                    %循环继续
    Delta_Tau=zeros(n_set,n_set,n_grid-1);%更新信息素
    for i=1:Na
        for j=1:(n_grid-1)
                 					  %此次循环在路径(i,j)上的信息素增量Delta_Tau(Tabu(i,j)/5+1,Tabu(i,j+1)/5+1,j)=Delta_Tau(Tabu(i,j)/5+1,Tabu(i,j+1)/5+1,j)+Q/L(i);                                    
        end
    end
Tau=(1-Rho).*Tau+Delta_Tau;             
%考虑信息素挥发,更新后的信息素
    Tabu=zeros(Na,n_grid);                  %禁忌表清零、结束标志表清零
end
Pos=find(L_best==min(L_best));            %找到最佳路径(非0为真)
Shortest_Route=R_best(Pos(1),:);          %最大迭代次数后最佳路径
Shortest_Length=Li_best(Pos(1));          %最大迭代次数后最短距离
Shortest_J=L_best(Pos(1));


原创文章 21 获赞 0 访问量 2765

猜你喜欢

转载自blog.csdn.net/durzak/article/details/105050541