D*算法的思考与理解

D*算法,一种反向搜索的动态路径规划算法,用于解决动态环境中的机器人路径规划问题。相较于A*算法,D*算法在环境变化后能更快地进行路径重规划,通过存储每个节点到终点的最短路径信息,实现高效处理。本文详细介绍了D*算法的工作原理、关键概念如state、h值、k值,以及处理路径障碍的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 D*算法:

特点:后向搜索,或者说是反向计算。按照论文中的结果,比replan的效率高不少,在动态环境中表现优秀。这是因为它提前把地图信息都计算并存储的缘故。

里面的节点被称为state,每个state有如下的值:
tag:new,open,closed  
分别标识三类节点,分别标识没有加入过open表的、在open表的、曾经在open表但现在已经被移走的。一开始所有的点的tag初值为new,当被加入到open表之后,被置为‘open’ , 从open表移走,被置为‘closed’

h: 每个点的h值代表当前该点,到终点,也就是目标点G的代价。第一次搜索到起点时时,所有点的h会被更新,计算方式同dijkstr算法,是用相邻两点的代价+上一个点的代价累加得到。

k: 该点最小的h值。k的计算在更新过本节点的h后,如果本点‘new’,k=h;如果本点'open',那就取一下当前k和new_h最小值,如果本点是'closed',取当前h和new_h最小值; 总而言之,k将会保持到最小,它表示了本点在全图环境中到G点的最小代价。

 

设想第一次搜索完成后:

每个节点的h和k是相等的。搜索的停止条件是把s点从open表中弹出,或者说s点状态是‘closed’,这与dijkstr算法是相同的。此时寻找到了这样的一条路径。可以看出,每个节点的指向(即节点的父节点)都是周围八个节点中k最小的那个。我们期望的路径出现了,并且每个节点到G的最短路径也标识出来了(+号标识),这样,当出现动态变化时,我们可以利用计算的这个图尽快修改我们的路径,而不是replan。

注意,此时openlist表不为空,里面的节点是比我们s的k值还大的节点,也就是标记为墙的节点(#),当然还有以s为源点扩展的节点,因为扩展后s才被请出openlist。

D*将处理这样变化的情况:我们规划的路径上的点,出现了拥堵。如果不是规划的路径上的点的变化,不予处理,因为我们按原计划仍能到达。

当我们检测到某点被阻碍了,我们可以迅速定位该节点的子节点,因为是反向指针,其实就是定位到了我们被堵的路径点的上一个点,那么我们要做如下事:

1.修改该点的h值,即state.h会变的很大,因为他的父节点是墙了,把它放入到open表中。注意此时该节点的k还是小值,是原来的那个h的值,因此,它将被立即取出展开。

2.把这个修改扩散出去,这个扩散过程需要利用到论文中的伪代码 process-state,直到k_min>= state.h 。

注意process-state运行过程中,state.h是会变的,因为该节点的父节点会被改成其他的h小的节点。

核心程序:

核心程序理解:

弹出open表中最小的节点,并删除这个节点。然后分类处理之:

k_old<h(x):  说明该节点x处于raise状态,可以设想x是之前那个父节点突变为墙的子节点。当前h(x)升高说明原来的路径已经不是最优的了,如果在x周围能找到一个点,h.y+c(x,y)更小,那就修改x的父节点,重置其h的值。

k_old=h(x):  该节点x处于lower的状态,并没有受到障碍影响,或者还在第一遍遍历的阶段。if后面的判断代表:周围是标记为new的节点,代表第一次被遍历到。or  它的父节点是X,但是h.y却不等, 设想一下说明这说明h.y被更改了,但是父节点还没有变。

————————————————————分割线————————————————————

再看D*算法的总结与思考:

D*算法常用于移动机器人领域的路径规划,其衍生算法如Focused D* ,D* lite,Field D* 目前已经是机器人路径规划的核心算法。在无人驾驶领域路径规划的潜力待讨论。这里作为个人学习后分享的感性的认知,可加快理解,有问题欢迎讨论。

D*是动态A*(D-Star,Dynamic A Star), 卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。

A*适宜于在静态路网(环境)中寻路,在环境变化后,往往需要replan,由于A*不能有效利用上次计算的信息,故计算效率较低。

D*由于储存了空间中每个点到终点的最短路径信息,故在重规划时效率大大提升。

A*是正向搜索,而D*特点是反向搜索,即从目标点开始搜索过程。在初次遍历时候,与Dijkstr算法一致,它将每个节点的信息都保存下来。

下图是PPT截图,起点为(2,1),目标终点为(7,6),搜索中每个节点都有一个反向指针,指向让其h最小的父节点。当起点在open表被弹出时,

从起点到终点的路径就出现了。

h代表该节点到终点,也就是目标点G的代价。k是该节点所有过的h的最小值。b是父节点。

假设我们检测到某点被阻碍了,如上图的(4,3)点,它变成了墙,它的h会被改为一个大值,并将该点和其邻接点重新加入open表中进行搜索,该点 h>k变成了“raise”态,(h=k为lower态)通过搜索,如果它自己周围找不到让h低下来(变为lower)的途径,则它会将这一状态传播到周围。(3,2)点会受影响,它的h将改变,(4,4)(5,4)(5,3)均不会受影响。具体原因可详细看论文。(3,2)点呢,它可以找到点(4,1),只需要把(2,3)的父节点从(4,3)改为(4,1),就能够降低其h的值,它的最终h,k将变为6.2+1.4=7.6 就变为lower态,这一改变也将扩散到(2,1)(2,2)点。

最终,只需要把(2,3)的父节点从(4,3)改为(4,1)即可,因为后面到目标点的路径其实是之前计算过的,不必计算。这样就保证了对动态障碍物再规划的效率。最终的路径规划为:

 

<think>嗯,用户让我介绍一下D*算法的原理,并且希望有图解实例。首先,我需要回忆一下D*算法的基本概念和它其他路径规划算法的区别。D*算法主要用于动态环境中的路径规划,比如当机器人遇到未知障碍物时,能够快速重新规划路径,而不需要完全重新计算,这一点和A*算法不同,A*是静态环境下的算法。 首先,我需要解释D*算法的核心思想。D*算法,全称是Dynamic A*,它主要解决了在环境变化时如何高效更新路径的问题。它维护一个优先队列,通过反向搜索从目标点开始,计算每个节点的最小代价,并在遇到障碍时局部更新受影响节点的代价,这样可以快速调整路径,而不必重新计算整个地图。 接下来,我需要考虑用户可能的背景。用户可能是机器人学、自动化或者计算机科学的学生或爱好者,对路径规划算法有一定了解,可能已经知道A*算法,现在想了解更高级的动态算法。用户可能需要D*算法的基本原理、步骤,以及一个具体的例子来帮助理解。 然后,我应该比较D*和A*的区别。A*是正向搜索,从起点到终点,而D*是反向搜索,从终点到起点,这样在环境变化时,可以更有效地更新路径。此外,D*算法引入了“风险变化”的概念,当检测到障碍物时,只会更新受影响区域的节点,而不是全局,这提高了效率。 接下来,我需要详细描述D*算法的关键步骤,比如初始化、节点扩展、代价传播等。同时,要解释状态标记,比如OPEN、CLOSED等,以及如何处理节点代价的变化。这里可能需要用到伪代码或者流程图,但用户要求图解实例,所以最好用文字描述结合例子。 然后,图解实例部分需要设计一个简单的地图,比如网格,展示初始路径规划,然后加入障碍物后如何更新路径。例如,一个5x5的网格,起点在左下,终点在右上,初始路径是直线,但中间出现障碍物后,D*如何调整路径绕过障碍物。 在描述过程中,需要注意使用LaTeX格式的数学公式,比如节点代价的计算公式,比如g值、h值等,但根据用户的要求,行内公式用$...$,独立公式用$$...$$。例如,节点代价可能用$g(n)$表示,启发式函数用$h(n)$,总代价$f(n) = g(n) + h(n)$,不过D*算法中的具体计算可能有所不同。 需要确保LaTeX语法正确,比如积分、上下标等。例如,在提到节点扩展时,可能会涉及代价的计算公式,需要用正确的LaTeX表达。 另外,用户要求用中文回答,结构清晰,逐步解决问题。因此,我需要分步骤解释D*算法,可能分为原理部分和实例部分。原理部分包括算法流程、关键概念,实例部分用具体例子和图示说明。 可能还需要提到D*的变种,比如D* Lite,这是不是用户需要的?不过用户直接问D*,可能不需要展开变种,但可以简要提及以显示全面性。 在思考过程中,我需要确保没有遗漏关键点,比如反向搜索、动态更新机制、优先队列的使用、节点的状态处理等。同时,图解实例需要足够清晰,可能用文字描述网格的变化,比如用字符表示地图,展示路径调整前后的情况。 最后,检查是否符合用户的所有要求:系统级指令中的LaTeX格式是否正确,用户可见层的结构是否清晰,是否有图解实例,以及是否用中文回答。确保没有使用任何Markdown格式,行内公式正确,独立公式单独成段,并且例子具体易懂。</think>### D*算法原理分步解析 D*(Dynamic A*)是一种面向动态环境的增量式路径规划算法,尤其擅长处理未知障碍物出现时的实时路径修正。核心机制是通过反向搜索和局部更新实现高效重规划。 --- #### **一、算法核心机制** 1. **反向搜索结构** 从目标点反向计算每个节点的最小通行代价($g(n)$),构建初始最优路径。 2. **增量更新策略** 当检测到障碍物时,仅更新受影响节点的$g(n)$值,避免全局重算。更新公式: $$g(n) = \min_{m \in \text{neighbors}(n)} (g(m) + c(n,m))$$ 其中$c(n,m)$为节点$n$到$m$的移动代价。 3. **优先队列优化** 使用优先队列(OPEN列表)按$k(n)=h(n)+g(n)$排序节点,$h(n)$为启发式估计值。 --- #### **二、算法流程图解** ```plaintext 初始化目标点g值 → 反向传播g值至起点 → 沿最小g值生成初始路径 ↓ 障碍物出现 → 更新局部g值 → 重新排序OPEN列表 → 传播变化 → 生成新路径 ``` --- #### **三、图解实例(5×5网格)** **初始环境**: ``` S: 起点 (0,0) G: 终点 (4,4) ■: 障碍物 数字: 节点g值(通行代价) 初始g值传播后: [ 8 7 6 5 4 ] [ 7 6 5 4 3 ] [ 6 5 4 3 2 ] [ 5 4 3 2 1 ] [ 4 3 2 1 G ] ``` **初始最优路径**: `S → (0,1) → (0,2) → (1,3) → (2,4) → G` --- **动态障碍物出现**: 节点(1,3)变为障碍物(g=∞) ``` 更新后局部g值: [ 8 7 6 5 4 ] [ 7 6 5 ∞ 3 ] [ 6 5 4 3 2 ] [ 5 4 3 2 1 ] [ 4 3 2 1 G ] ``` **D*重规划过程**: 1. 将(1,3)加入OPEN列表并传播g值变化 2. 相邻节点(1,2)更新g值:$g= \min(5, ∞+1) → 5$(不变) 3. 节点(2,3)更新g值:$g= \min(3, ∞+1) → 3$(不变) 4. 最终生成新路径: `S → (1,0) → (2,1) → (3,2) → (4,3) → G` --- #### **四、关键优势** - **时间复杂度**:从$O(n^2)$降为$O(k)$($k$为变化区域大小) - **存储优化**:仅维护OPEN列表和局部节点状态 - **实时性**:适用于机器人导航、游戏AI等动态场景 通过反向传播和增量更新,D*在动态环境中展现出比A*更高的效率。如需进一步代码实现细节或复杂场景分析,可提供具体参数继续探讨。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值