一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,可获得此代码。

获取代码方式3:
完整代码已上传我的资源:【路径规划】基于matlab A_star算法多机器人路径规划【含Matlab源码 1251期】

备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);
订阅紫极神光博客付费专栏,可免费获得2份代码(有效期为订阅日起,三天内有效);

二、A_star算法简介

1 A Star算法及其应用现状
进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标顶点间的估算距离, 也可以表示自起始顶点至目标顶点间的估算时间等.描述不同的情境、解决不同的问题所采用的启发函数各不相同.我们默认将启发函数命名为H (n) .以启发函数为策略支持的搜索方式我们称之为启发型搜索算法.在救援机器人的路径规划中, A Star算法能结合搜索任务中的环境情况, 缩小搜索范围, 提高搜索效率, 使搜索过程更具方向性、智能性, 所以A Star算法能较好地应用于机器人路径规划相关领域.

2 A Star算法流程
承接2.1节, A Star算法的启发函数是用来估算起始点到目标点的距离, 从而缩小搜索范围, 提高搜索效率.A Star算法的数学公式为:F (n) =G (n) +H (n) , 其中F (n) 是从起始点经由节点n到目标点的估计函数, G (n) 表示从起点移动到方格n的实际移动代价, H (n) 表示从方格n移动到目标点的估算移动代价.

如图2所示, 将要搜寻的区域划分成了正方形的格子, 每个格子的状态分为可通过(walkable) 和不可通过 (unwalkable) .取每个可通过方块的代价值为1, 且可以沿对角移动 (估值不考虑对角移动) .其搜索路径流程如下:

图2 A Star算法路径规划
Step1:定义名为open和closed的两个列表;open列表用于存放所有被考虑来寻找路径的方块, closed列表用于存放不会再考虑的方块;
Step2:A为起点, B为目标点, 从起点A开始, 并将起点A放入open列表中, closed列表初始化为空;
Step3:查看与A相邻的方格n (n称为A的子点, A称为n的父点) , 可通过的方格加入到open列表中, 计算它们的F, G和H值.将A从open移除加入到closed列表中;
Step4:判断open列表是否为空, 如果是, 表示搜索失败, 如果不是, 执行下一步骤;
Step5:将n从open列表移除加入到closed列表中, 判断n是否为目标顶点B, 如果是, 表示搜索成功, 算法运行结束;
Step6:如果不是, 则扩展搜索n的子顶点:
a.如果子顶点是不可通过或在close列表中, 忽略它.
b.子顶点如果不在open列表中, 则加入open列表, 并且把当前方格设置为它的父亲, 记录该方格的F, G和H值.
Step7:跳转到步骤Step4;
Step8:循环结束, 保存路径.从终点开始, 每个方格沿着父节点移动直至起点, 即是最优路径.A Star算法流程图如图3所示.

图3 A Star算法流程

三、部分源代码

%% 使用A *搜索演示%% 参数的设定
% 定义二维地图框架
MAX_X = 10;
MAX_Y = 10;
MAP = zeros(MAX_X,MAX_Y) % 此数组存储地图的坐标和每个坐标中的对象
% 获得障碍,目标和机器人位置
% 使用输入值初始化MAP
% 障碍= -1,目标= 1,起点= 1,空格= 0
j=0;
x_val = 1;
y_val = 1;
axis([1 MAX_X+1 1 MAX_Y+1])  % 框图的大小
grid on;                     % 加入网格
hold on;                     % 与新图共存
n=0;                         % 障碍物的数量for BB = 1:3
%% 确定目标点
pause(1);                           % 一般是为了动态观察变化过程 pause(a)暂停a秒后执行下一条指令
h=msgbox('请使用鼠标左键选择目标');  % 显示提示窗口
uiwait(h,5);
if ishandle(h) == 1delete(h);
end
xlabel('请使用鼠标左键选择目标','Color','black');
but=0;                               % 这个地方可以设置成1,这样的话,统一目标点
while (but ~= 1)                     % 重复,直到没有单击“向左”按钮[xval,yval,but]=ginput(1);
end
xval=floor(xval);
yval=floor(yval);
xTarget=xval;                        % X目标的坐标
yTarget=yval;                        % Y目标的坐标
MAP(xval,yval)=1;                    % 初始化地图中的目标位置
plot(xval+.5,yval+.5,'gd');
text(xval+1,yval+.5,'目标点')%% 确定障碍物
pause(2);
h=msgbox('使用鼠标左键选择障碍物,使用右键选择最后一个障碍物');xlabel('使用鼠标左键选择障碍物,使用右键选择最后一个障碍物','Color','blue');
uiwait(h,10);
if ishandle(h) == 1delete(h);
end
while but == 1[xval,yval,but] = ginput(1);xval=floor(xval);yval=floor(yval);MAP(xval,yval)=-1;             %Put on the closed list as wellplot(xval+.5,yval+.5,'ro');
end%% 确定起点
pause(1);
h=msgbox('请使用鼠标左键选择初始位置');
uiwait(h,5);
if ishandle(h) == 1delete(h);
end
xlabel('请选择初始位置','Color','black');
but=0;
while (but ~= 1)                    % 重复,直到没有单击“向左”按钮[xval,yval,but]=ginput(1);xval=floor(xval);yval=floor(yval);
end
xStart=xval;                       % 起始位置
yStart=yval;
MAP(xval,yval)=1;plot(xval+.5,yval+.5,'bo');
% End of obstacle-Target pickup%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LISTS USED FOR ALGORITHM  用于算法的列表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%OPEN LIST STRUCTURE       开放列表结构
%--------------------------------------------------------------------------
%IS ON LIST 1/0 |X val |Y val |Parent X val |Parent Y val |h(n) |g(n)|f(n)|
%--------------------------------------------------------------------------
OPEN=[];
%CLOSED LIST STRUCTURE 封闭的列表结构
%--------------
%X val | Y val |
%--------------
% CLOSED=zeros(MAX_VAL,2);
CLOSED=[];%Put all obstacles on the Closed list 将所有障碍物放在关闭列表中
k=1;   % Dummy counter
for i=1:MAX_Xfor j=1:MAX_Yif(MAP(i,j) == -1)CLOSED(k,1)=i; CLOSED(k,2)=j; k=k+1;endend
end
CLOSED_COUNT=size(CLOSED,1);
%set the starting node as the first node  将起始节点设置为第一个节点
xNode=xval;
yNode=yval;
OPEN_COUNT=1;
path_cost=0;
goal_distance=distance(xNode,yNode,xTarget,yTarget);
OPEN(OPEN_COUNT,:)=insert_open(xNode,yNode,xNode,yNode,path_cost,goal_distance,goal_distance);
OPEN(OPEN_COUNT,1)=0;
CLOSED_COUNT=CLOSED_COUNT+1;
CLOSED(CLOSED_COUNT,1)=xNode;
CLOSED(CLOSED_COUNT,2)=yNode;
NoPath=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% START ALGORITHM
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while((xNode ~= xTarget || yNode ~= yTarget) && NoPath == 1)
%  plot(xNode+.5,yNode+.5,'go');exp_array=expand_array(xNode,yNode,path_cost,xTarget,yTarget,CLOSED,MAX_X,MAX_Y);exp_count=size(exp_array,1);%UPDATE LIST OPEN WITH THE SUCCESSOR NODES  更新列表打开SUCCESSOR NODES%OPEN LIST FORMAT%--------------------------------------------------------------------------%IS ON LIST 1/0 |X val |Y val |Parent X val |Parent Y val |h(n) |g(n)|f(n)|%--------------------------------------------------------------------------%EXPANDED ARRAY FORMAT%--------------------------------%|X val |Y val ||h(n) |g(n)|f(n)|%--------------------------------for i=1:exp_countflag=0;for j=1:OPEN_COUNTif(exp_array(i,1) == OPEN(j,2) && exp_array(i,2) == OPEN(j,3) )OPEN(j,8)=min(OPEN(j,8),exp_array(i,5)); %#ok<*SAGROW>if OPEN(j,8)== exp_array(i,5)%UPDATE PARENTS,gn,hnOPEN(j,4)=xNode;OPEN(j,5)=yNode;OPEN(j,6)=exp_array(i,3);OPEN(j,7)=exp_array(i,4);end;%End of minimum fn checkflag=1;end;%End of node check
%         if flag == 1
%             break;end;%End of j forif flag == 0OPEN_COUNT = OPEN_COUNT+1;OPEN(OPEN_COUNT,:)=insert_open(exp_array(i,1),exp_array(i,2),xNode,yNode,exp_array(i,3),exp_array(i,4),exp_array(i,5));end;%End of insert new element into the OPEN listend;%End of i for%END OF WHILE LOOP% Find out the node with the smallest fn  找出fn最小的节点index_min_node = min_fn(OPEN,OPEN_COUNT,xTarget,yTarget);if (index_min_node ~= -1)    %Set xNode and yNode to the node with minimum fnxNode=OPEN(index_min_node,2);yNode=OPEN(index_min_node,3);path_cost=OPEN(index_min_node,6);  % Update the cost of reaching the parent node 更新到达父节点的成本%Move the Node to list CLOSED     将节点移动到列表CLOSEDCLOSED_COUNT=CLOSED_COUNT+1;CLOSED(CLOSED_COUNT,1)=xNode;CLOSED(CLOSED_COUNT,2)=yNode;OPEN(index_min_node,1)=0;else% No path exists to the Target!!NoPath=0;   % Exits the loop!end;            % End of index_min_node check
end;
% 算法运行后,通过从最后一个节点(如果它是目标节点)开始生成最佳路径,然后识别其父节点,直到它到达起始节点。这是最佳路径i=size(CLOSED,1);
Optimal_path=[];
xval=CLOSED(i,1);
yval=CLOSED(i,2);
i=1;
Optimal_path(i,1)=xval;
Optimal_path(i,2)=yval;i=i+1;
if ( (xval == xTarget) && (yval == yTarget))inode=0;% Traverse OPEN and determine the parent nodes 遍历OPEN并确定父节点parent_x=OPEN(node_index(OPEN,xval,yval),4); % node_index returns the index of the node     node_index返回节点的索引parent_y=OPEN(node_index(OPEN,xval,yval),5);while( parent_x ~= xStart || parent_y ~= yStart)Optimal_path(i,1) = parent_x;Optimal_path(i,2) = parent_y;%Get the grandparents:-)inode=node_index(OPEN,parent_x,parent_y);parent_x=OPEN(inode,4);    % node_index returns the index of the node  node_index返回节点的索引parent_y=OPEN(inode,5);i=i+1;end;j=size(Optimal_path,1);% Plot the Optimal Path!  % 绘制最佳路径!p=plot(Optimal_path(j,1)+.5,Optimal_path(j,2)+.5,'bo');j=j-1;for i=j:-1:1h=msgbox('不好意思,没有找到目标的路径!','warn');uiwait(h,5);
end
Optimal_path
[m,n]=size(Optimal_path);
for ii=1:m;
%     for jj=1:1a=Optimal_path(ii,1)b=Optimal_path(ii,2)MAP(a,b)=1c=a+0.5;d=b+0.5;
%         Optimal_path(i,j)=1;
%     end
plot(c,d,'*k');hold on;
end% MAP(Optimal_path(2,1),Optimal_path(2,2))=1
MAP1=rot90(MAP)
number = size(Optimal_path,1)if (BB==1)
Optimal_path1 = Optimal_pathhold on;
else if (BB==2)Optimal_path2 = Optimal_pathhold on;elseOptimal_path3 = Optimal_pathend
endend

四、运行结果

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]钱程,许映秋,谈英姿.A Star算法在RoboCup救援仿真中路径规划的应用[J].指挥与控制学报. 2017,3(03)

【路径规划】基于matlab A_star算法多机器人路径规划【含Matlab源码 1251期】相关推荐

  1. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  2. 【Matlab图像检索】综合特征图像检索【含GUI源码 395期】

    一.代码运行视频(哔哩哔哩) [Matlab图像检索]综合特征图像检索[含GUI源码 395期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  3. 【Matlab肌电信号】肌电信号处理【含GUI源码 966期】

    一.代码运行视频(哔哩哔哩) [Matlab肌电信号]肌电信号处理[含GUI源码 966期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继周,杨 ...

  4. 【Matlab语音处理】声音信号频谱分析仪【含GUI源码 325期】

    一.代码运行视频(哔哩哔哩) [Matlab语音处理]声音信号频谱分析仪[含GUI源码 325期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊, ...

  5. 【Matlab条形码识别】二维条形码识别【含GUI源码 607期】

    一.代码运行视频(哔哩哔哩) [Matlab条形码识别]二维条形码识别[含GUI源码 607期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  6. matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码

    基于蚁群算法的机器人路径规划MA TLAB源码 使用网格离散化的方法对带有障碍物的环境建模,使用邻接矩阵存储该环境,使得问题转化为蚁群算法寻找最短路径. function [ROUTES,PL,Tau ...

  7. 【A_star三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[三维路径规划]基于matlab A_star算法无人机三维路径规划[含Matlab源码 446期] 获取代码方式2: 付费专栏Matla ...

  8. 【 无错版】基于蚁群算法的机器人路径规划matlab程序代码实现

    文章目录 1. 按 2. 介绍 3. matlab实现 3.1. 代码 3.2. 效果 1. 按 网上有发的这个算法的错误版的,不知道发的意义何在,是在误人子弟吗???在此对其行为表示强烈的谴责. 错 ...

  9. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  10. 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[故障检测问题]基于matlab免疫算法求解故障检测问题[含Matlab源码 196期] 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭 ...

最新文章

  1. C库函数-perror()
  2. 【杂谈】有三AI专栏作者邀请,在这里写文章能获得什么,有什么不同?
  3. 【新手提问导读】提问的艺术
  4. LeetCode 42. 接雨水(双指针、单调栈)
  5. 街头人手一件加拿大鹅?店员道出真相:90%都是假货
  6. Chrome中使用showModalDialog无法接收返回值,解决方案
  7. Office 2007打开提示The setup controller has encountered
  8. ESP32 GPIO入门之闪灯
  9. Brettle.Web.NeatUpload.dll支持的大文件上传
  10. WinCC7.4 与扫码枪串口通讯
  11. 如何用电脑查看自己的IP地址
  12. Safari插件机制研究(一)
  13. 【python】python基础与unittest基础
  14. mysql知识系列:报错right syntax to use near IDENTIFIED BY
  15. SOLIDWORKS 2018官方正版功能介绍
  16. LocalDate 获取英文月份
  17. SQL 错误 [40000] [42000]: Error while compiling statement: FAILED
  18. 亚马逊鲲鹏系统详细功能介绍
  19. SK-YCC营销软件让我业务量上一台阶
  20. 一文带你读懂Java字节码

热门文章

  1. bzoj1854 [Scoi2010]游戏【构图 并查集】
  2. 如何在Mac OS X上安装 Ruby运行环境
  3. 获取客户端访问的ip地址
  4. @JVM垃圾收集器种类
  5. 动态加载Asp.net分页控件
  6. mathtype字体倾斜
  7. 七月算法机器学习 6 特征工程
  8. 20191115英文每日一句
  9. Unity C#代码小技巧
  10. halcon-高速下载