文章目录

  • 前言
  • 一、蚁群算法简介
  • 二、算法精讲
  • 三、部分代码(Matlab)
  • 四、运行结果
  • 总结



前言

本篇文章主要记录了蚁群算法在三维路径规划中实现的过程


一、蚁群算法简介

1 引言
在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法。其中, 模拟蚁群觅食过程的蚁群优化算法(Ant Colony Optimization, ACO) 和模拟鸟群运动方式的粒子群算法(ParticleS warm Optimization,PSO) 是两种最主要的群智能算法。
蚁群算法是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M.Dorigo,V.Mani ezzo和A.Color ni等人于20世纪90年代初期通过模拟自然界中蚂蚁集体寻径行为而提出的一种基于种群的启发式随机搜索算法。蚂蚁有能力在没有任何提示的情形下找到从巢穴到食物源的最短路径,并且能随环境的变化,适应性地搜索新的路径,产生新的选择。其根本原因是蚂蚁在寻找食物时,能在其走过的路径上释放一种特殊的分泌物――信息素2,随着时间的推移该物质会逐渐挥发,后来的蚂蚁选择该路径的概率与当时这条路径上信息素的强度成正比。当一条路径上通过的蚂蚁越来越时,其留下的信息素也越来越多,后来蚂蚁选择该路径的概率也就越高,从而更增加了该路径上的信息素强度。而强度大的信息素会吸引更多的蚂蚁,从而形成一种正反馈机制。通过这种正反馈机制,蚂蚁最终可以发现最短路径。

2 基本思想

蚁群算法在三维路径规划中实际情况是对每个方向的信息素进行探索,选择最合适的方向继续前进并对该方向上的信息素进行更新,蚂蚁的信息素随时间衰减,精英蚂蚁的信息素正反馈增强,让之后蚁群更好的选择最优的路线,最终可以得到一条三维地形中两点之间的最短路径。

二、算法精讲

1 实现过程

因为要寻找三维中两点之间的最短路径,为了加快收敛速度,添加一个初始化蚁群信息素的过程,在进行信息素初始化的时刻为不同的点赋予了不同的选择概率。即可以建立一个以终点为中心的概率球,直线距离终点越远的点其相应的信息素浓度越低,其相应的选择该点的概率越小。初始化信息素浓度的公式(1)如下所示:

python解决蚁群算法 python蚁群算法3维路径_算法

式中, pheromone(goal)为飞行环境中goal位置的信息素浓度,a表示控制参数;Distanced表两点之间的欧式距离;goal_end表示终点的位置。

通过上述的公式就可以生成一个以终点为中心,沿四周概率不断降低的一个概率球。同时依据蚁群在搜索路径的过程中,需要对周围的信息素进行嗅探并且有一定倾向选择信息素浓度较高的位置,这里我采用的是设定一个启发值函数对周围上下左右等26个点进行选择,启发值越高表示蚂蚁下一个点的位置更倾向与这个位置,这就模拟蚂蚁向信息素浓度高方向前进下的倾向,同时信息素浓度随时间而挥发。启发值函数和信息素浓度挥发如公式(2),(3)所示:

python解决蚁群算法 python蚁群算法3维路径_算法_02

式中, QFZ 为蚁群在一次行走周围 26 个点中的启发值,S 表示这 26 个点可否到达,到达 S=1,
否 S=0;M 为加额外参数之后的两点之间的欧式距离;D 为加额外参数之后 26 个点的高度

python解决蚁群算法 python蚁群算法3维路径_matlab_03

式中, pheromone(goal)为飞行环境中goal位置的信息素浓度;M为加额外参数之后的两点之间的欧式距离;decr表示信息素浓度挥发因子。

对信息素浓度进行增强的公式如4所示:

python解决蚁群算法 python蚁群算法3维路径_算法_04

式中, pheromone(goal)为飞行环境中goal位置的信息素浓度;rou为适应度对信息素更新的影响;fitness为通过函数计算的路径适应度。

2 算法流程图

python解决蚁群算法 python蚁群算法3维路径_开发语言_05

三、部分代码(Matlab)

计算两点之间的欧式距离

%计算两点之间的欧式距离
function dist=distance(x1,y1,z1,x2,y2,z2)
dist=sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2);

初始化信息素函数

function pheromone=initial_pheromone(pheromone,point_end)
%% 
%point_end   input       终点
%pheromone   output      信息素

for x=1:200
    for y=1:200
        for z=1:200
            pheromone(x,y,z)=5000/distance(x,y,z,point_end(1),point_end(2),point_end(3));
        end
    end
end

启发值函数

function qfz=CacuQfz(point_next,point_now,point_end,mapdata)
%% 该函数用于计算各点的启发值(越大越好)
% point_next    input    下个点坐标
% point_now     input    当前点坐标
% point_end     input    终点坐标
% mapdata       input    地图高度
% qfz           output    启发值
%% 判断下个点是否可达,不可达为0
if mapdata(point_next(2),point_next(1))<point_next(3)
    S=1;
else
    S=0;
end

%% 计算启发值
%D距离
D=5000/(sqrt((point_next(1)-point_end(1))^2 + (point_next(2)-point_end(2))^2 + (point_next(3)-point_end(3))^2));
% 计算高度
M=20/point_next(3);

qfz=S*(M+D);

蚁群算法搜索路径

function [flag,judges,paths,pheromone]=searchpath(PopNum,pheromone,point1,point2,mapdata)
%% 该函数用蚂蚁蚁群算法的路径规划
%judges            是否成功搜索到路径
%pheromone         input    信息素
%mapdata           input    地图高度
%point1,point2     input    开始点
%path              output   规划路径
%pheromone         output   信息素

%% 搜索参数
xcMax=1; %蚂蚁横向最大变动
ycMax=1; %蚂蚁纵向最大变动
zcMax=1; %蚂蚁垂直最大变动
decr=0.99;  %信息素衰减概率
judges=ones(1,PopNum);
paths=cell(1,PopNum);
flag=0;


%% 循环搜索路径
for pi=1:PopNum
    len=1;
    path(len,1:3)=point1(1:3);
    NowPoint=point1(1:3);
    while distance(NowPoint(1),NowPoint(2),NowPoint(3),point2(1),point2(2),point2(3))
        count=1;
        %% 计算点的适应度值
        for x=-xcMax:xcMax
            for y=-ycMax:ycMax
                for z=-zcMax:zcMax
                    %数据处理
                    if x==0&&y==0&z==0
                        continue;
                    end
                    
                    if(NowPoint(1)+x<200&&NowPoint(2)+y<200&&NowPoint(3)+z<200&&NowPoint(1)+x>0&&NowPoint(2)+y>0&&NowPoint(3)+z>0)
                        if mapdata(NowPoint(2)+y,NowPoint(1)+x)>NowPoint(3)+z
                            continue;
                        end
                        
                        NextPoint(count,:)=[NowPoint(1)+x,NowPoint(2)+y,NowPoint(3)+z];
                        qfz(count)=CacuQfz(NextPoint(count,:),NowPoint,point2,mapdata);
                        qz(count)=qfz(count)*pheromone(NextPoint(count,1),NextPoint(count,2),NextPoint(count,3));
                        %qz(count)=pheromone(NextPoint(count,1),NextPoint(count,2),NextPoint(count,3));
                        if   qz(count)==0
                            continue;
                        else
                            count=count+1;
                        end
                    end
                    
                %x,y,z    
                end
            end
        end
        
        if count==1
            len=round(2*len/3);
            NowPoint=path(1,1:3);
            continue;
        end
        
        
        % 选择下一个点
        [max_1,index]=max(qz);%找到启发值最大点(26个点)
        temp_m=find(qz==max_1);%找到点的位置
        index_m=randperm(size(temp_m,2),1);%size(temp_m,2)返回temp_m列的个数
        index=temp_m(index_m);
        
       %%  轮盘赌更简单方式
%          P = qz/sum(qz);% 轮盘赌法选择下一个访问城市
%          Pc = cumsum(P);     %累加函数,把前几个累加到1
%          target_index = find(Pc >= rand);
%          index = target_index(1);        
        %% 基于轮盘赌法选择下一个点
%        if isempty(find(qz==inf,1))==0
%            index=find(qz==inf,1);
%       else
%            if rand>5
%                sum_qz=qz/sum(qz);
%                P_qz=cumsum(sum_qz);
%                index=find(P_qz>=rand);
%            else
%                [max_1,index]=max(qz);               
%                temp_m=find(qz==max_1);
%                index_m=randperm(size(temp_m,2),1);
%                index=temp_m(index_m);
%            end
%        end
       
        %debug
        assert(isempty(NextPoint)==0)
        assert(isempty(qz)==0)
        assert(isempty(index)==0)


        oldpoint=NextPoint(index(1),:);
        %assert(isequal(NowPoint,oldpoint))
        NowPoint=oldpoint;
        pheromone(oldpoint(1),oldpoint(2),oldpoint(3))=decr*pheromone(oldpoint(1),oldpoint(2),oldpoint(3));
        
        %路径保存,最多10000*3
        len=len+1;
        if len>10000
            judges(1,pi)=0;
            flag=1;%flag==1表示在10000次搜索之后没有没有找到一条路径
            break;
        end
        path(len,1:3)=NowPoint;
        NextPoint=[];
        qz=[];
        qfz=[];
    end
    
    paths{1,pi}=path;
    path=[];
end

四、运行结果

python解决蚁群算法 python蚁群算法3维路径_matlab_06


起点的坐标[20,175,96];

终点的坐标[196,49,30]

总结

1 综述
综上所述对蚁群算法实现的三维路径进行初步的讲解,本人也是第一次记录博客的内容,可能讲的不怎么好,希望大家多多包涵。具体完整的蚁群算法三维路径规划代码可以点击此处。
蚁群算法的三维路径规划