赞
踩
采用蚁群算法在跨度为21 km×21 km的一片海域中搜索从起点到终点,并且避开所有障碍物的路径,为了方便问题的求解,取该区域内最深点的高度为0,其他点高度根据和最深点高度差依次取得。路径规划起点坐标为(1,10,800),终点坐标为(21,4,1 000),规划环境和起点、终点如图3所示。整个搜索空间为21 km×21 km的海域,其中,起点坐标为(1,10,800),终点坐标为(21,4,1 000)。
基于蚁群算法的三维路径搜索算法的算法流程如图4所示。
取α轴方向作为三维路径规划的主方向,水下机器人沿工轴方向前进,为了降低规划复杂程度,将水下机器人的运动简化为前向运动、横向运动和纵向运动三种运动方式。在前向运动一定单位长度距离Lx,max情况下,设定机器人最大横向移动允许距离为Ly,max,最大纵向移动距离为Lz,max。这样,当蚂蚁沿着α轴方向前进时,当位于点H(i,j,k)时,对下一个点的搜索就存在一个可视区域,可视区域如图5所示。
这样,当蚂蚁由当前点向下一个点移动时,可搜索的区域限制在蚂蚁搜索可视区域之内,简化了搜索空间,提高了蚁群算法的搜索效率。
- function qfz=CacuQfz(Nexty,Nexth,Nowy,Nowh,endy,endh,abscissa,HeightData)
- %% 该函数用于计算各点的启发值
- %Nexty Nexth input 下个点坐标
- %Nowy Nowh input 当前点坐标
- %endy endh input 终点坐标
- %abscissa input 横坐标
- %HeightData input 地图高度
- %qfz output 启发值
-
- %% 判断下个点是否可达
- if HeightData(Nexty,abscissa)<Nexth*200
- S=1;
- else
- S=0;
- end
-
- %% 计算启发值
- %D距离
- D=50/(sqrt(1+(Nowh*0.2-Nexth*0.2)^2+(Nexty-Nowy)^2)+sqrt((21-abscissa)^2 ...
- +(endh*0.2-Nexth*0.2)^2+(endy-Nowy)^2));
- %计算高度
- M=30/abs(Nexth+1);
- %计算启发值
- qfz=S*M*D;

- function fitness=CacuFit(path)
- %% 该函数用于计算个体适应度值
- %path input 路径
- %fitness input 路径
-
- [n,m]=size(path);
- for i=1:n
- fitness(i)=0;
- for j=2:m/2
- %适应度值为长度加高度
- fitness(i)=fitness(i)+sqrt(1+(path(i,j*2-1)-path(i,(j-1)*2-1))^2 ...
- +(path(i,j*2)-path(i,(j-1)*2))^2)+abs(path(i,j*2));
- end
- end
- function [path,pheromone]=searchpath(PopNumber,LevelGrid,PortGrid,pheromone,HeightData,starty,starth,endy,endh)
- %% 该函数用于蚂蚁蚁群算法的路径规划
- %LevelGrid input 横向划分格数
- %PortGrid input 纵向划分个数
- %pheromone input 信息素
- %HeightData input 地图高度
- %starty starth input 开始点
- %path output 规划路径
- %pheromone output 信息素
-
- %% 搜索参数
- ycMax=2; %蚂蚁横向最大变动
- hcMax=2; %蚂蚁纵向最大变动
- decr=0.9; %信息素衰减概率
-
- %% 循环搜索路径
- for ii=1:PopNumber
-
- path(ii,1:2)=[starty,starth]; %记录路径
- NowPoint=[starty,starth]; %当前坐标点
-
- %% 计算点适应度值
- for abscissa=2:PortGrid-1
- %计算所有数据点对应的适应度值
- kk=1;
- for i=-ycMax:ycMax
- for j=-hcMax:hcMax
- NextPoint(kk,:)=[NowPoint(1)+i,NowPoint(2)+j];
- if (NextPoint(kk,1)<20)&&(NextPoint(kk,1)>0)&&(NextPoint(kk,2)<20)&&(NextPoint(kk,2)>0)
- qfz(kk)=CacuQfz(NextPoint(kk,1),NextPoint(kk,2),NowPoint(1),NowPoint(2),endy,endh,abscissa,HeightData);
- qz(kk)=qfz(kk)*pheromone(abscissa,NextPoint(kk,1),NextPoint(kk,2));
- kk=kk+1;
- else
- qz(kk)=0;
- kk=kk+1;
- end
- end
- end
-
-
- %选择下个点
- sumq=qz./sum(qz);
-
- pick=rand;
- while pick==0
- pick=rand;
- end
-
- for i=1:25
- pick=pick-sumq(i);
- if pick<=0
- index=i;
- break;
- end
- end
-
- oldpoint=NextPoint(index,:);
-
- %更新信息素
- pheromone(abscissa+1,oldpoint(1),oldpoint(2))=0.5*pheromone(abscissa+1,oldpoint(1),oldpoint(2));
-
- %路径保存
- path(ii,abscissa*2-1:abscissa*2)=[oldpoint(1),oldpoint(2)];
- NowPoint=oldpoint;
-
- end
- path(ii,41:42)=[endy,endh];
- end

- %% 该函数用于演示基于蚁群算法的三维路径规划算法
-
- %% 清空环境
- clc
- clear
-
- %% 数据初始化
-
- %下载数据
- load HeightData HeightData
-
- %网格划分
- LevelGrid=10;
- PortGrid=21;
-
- %起点终点网格点
- starty=10;starth=4;
- endy=8;endh=5;
- m=1;
- %算法参数
- PopNumber=10; %种群个数
- BestFitness=[]; %最佳个体
-
- %初始信息素
- pheromone=ones(21,21,21);
-
- %% 初始搜索路径
- [path,pheromone]=searchpath(PopNumber,LevelGrid,PortGrid,pheromone, ...
- HeightData,starty,starth,endy,endh);
- fitness=CacuFit(path); %适应度计算
- [bestfitness,bestindex]=min(fitness); %最佳适应度
- bestpath=path(bestindex,:); %最佳路径
- BestFitness=[BestFitness;bestfitness]; %适应度值记录
-
- %% 信息素更新
- rou=0.2;
- cfit=100/bestfitness;
- for i=2:PortGrid-1
- pheromone(i,bestpath(i*2-1),bestpath(i*2))= ...
- (1-rou)*pheromone(i,bestpath(i*2-1),bestpath(i*2))+rou*cfit;
- end
-
- %% 循环寻找最优路径
- for kk=1:100
-
- %% 路径搜索
- [path,pheromone]=searchpath(PopNumber,LevelGrid,PortGrid,...
- pheromone,HeightData,starty,starth,endy,endh);
-
- %% 适应度值计算更新
- fitness=CacuFit(path);
- [newbestfitness,newbestindex]=min(fitness);
- if newbestfitness<bestfitness
- bestfitness=newbestfitness;
- bestpath=path(newbestindex,:);
- end
- BestFitness=[BestFitness;bestfitness];
-
- %% 更新信息素
- cfit=100/bestfitness;
- for i=2:PortGrid-1
- pheromone(i,bestpath(i*2-1),bestpath(i*2))=(1-rou)* ...
- pheromone(i,bestpath(i*2-1),bestpath(i*2))+rou*cfit;
- end
-
- end
-
- %% 最佳路径
- for i=1:21
- a(i,1)=bestpath(i*2-1);
- a(i,2)=bestpath(i*2);
- end
- figure(1)
- x=1:21;
- y=1:21;
- [x1,y1]=meshgrid(x,y);
- mesh(x1,y1,HeightData)
- axis([1,21,1,21,0,2000])
- hold on
- k=1:21;
- plot3(k(1)',a(1,1)',a(1,2)'*200,'--o','LineWidth',2,...
- 'MarkerEdgeColor','k',...
- 'MarkerFaceColor','g',...
- 'MarkerSize',10)
- plot3(k(21)',a(21,1)',a(21,2)'*200,'--o','LineWidth',2,...
- 'MarkerEdgeColor','k',...
- 'MarkerFaceColor','g',...
- 'MarkerSize',10)
- text(k(1)',a(1,1)',a(1,2)'*200,'S');
- text(k(21)',a(21,1)',a(21,2)'*200,'T');
- xlabel('km','fontsize',12);
- ylabel('km','fontsize',12);
- zlabel('m','fontsize',12);
- title('三维路径规划空间','fontsize',12)
- set(gcf, 'Renderer', 'ZBuffer')
- hold on
- plot3(k',a(:,1)',a(:,2)'*200,'--o')
- %% 适应度变化
- figure(2)
- plot(BestFitness)
- title('最佳个体适应度变化趋势')
- xlabel('迭代次数')
- ylabel('适应度值')

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。