【路径规划】基于果蝇算法实现机器人路径规划matlab源码

156 阅读5分钟

1 简介

2 部分代码

%% 清空环境
clc;
clear all;
close all;
tic
%% 障碍物数据
position = load('barrier.txt');
plot([0,200],[0,200],'.');
hold on
B = load('barrier.txt');
xlabel('km','fontsize',12)
ylabel('km','fontsize',12)
title('二维规划空间','fontsize',12)
%% 描述起点和终点
Start = [20,180];
Target = [160,90];
plot([Start(1),Target(1)],[Start(2),Target(2)],'.');

% 图形标注
text(Start(1),Start(2)+7,'S');
text(Target(1)+3,Target(2)-4,'T');

%% 描绘障碍物图形
fill(position(1:4,1),position(1:4,2),[0,0,0]);
fill(position(5:8,1),position(5:8,2),[0,0,0]);
fill(position(9:12,1),position(9:12,2),[0,0,0]);
fill(position(13:15,1),position(13:15,2),[0,0,0]);

% 下载链路端点数据
L = load('lines.txt');

%% 描绘线及中点
v = zeros(size(L));
for i=1:20
   plot([position(L(i,1),1),position(L(i,2),1)],[position(L(i,1),2)...
      ,position(L(i,2),2)],'color','black','LineStyle','--');
   v(i,:) = (position(L(i,1),:)+position(L(i,2),:))/2;
   plot(v(i,1),v(i,2),'*');
   text(v(i,1)+2,v(i,2),strcat('v',num2str(i)));
end

%% 描绘可行路径
sign = load('matrix.txt');
[n,m]=size(sign);

for i=1:n
   
   if i == 1
       for k=1:m-1
           if sign(i,k) == 1
               plot([Start(1),v(k-1,1)],[Start(2),v(k-1,2)],'color',...
                   'black','Linewidth',2,'LineStyle','-');
           end
       end
       continue;
   end
   
   for j=2:i
       if i == m
           if sign(i,j) == 1
               plot([Target(1),v(j-1,1)],[Target(2),v(j-1,2)],'color',...
                   'black','Linewidth',2,'LineStyle','-');
           end
       else
           if sign(i,j) == 1
               plot([v(i-1,1),v(j-1,1)],[v(i-1,2),v(j-1,2)],...
                   'color','black','Linewidth',2,'LineStyle','-');
           end
       end
   end
end                                       %到此能画出MAKLINK链路图
v1=zeros(22,2);                           %v1存放包括S和T的总共22个结点,作为DijkstraPlan的参数
v1(1,:)=[20,180];
v1(22,:)=[160,90];
for i=2:21
   v1(i,:)=v(i-1,:);
end
path = DijkstraPlan(v1,sign);
j = path(22);
plot([Target(1),v(j-1,1)],[Target(2),v(j-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.');
i = path(22);
j = path(i);
count = 0;
while true
   plot([v(i-1,1),v(j-1,1)],[v(i-1,2),v(j-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.');
   count = count + 1;
   i = j;
   j = path(i);
   if i == 1 || j==1
       break;
   end
end
plot([Start(1),v(i-1,1)],[Start(2),v(i-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.');
count = count+3;
pathtemp(count) = 22;
j = 22;
for i=2:count
   pathtemp(count-i+1) = path(j);
   j = path(j);
end
path = pathtemp;                     %到此能在规划空间中用黄线描绘出次优最短路径
pathCount = length(path)-2;          %经过线段数量,相当于维数D

%% 经过的链接线
lines = zeros(pathCount,4);
for i = 1:pathCount                  %lines用于存放各个结点所在链接线的起点和终点
   lines(i,1:2) = B(L(path(i+1)-1,1),:);
   lines(i,3:4) = B(L(path(i+1)-1,2),:);
end

%% 初始最短路径
dijpathlen = 0;
vv = zeros(22,2);
vv(1,:) = Start;
vv(22,:) = Target;
vv(2:21,:) = v;
for i=1:pathCount+1
dijpathlen = dijpathlen + sqrt((vv(path(i),1)-vv(path(i+1),1))^2+(vv(path(i),2)-vv(path(i+1),2))^2);
end
LL = dijpathlen;                   %得出的LL为次优最短路径的长度

%% 果蝇优化算法参数初始化
popsize=pathCount;
maxgen=200;
gen=0;
D=zeros(pathCount,pathCount);
S=zeros(pathCount,pathCount);
bestgensmell=zeros(1,maxgen);

%% 果蝇位置初始化及食物浓度计算
%*** 随机初始果蝇群体位置。
X_axis=1+1*rands(1,pathCount);
Y_axis=1+1*rands(1,pathCount);

%*** 果蝇寻优开始,利用嗅觉寻找食物。
for p=1:popsize
   X(p,:)=X_axis+2*rand()-1;
   Y(p,:)=Y_axis+2*rand()-1;
   
   for i=1:pathCount
   %*** 求出与原点之距离
   D(p,i)=(X(p,i)^2+Y(p,i)^2)^0.5;
   %*** 味道浓度为距离之倒数,先求出味道浓度判定值。
   S(p,i)=1/D(p,i);
   end
   
end

   %*** 利用味道浓度判定函数求出味道浓度
for p=1:pathCount
   w=S(:,p);
   Smell(p)=distance(w,pathCount,lines);
end

%% 初始化公告板
[bestsmell bestindex]=min(Smell);
%*** 利用视觉寻找伙伴聚集味道浓度最高之处,做法是保留最佳值初始位置及初始味道浓度。
X_axis=X(bestindex,:);
Y_axis=Y(bestindex,:);
bestS=S(bestindex,:);
SmellBest=bestsmell;

%% 果蝇搜索过程
%*** 果蝇迭代寻优
for gen=1:maxgen
   %*** 利用嗅觉寻找食物
   for p=1:popsize
   %*** 初始果蝇个体飞行距离
   X(p,:)=X_axis+2*rand()-1;
   Y(p,:)=Y_axis+2*rand()-1;
   
   for i=1:pathCount
   %*** 求出与原点之距离
   D(p,i)=(X(p,i)^2+Y(p,i)^2)^0.5;
   %*** 味道浓度为距离之倒数,先求出味道浓度判定值。
   S(p,i)=1/D(p,i);
   end
   
   end

   %*** 利用味道浓度判定函数求出味道浓度
   for p=1:pathCount
       w=S(:,p);
       Smell(p)=distance(w,pathCount,lines);
   end
  [bestsmell bestindex]=min(Smell);
   
   %*** 利用视觉寻找伙伴聚集味道浓度最高之处,做法是保留最佳值初始位置及初始味道浓度
   if bestsmell<SmellBest
   X_axis=X(bestindex,:);
   Y_axis=Y(bestindex,:);
   bestS=S(bestindex,:);
   SmellBest=bestsmell;
   end
   bestgensmell(1,gen)=SmellBest;
   yy(gen)=SmellBest;
   Xbest(gen,:)=X_axis;
   Ybest(gen,:)=Y_axis;
end
t_train=toc;             %结束记时
%画出公告板中的最短路径所对应的人工鱼的轨迹
lastline=zeros(pathCount+2,2);
lastline(1,:)=Start;
lastline(pathCount+2,:)=Target;
pathkbest=bestS;
for i=1:pathCount
   lastline(i+1,:)=lines(i,1:2) + (lines(i,3:4)-lines(i,1:2))*pathkbest(:,i);
end

for i=1:pathCount+1
   plot([lastline(i,1),lastline(i+1,1)],[lastline(i,2),lastline(i+1,2)],'color','red','LineWidth',3);
end
%画出最路径随迭代次数的变化
figure(2);
% plot(bestgensmell,'color','red');
plot(bestgensmell);
hold on
title( ['本次运行得到的最优值为',num2str(SmellBest),',总共耗时',num2str(t_train),'s'] );
%text(180,190,'最优值随迭代次数变化曲线');
ylabel('路径总长度');
xlabel('迭代次数');
% figure(3);
% plot(Xbest,Ybest,'b.');
% title('Fruit fly flying route','fontsize',14)
% xlabel('X-axis','fontsize',12);ylabel('Y-axis','fontsize',12);

3 仿真结果

4 参考文献

[1]赵清杰, 方凯仁, 张长春,等. 一种基于果蝇优化算法的机器人路径规划方法:. 

5 MATLAB代码与数据下载地址

见博客主页头条