浅谈A*算法如何演变为rrt算法

1、A*算法流程

在开始寻找路径时,需要建立两张遍历表close、open。close中存放所经过的所有路径点。open中存放当前点下一步所可能过的路径点如下图所示(p1…p8为下步所能达到的点)。为下一步的每一个点添加能量值以便选择最路点,能量值公式如下:
fit=abs(下一步点−目标点)−abs(当前点−目标点)+步长fit=abs(下一步点-目标点)-abs(当前点-目标点)+步长 fit=abs(下一步点−目标点)−abs(当前点−目标点)+步长

开始寻找路径:
流出为:
1.在open中添加当前点
2.遍历下一步路点加入open中
3.判断是否无路可走(在无法往回走的前提下,无路可走)
4.有路劲点则在close中添加当前点。无路可走就结束。
5.在open中删除当前点并计算所有路点的能量值,并把能量值最低的当做新的当前点
6.判断时都是目标点,是就结束,不是就重复2-6。流程图如下:

Created with Raphaël 2.3.0开始open添加当前点遍历下一步路点存入open没有路点?没有找到路径结束把当前点存入close并在open中删除当前点计算open中路点能量值,并把能量值最小的路点当做当前点是否是目标点?结束yesnoyesno

下面展示A*的主要部分 代码

function path=AStar(obstacle,p)path=[];open=[p.start(1) p.start(2) h(p.start,p.goal) p.start(1) p.start(2)];%第三个为能量值
close=[];
next=MotionModel();
findFlag=false;%目标点判断
while ~findFlagif isempty(open(:,1)) disp('No path to goal!!');return;end[Y,I] = sort(open(:,3))open=open(I(1),:)if isSamePosi(open(1,1:2),p.goal)disp('Find Goal!!');close=[open(1,:);close]  findFlag=true;breakendfor in=1:length(next(:,1))m=[open(1,1)+next(in,1) open(1,2)+next(in,2) open(1,3)];%next为步长%m(3)=m(3)+next(in,3)+h(m(1:2),p.goal)-h(open(1,1:2),p.goal);m(3)=h(m(1:2),p.goal);%曼哈顿距离if isObstacle(m,obstacle) %障碍物判断continue;end[flag, targetInd]=FindList(m,open,close)%m为下一步路点if flag==1 %是否为open中点disp('cao')continue;elseif flag==2 %是否为close路点continue;else open=[open;[m open(1,1) open(1,2)]]endendif findFlag==falseclose=[close; open(1,:)]open(1,:)=[];endendpath=GetPath(close,p.start);

最终可以跑出如下图(黄色为起始点,蓝色为目标点)所示:

2、A*算法的缺陷和改进(增加RRT特性)

由于A*算法没有回头路,在一些特点场合下,就会在流程第4步出现无路可走的地步,如下图所示:

从图中可以发现,m点距离目标点(蓝色)较近,当前点就会朝m点方向跑,又可以知道m点周围都是障碍物,下一步的结果可想而知是无路可走的,此时无法找到路径,但地图上确实有路可以走到目标点。
如何避免这种现象,在无路可走的情况下,可以增加一个随机目标点,让他荡出局部路径。代码如下:

// An highlighted blockpick=0.3;if rand()>pickgoal=p.goal;%目标点elsegoal=[p.XYMAX*rand,p.XYMAX*rand];%随机目标点end

最终可以出现的结果如下图所示:

到这里你们就会奇怪:说好的rrt呢!!!其实个人理解A星算法加上随机扰动就是RRT啦,不信可以看如下图所示的示意图(地图放大5倍)


蓝色三角形为利用随机扰动目标在地图上寻找的路(到这里你们会发现他是不是和RRT的树枝蔓延一样哈),绿色为优化路径,红色+绿色为未优化路径。由于存在随机目标,所以得到的路径需要优化从而减少路程。优化过程与open中遍历最短路点一致。
改进后的代码如下:

function [path path1 path2]=AStar(obstacle,p)path1=[];
path2=[];
path=[];
index=2;
index1=1;
open=[p.start(1) p.start(2) h(p.start,p.goal) p.start(1) p.start(2) 1 1];
close=[];
next=MotionModel();
findFlag=false;%目标标志
goal=p.goal;
for i=1:5000if isempty(open(:,1)) num=length(close(:,1));num=ceil(num*rand);         open(1,:)=close(num,:);index1=open(1,6);open(1,6)=index-1;pick=0.3;if rand()>pickgoal=p.goal;elsegoal=[p.XYMAX*rand,p.XYMAX*rand];endend[Y,I] = sort(open(:,3));open=open(I(1),:);if isSamePosi(open(1,1:2),p.goal)disp('Find Goal!!');close=[close;open(1,:)]  ;findFlag=true;breakendfor in=1:length(next(:,1))m=[open(1,1)+next(in,1) open(1,2)+next(in,2) open(1,3)];m(3)=(m(3)+next(in,3)+ h(m(1:2),goal))-h(open(1,1:2),p.goal);      if isObstacle(m,obstacle) continue;end[flag, targetInd]=FindList(m,open,close);if flag==1 continue;elseif flag==2 continue;else              open=[open;[m open(1,1) open(1,2)] index index1];endendif findFlag==false  close=[close; open(1,1:5) open(1,6) open(1,7)];index=index+1;index1=index-1;open(1,:)=[];endend%寻找连续路径
index=length(close);
path(1,1:2)=close(index,1:2);
flag=true;
i=2;
while flag==1index=close(index,7);path(i,1:2)=close(index,1:2);if index==1break;endi=i+1;
end
path1=close(:,1:2)  ;
path=flipud(path);
%优化路劲
index=1;
path2=path(1,1:2);
while(1)s=abs(path(index+1:end,:)-path(index,:)) ; s=sum(s,2);I=find(s<=1);I=index+I;ss=abs(path(I,:)-path(end,:));ss=sum(ss,2);[Y1,I1]=min(ss);index=I(I1);index=index(1);path2=[path2;path(index,:)];if ss(I1)==0break;end
end

延伸

随机扰动不仅可以用在A中(其实A加随机目标就是RRT),也经常用在各种路径寻优算法中,如遗传算法、粒子滤波等等,又如人工势场法的局部最优突破还是得靠随机扰动等等,所以,随机扰动真的神!!!

浅谈A*算法如何演变为rrt算法相关推荐

  1. 浅谈决策树算法以及matlab实现ID3算法

    决策树方法在分类.预测.规则提取等领域有着广泛的应用.在20世纪70年代后期和80年代初期,机器学习研究者J.Ross Quinilan提出了ID3算法以后,决策树在机器学习.数据挖掘领域得到极大的发 ...

  2. 浅谈MySQL索引背后的数据结构及算法

    2019独角兽企业重金招聘Python工程师标准>>> 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存 ...

  3. 浅谈神经网络之链式法则与反向传播算法

    反向传播是训练神经网络最重要的算法,可以这么说,没有反向传播算法就没有深度学习的今天.但是反向传播算法涉及一大堆数据公式概念.所以我们了解导数计算过程以及要介绍的新的复合函数多层求导计算过程. 链式法 ...

  4. 浅谈水下声速剖面及声线追踪算法

    声波传播速度是海洋中最重要的声学参数,它是影响声波在海洋中传播的最基本的物理量参数.有关测量研究表明,水中声速是温度.盐度和静压力的函数,声速随着温度.盐度和压力的增加而增加.海洋的不均匀性和多变性强 ...

  5. RRT与RRT*算法具体步骤与程序详解(python)

    提示:前面写了A*.Dijkstra算法 文章目录 前言 一.RRT的原理与步骤 二.RRT算法编写的步骤 1.算法步骤 2.算法的实现 三.RRT*算法编写的步骤 1.算法的步骤 2.算法的实现 三 ...

  6. 机器人C++库(12) Robotics Library 之路径规划算法:PRM、RRT、EET算法

    机器人C++库(12)Robotics Library 之路径规划算法:PRM.RRT.EET算法 RL库的运动规划(rl::plan)模块集成了以下经典的路径规划算法: PRM算法:概率路线图算法 ...

  7. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

  8. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  9. JackHttp -- 浅谈编码、加密(对称加密,非对称加密,Hash算法)

    如果你还不清楚 JackHttp 是什么,请戳这里!!! JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因: HTTP 在网络传输过程中是明文的. HTTP 在网络 ...

  10. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

最新文章

  1. /dev/urandom
  2. re:Invent第二天:互联网客户在右传统客户在左,AWS向哪儿?
  3. 成为大厂AI算法工程师,“NLP/CV”都是你必须过的坎!
  4. 创建MySQL数据库中useUnicode=truecharacterEncoding=UTF-8
  5. Web前端开发笔记——第四章 JavaScript程序设计 第三节 数据类型
  6. OpenCV-数字图像处理之拉普拉斯算子
  7. 搭建了Pycharm对话平台
  8. Topcoder Asia Programming Competition
  9. 信息源按加工深度划分_工程勘察时如何划分地层?勘查总工实力整理
  10. win10系统文件拖拽卡顿_IT技巧分享16:如何让win10摆脱卡顿
  11. 怎样使用迅雷提高下载速度
  12. android 原生控件,抽离Android原生控件的方法
  13. 【C系列6.9】分手在雨季
  14. windows下安装虚拟机
  15. 为什么说“管理是一门技术、更是一门艺术”
  16. shell圣诞树脚本
  17. ubuntu 配置登录失败次数限制
  18. 利用计算机的认识与感受制作海报,手绘pop海报在大学中的应用和现实意义
  19. 常见网络设备分类和工作分层
  20. 使用Node.js和TransloadIt构建用户头像组件

热门文章

  1. 微信的APP支付开发,服务端和支付端的问题
  2. .net课堂流水账_20110116
  3. matlab最佳拟合的指标是什么意思,Matlab拟合好坏常用指标
  4. 软件实施工程师的经验之谈(适合新手,老鸟请指正)
  5. CentOS mysql常用命令
  6. endnotex9切换中文_EndNoteX9常用方法汇总
  7. MySQL修改表字段的长度
  8. stm32-sbus数据接收,并通过CAN转发给车辆控制
  9. 01-nodeJs下载及安装
  10. linux设备驱动模型一字符设备open系统调用流程