D Star 寻路算法

  • 一、简介
  • 二、算法介绍
    • 2.1 符号表示
    • 2.2 算法描述
  • 三、算法总结

一、简介

“D*算法”的名称源自 Dynamic A Star,最初由Anthony Stentz于“Optimal and Efficient Path Planning for Partially-Known Environments”中介绍。它是一种启发式的路径搜索算法,适合面对周围环境未知或者周围环境存在动态变化的场景。

二、算法介绍

同A*算法类似,D-star通过一个维护一个优先队列(OpenList)来对场景中的路径节点进行搜索,所不同的是,D*不是由起始点开始搜索,而是以目标点为起始,通过将目标点置于Openlist中来开始搜索,直到机器人当前位置节点由队列中出队为止(当然如果中间某节点状态有动态改变,需要重新寻路,所以才是一个动态寻路算法)。

2.1 符号表示

本部分主要介绍一下论文中用到的一些符号及其含义。

论文中将地图中的路径点用State表示,每一个State包含如下信息:

Backpointer: 指向前一个state的指针,指向的state为当前状态的父辈,当前state称为指针指向state的后代,目标state无Backpointer。(路径搜索完毕后,通过机器人所在的state,通过backpointer即可一步步地移动到目标Goal state,GoalState以后用 G表示),b(X)=Y表示X的父辈为Y。

Tag:表示当前state的状态,有 New、Open、Closed三种状态,New表示该State从未被置于Openlist中,Open表示该State正位于OpenList中,Closed表示已不再位于Openlist中。

H(X):代价函数估计,表示当前State到G的开销估计。

K(X):Key Function,该值是优先队列Openlist中的排序依据,K值最小的State位于队列头 ,对于处于OpenList上的State X,K(X)表示从X被置于Openlist后,X到G的最小代价H(X),可以简单理解为。K(X)将位于Openlist的State X划分为两种不同的状态,一种状态为Raise(如果K(X)<H(X)),用来传递路径开销的增加(例如某两点之间开销的增加,会导致与之相关的节点到目标的路径开销随之增加);另一种状态为 Lower(如果K(X)<H(X)),用来传递路径开销的减少(例如某两点之间开销的减少,或者某一新的节点被加入到Openlist中,可能导致与之相关的节点到目标的路径开销随之减少)。

kmin:表示所有位于Openlist上的state的最小K值。

C(X,Y) :表示X与Y之间的路径开销。

Openlist 是依据K值由小到大进行排序的优先队列。

2.2 算法描述

搜索的关键是state的传递过程,即由G向机器人所在位置进行搜索的过程,这种传递过程是通过不断地从当前OpenList中取出K值最小的State来实现的,每当一个State由Openlist中移出时,它会将开销传递给它的邻居state,这些邻居state会被置于Openlist中,持续进行该循环,直到机器人所在State的状态为 Closed ,或者Openlist为空(表示不存在到G的路径)。

算法最主要的是两个函数, Process-StateModify-Cost ,前者用于计算到目标G的最优路径,后者用于改变两个state之间的开销C(X,Y)并将受影响的state置于Openlist中。

算法的主要流程,在初始时,所有state的t(Tag)被设置为 New ,H(G)被设置为0,G被放置于OpenList,然后Process-State函数被不断执行,直到机器人所处state X由openlist中出队,然后可以通过机器人的当前state按backpointer指向目标G。当移动过程中发现新探测到的障碍时,Modify-Cost函数立刻被调用,来更正C(°)中的路径开销并将受影响的state重新置于openlist中。令Y表示robot发现障碍时所在的state,通过不断调用Process-State直到kmin≥H(Y),这时表示路径开销的更改已经传播到了Y,此时,新的路径构建完成。

上图中L1-L3表示拥有最低K值的X由openlist中移出,如果X为Lower,那么它的路径代价为最优的。

在L8-L13,X的所有邻接state都被检测是否其路径代价可以更低,状态为New的邻接state被赋予初始路径开销值,并且开销的变动被传播给每一个backpointer指向X的邻接state Y(不管这个新的开销比原开销大或者小),也就是说只要你指向了X,那么X的路径开销变动时,你的路径代价必须随之改变。这里可能存在由于X路径开销变动过大,Y可以通过非X的其他state到达目标且路径开销更小的情况,这点在L8-13中并没有处理,而是放在后续针对Y的process-state函数中,在对Y进行处理时,会将其backpointer指向周围路径开销最小的state。如果X的邻接State状态为New时,应将其邻接state的backpointer指向X。所有路径开销有所变动的state都被置于Openlist中进行处理,从而将变动传播给邻接的state。
上述讨论的时X为Lower状态,接下来讨论X为Raise状态。

如果X为Raise,它的路径开销H可能不是最优的,在L4-L7中,通过其邻居state中已经处于最优开销(即h(Y)≤kold)的节点来优化X的路径开销,如果存在更短的路径,则将X的backpointer指向其neighbor。在L15-L18中,开销变动传播到状态为New的邻居state。如果X可以使一个backpointer并不指向X的邻居state的路径开销最小,即Y通过X到目标G的距离更短,但是此时Y的backpointer并不指向X,针对这种情况,可以将X重新置于Openlist中进而优化Y。在L23-25中,如果X可以通过一个状态为closed的并不是最理想的邻居stateY来减小路径开销,那么将Y重新置于Openlist中。


在modify-cost中,更新C(X,Y)并将X重新置于Openlist中,当X通过process-state进行传播时,会对Y进行开销计算,h(Y)=h(X)+c(X,Y)

三、算法总结


相比A-star算法,D-star的主要特点就是由目标位置开始向起始位置进行路径搜索,当物体由起始位置向目标位置运行过程中,发现路径中存在新的障碍时,对于目标位置到新障碍之间的范围内的路径节点,新的障碍是不会影响到其到目标的路径的。新障碍只会影响的是物体所在位置到障碍之间范围的节点的路径。在这时通过将新的障碍周围的节点加入到Openlist中进行处理然后向物体所在位置进行传播,能最小程度的减少计算开销。 路径搜索的过程我个人感觉其实和Dijkstra算法比较像,A-star算法中f(n)=g(n)+h(n),h(n)在D-star中并没有体现,路径的搜索并没有A-star所具有的方向感,即朝着目标搜索的感觉,这种搜索更多的是一种由目标位置向四周发散搜索,直到把起始位置纳入搜索范围为止,更像是Dijkstra算法。

水平有限,对原文中的许多地方理解的还不透彻,描述能力也有限,本文更多的像是对论文第二部分进行了简要的翻译。不懂的地方建议去原文中查询。

在网上找到了一个用java写的D-star的源码,分享给大家,帮助大家理解。
链接:https://pan.baidu.com/s/1G1UtCe_1H8UhNe4hRdFl6A 密码:yta2

D star路径搜索算法相关推荐

  1. rrt算法流程图_基于采样的路径搜索算法代码实现(RRT和PRM)

    1.采样法 利用网格法可以得到对特定离散化后C-space的最优解.但网格法的缺点是计算复杂度高,适用于自由度较低的机器人.本文简要介绍另一种基于采样的规划器,它涉及以下函数,通过这些函数构建一个图( ...

  2. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

    本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法.分享给大家供大家参考,具体如下: 完整实例代码如下: A*寻路算法 #stage { border: 1px solid lig ...

  3. LPA* 路径搜索算法介绍及完整代码

    1.简介 LPA*算法(全称Lifelong Planning A*算法)是由Koenig和Likhachev在2004年提出的,是一种参考人工智能的增量搜索进行改进的A*算法.它被用来处理动态环境下 ...

  4. Python 图_系列之基于邻接矩阵实现广度、深度优先路径搜索算法

    图是一种抽象数据结构,本质和树结构是一样的. 图与树相比较,图具有封闭性,可以把树结构看成是图结构的前生.在树结构中,如果把兄弟节点之间或子节点之间横向连接,便构建成一个图. 树适合描述从上向下的一对 ...

  5. 启发式路径搜索算法介绍

    作者丨Arwin(Haowen Yu) 来源丨古月居 前言 启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search),它是利用问题拥有的启发信息来引导搜 ...

  6. [置顶] 游戏开发技术总结(经典之作)第八集 脚踏实地-----游戏角色自动寻路、路径搜索算法...

    8-1 任务 让游戏的角色能够自动寻路: 并让所有的动物都动起来.另外我们在这一章将介 绍图形光标技术. 8-2 设置障碍 8-2-1 场景中的障碍点 游戏中加入了山石.树木场景后,就应该有对游戏角色 ...

  7. 路径搜索算法 python实现_A*算法在栅格地图上的路径搜索(python实现)

    作者:邬杨明 1 import numpy2 from pylab import * 3 4 # 定义一个含有障碍物的20×20的栅格地图5 # 10表示可通行点6 # 0表示障碍物7 # 7表示起点 ...

  8. 路径搜索算法——RRT算法

    RRT算法概述 RRT算法是一种基于采样的路径规划算法,其基本思想是通过产生随机点的方式通过一个步长向目标点搜索前进,有效躲避障碍物,避免路径陷入局部最小值,收敛速度快. MATLAB代码链接如下 链 ...

  9. 载波集中抄表的路径搜索算法研究

    主要解决下面三个问题: 1.路径信息在数据库中的表示,关键点包括根节点1个.子节点分层分簇.节点之间链接成图: 2.路径更新在数据库中的处理,关键点包括增加和减少路径信息对原来数据的影响: 3.TOP ...

  10. 路径规划: a star, A星算法详解

    如此好贴,不能不转!原文地址:http://dev.gameres.com/Program/Abstract/Arithmetic/AmitAStar.mht 本文版权归原作者.译者所有,我只是转贴: ...

最新文章

  1. python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...
  2. CODEFORCES 55D
  3. 关于TensorFlow,你应该了解这9件事(附代码链接)
  4. 7.1.3 TimePicker结合案例详解
  5. 皮尔逊相关系数 定义+python代码实现 (与王印讨论公式)
  6. htmlparser新建tag类(以iframe标签为例)
  7. [转载].SSRAM、SDRAM和Flash简要介绍
  8. JavaScript常用单词整理总结
  9. List和Set以及Map的选用
  10. windows7快捷键
  11. (Android)java虚拟机和Dalvik虚拟机的区别
  12. 【神仙打架】特奖答辩前10出炉,两名CS学生3篇顶会一作,有人周读3000页英文论文...
  13. React Router基础教程
  14. uva 10825 - Anagram and Multiplication(暴力)
  15. duilib开发(九):定时器和超链接
  16. VisualStudio2017编写masm32汇编程序以及语法高亮配置
  17. ToLua 入门07_GameObject
  18. ImageLoader加载图片闪烁
  19. Java WEB练习
  20. MySQL - 03DDL之数据表

热门文章

  1. 尚硅谷大数据Flink从入门到实战(2020最新版)
  2. pycharm无需汉化教程(无需下载汉化包)
  3. windows使用小技巧 ━━ Windows 10 HEVC扩展要收费怎么办?教你怎么免费下载HEVC扩展
  4. 关于手机电脑蓝牙4.0和CC2541蓝牙4.0的区别
  5. proteus中ISIS软件的各种器件的添加
  6. 学生网页设计作业源码 HTML+CSS 网上书店网站设计与实现
  7. web字体设置成平方字体_Web字体正确完成
  8. NVIDIA Nsight Eclipse 安装
  9. 蓝色圆形门禁卡怎么模拟_如何把门禁卡做成你用不起的样子?B站up主自制迷你墨水屏卡片...
  10. 乐鑫Esp32学习之旅 20 一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。