【路径规划】基于麻雀算法改进粒子群求解栅格路径规划及避障matlab代码

157 阅读6分钟

1 简介

为了提高复杂环境下移动机器人的精准导航作用,提出了移动机器人路径规划的改进粒子群优化(PSO)算法,即利用麻雀算法改进粒子群算法,建立了移动机器人工作环境的栅格模型,利用Matlab软件进行移动机器人路径规划仿真分析.仿真结果表明:改进后的粒子群算法容易使粒子移动到最佳位置,加强了全局寻优能力,在复杂环境中搜索路径性能优于传统算法.

麻雀搜索算法( sparrow search algorithm,SSA) 是新群智能优化算法,具有良好的全局搜索能力和 快速收敛性。与其他群智能算法一样来源于对生物体觅食情况的观察,麻雀种群在觅食过程中分为 两个部分: 发现者和加入者。发现者负责搜索食物 并为种群中的其他个体提供觅食区域和方向,通常 是具有高能源储备的个体,其所对应的适应度函数 值更优。加入者对应为适应度函数值较差的个体, 它们通过发现者留下的信息获得食物。适应度值 最差的部分麻雀找不到食物,为了寻找到食物它们 可能跳出当前的搜索区域,到其他的地方觅食。种 群中的每只麻雀都会监视其他同伴的行为,并且部 分麻雀会攻击摄取量较高的同伴争夺资源。当种 群中个别麻雀发现捕食者后发出报警信号,一旦报 警值大于安全值时发现者会把加入者带到其他安 全的区域觅食。种群中发现者和加入者的总数和比例不变,但 是两者的身份是动态变化的。寻找到更好的食物 来源的任何一只麻雀都可能变成发现者,此时其所 对应的适应度值变优,与此同时必然会有一只麻雀变成加入者,其适应度值变差。加入者的能量值越 低,在搜索范围内的位置对自己越不利越不容易找 到食物,这些极其渴望得到食物的麻雀可能飞到别的领域觅食,从而使自己获得能量。在整个觅食的过程中,加入者能搜索到能量更高的发现者,从而 获得食物或者伺机夺取食物。当意识到可能有危险时,为了获得更安全的位 置,种群边缘的麻雀快速向安全范围内移动,而在 种群中间的麻雀随机走动靠近其他的同伴。

室内环境栅格法建模步骤

1.栅格粒大小的选取

栅格的大小是个关键因素,栅格选的小,环境分辨率较大,环境信息存储量大,决策速度慢。

栅格选的大,环境分辨率较小,环境信息存储量小,决策速度快,但在密集障碍物环境中发现路径的能力较弱。

2.障碍物栅格确定

当机器人新进入一个环境时,它是不知道室内障碍物信息的,这就需要机器人能够遍历整个环境,检测障碍物的位置,并根据障碍物位置找到对应栅格地图中的序号值,并对相应的栅格值进行修改。自由栅格为不包含障碍物的栅格赋值为0,障碍物栅格为包含障碍物的栅格赋值为1.

3.未知环境的栅格地图的建立

通常把终点设置为一个不能到达的点,比如(-1,-1),同时机器人在寻路过程中遵循 “下右上左” 的原则,即机器人先向下行走,当机器人前方遇到障碍物时,机器人转向右走,遵循这样的规则,机器人最终可以搜索出所有的可行路径,并且机器人最终将返回起始点。

备注:在栅格地图上,有这么一条原则,障碍物的大小永远等于n个栅格的大小,不会出现半个栅格这样的情况。

2 部分代码

clc
clear all
close all
%% 粒子群算法求解栅格地图

load('data4.mat')
maxgen =50;%最大迭代次数
PopSize=10;%种群大小
c1=0.5;%认知系数
c2=0.7;%社会学习系数
w=0.5;%惯性系数
%%
%初始化路径
w_min=0.5;
w_max=1;
S=(S_coo(2)-0.5)*num_shange+(S_coo(1)+0.5);%起点对应的编号
E=(E_coo(2)-0.5)*num_shange+(E_coo(1)+0.5);%终点对应的编号
OldBestFitness=0;%旧的最优适应度值
gen=0;%迭代次数
Group=ones(num_point,PopSize);  %种群初始化
for i=1:PopSize
   p_lin=randperm(num_point)';%随机生成1*400不重复的行向量
   %% 将起点编号放在首位
   index=find(p_lin==S);
   lin=p_lin(1);
   p_lin(1)=p_lin(index);
   p_lin(index)=lin;
   Group(:,i)=p_lin;
   %%将每个个体进行合理化处理
  [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange);
   while flag==1%如处理不成功,则初始化个体,重新处理
       p_lin=randperm(num_point)';
       index=find(p_lin==S);
       lin=p_lin(1);
       p_lin(1)=p_lin(index);
       p_lin(index)=lin;
       Group(:,i)=p_lin;
      [Group(:,i),flag]=deal_fun(Group(:,i),num_point,liantong_point,E,num_shange);       
   end
end

[BestFitness,route_lin,index1]=pso(S,E,Group,num_point,liantong_point,num_shange,PopSize,maxgen,c1,c2,w,w_min,w_max);
%% 麻雀算法优化粒子群算法求解栅格地图路径规划

dim=2;%维度
lb=[0.1;0.1];%下限
ub=[0.9;0.9];%上限
N=10;%麻雀数量
Max_iter=50;%麻雀算法迭代次数
% [BestFitness_ssa,route_lin_ssa,index1_ssa]=ssa1(S,E,Group,num_point,liantong_point,num_shange,PopSize,maxgen,c1,c2,w,w_min,w_max);
[BestFitness_ssa,route_lin_ssa,index1_ssa]=ssa(dim,lb,ub,N,Max_iter,S,E,Group,num_point,liantong_point,num_shange,PopSize,maxgen,w,w_min,w_max);
figure(3)
hold on
for i=1:num_shange
   for j=1:num_shange
       if sign(i,j)==1
           y=[i-1,i-1,i,i];
           x=[j-1,j,j,j-1];
           h=fill(x,y,'k');
           set(h,'facealpha',0.5)
       end
       s=(num2str((i-1)*num_shange+j));
       text(j-0.95,i-0.5,s,'fontsize',6) 
   end
end
axis([0 num_shange 0 num_shange])%限制图的边界
plot(S_coo(2),S_coo(1), 'p','markersize'10,'markerfacecolor','b','MarkerEdgeColor''m')%画起点
plot(E_coo(2),E_coo(1),'o','markersize'10,'markerfacecolor','g','MarkerEdgeColor''c')%画终点
set(gca,'YDir','reverse');%图像翻转
for i=1:num_shange
   plot([0 num_shange],[i-1 i-1],'k-');
   plot([i i],[0 num_shange],'k-');%画网格线
end
for i=2:index1
   Q1=[mod(route_lin(i-1)-1,num_shange)+1-0.5,ceil(route_lin(i-1)/num_shange)-0.5];
   Q2=[mod(route_lin(i)-1,num_shange)+1-0.5,ceil(route_lin(i)/num_shange)-0.5];
  h1= plot([Q1(1),Q2(1)],[Q1(2),Q2(2)],'r','LineWidth',3);
end
for i=2:index1_ssa
   Q1_ssa=[mod(route_lin_ssa(i-1)-1,num_shange)+1-0.5,ceil(route_lin_ssa(i-1)/num_shange)-0.5];
   Q2_ssa=[mod(route_lin_ssa(i)-1,num_shange)+1-0.5,ceil(route_lin_ssa(i)/num_shange)-0.5];
   h2=plot([Q1_ssa(1),Q2_ssa(1)],[Q1_ssa(2),Q2_ssa(2)],'m','LineWidth',3)
end
% legend('粒子群算法','麻雀算法优化粒子群算法')
title('最优路线,品红色是麻雀算法优化粒子群算法,红色是粒子群算法');


%进化曲线
figure(4);
plot(BestFitness,'b-');hold on
plot(BestFitness_ssa,'r-');
xlabel('迭代次数')
ylabel('适应度值')
grid on;
legend('粒子群算法','麻雀算法优化粒子群算法')
title('进化曲线');
disp('粒子群算法-最优路线方案:')
disp(num2str(route_lin))
disp(['起点到终点的距离:',num2str(BestFitness(end))]);
disp('麻雀算法优化粒子群算法-最优路线方案:')
disp(num2str(route_lin_ssa))
disp(['起点到终点的距离:',num2str(BestFitness_ssa(end))]);

3 仿真结果

4 参考文献

[1]王慧, 王光宇, 潘德文. 基于改进粒子群算法的移动机器人路径规划[J]. 传感器与微系统, 2017, 036(005):77-79.

部分理论引用网络文献,若有侵权联系博主删除。