Theta*: Any-Angle Path Planning on Grids 原文翻译

Theta*: Any-Angle Path Planning on Grids

文章目录

  • Theta*: Any-Angle Path Planning on Grids
    • 翻译
      • 摘要
      • 1.Introduction
      • 2. Path-Planning Problem and Notation
      • 3. Existing Terrain Discretizations
      • 4.Existing Path-Planning Algorithms
        • 4.1 A* on Grids
        • A* with Post-Smoothed Paths (A* PS)
        • 4.3 Field D* (FD*)
        • 4.4 A* on Visibility Graphs
      • Basic Theta*
        • Operation of Basic Theta*
        • 5.2 Example Trace of Basic Theta*
        • 5.3 Properties of Basic Theta*
          • 5.3.1 CORRECTNESS AND COMPLETENESS
        • 5.3.2 OPTIMALITY
        • 5.3.3 HEADING CHANGES
      • 6. Angle-Propagation Theta* (AP Theta*)
        • 6.1 Definition of Angle Ranges
        • 6.2 Update of Angle Ranges
      • 6.3 Example Trace of AP Theta*
      • 6.4 Properties of AP Theta*
      • 7. Experimental Results

翻译

摘要

在机器人和视频游戏中,通常使用带有阻塞和非阻塞单元的栅格来表示地形。然而,栅格边缘形成的路径可能比地形中真正的最短路径更长,因为它们的方向受到人为限制。为了避免这一缺陷,我们提出了两种适用于任意角度的新的正确、完整的路径规划算法。基本 Theta* 算法和角度传播 Theta* 算法都是 A* 算法的变种,它们沿栅格边缘传播信息,而不将路径限制在栅格边缘。==基本 Theta* 算法易于理解和实现,速度快,能找到短路径。但是,它不能保证找到真正的最短路径。==角度传播 Theta* 通过在顶点展开时传播角度范围,在每个顶点进行展开时,角度传播Theta* 实现了比基本 Theta* 更佳最坏情况复杂度,但更复杂、更慢,而且找到的路径稍长。我们将基本 Theta* 和角度传播 Theta* 统称为 Theta*。Theta* 具有独特的特性,我们将对其进行详细分析。我们通过实验证明,它找到的路径比具有反向平滑路径的 A* 和 Field D* (我们所知的唯一一个沿着栅格边缘传播信息而不将路径限制在栅格边缘的 A* 版本)都要短,而且运行时间与栅格上的 A* 相当。最后,我们将 Theta* 扩展到包含非阻塞单元且遍历代价不均匀的栅格,并引入了 Theta* 的变体,在路径长度和运行时间之间做出了不同的权衡。

1.Introduction

在本文中,我们研究的是机器人和视频游戏(Choset, Lynch, Hutchinson, Kantor, Burgard, Kavraki, & Thrun, 2005; Deloura, 2000; Patel, 2000; Murphy, 2000; Rabin, 2002)的路径规划,其中二维连续地形被离散化为一个栅格,栅格中有受阻单元和未受阻单元。我们的目标是从给定的起点顶点到给定的目标顶点(均位于单元的四角)找到一条短的无阻塞路径。A* 能快速找到栅格路径(即受限于栅格边的路径),但栅格路径往往不是真正的最短路径(即地形中的最短路径),因为它们的潜在方向被人为限制为 45 度的倍数,如图 1(a) 所示(Yap,2002 年)。这一缺陷导致我们提出了所谓的任意角度路径规划(Nash、Daniel、Koenig 和 Felner,2007;Ferguson 和 Stentz,2006)。如图 1(b) 所示,任意角度路径规划算法可以在不限制路径标题的情况下找到路径。我们提出了两种新的正确、完整的任意角度路径规划算法。基本 Theta* 和角度传播 Theta* 都是 A* 的变种,它们沿着栅格边缘传播信息(以实现较短的运行时间),而不将路径约束在栅格边缘(以找到任意角度路径)。与可见性图上的 A* 不同,它们不能保证找到真正的最短路径。因此,它们名称中的星号并不表示它们的最优性,而是表示它们与 A* 的相似性。基本 Theta* 容易理解和实现,速度快且能找到短路径。角度传播 Theta* 通过在扩展顶点时传播角度范围,实现了每个顶点扩展的最坏情况复杂度,该复杂度是恒定的,而不是与单元格数量成线性关系(就像基本 Theta* 的复杂度),但复杂度更高,速度不快,找到的路径稍长。我们将基本 Theta* 和角度传播 Theta* 统称为 Theta*。Theta* 具有独特的特性,我们将对其进行详细分析。我们通过实验证明,它找到的路径比带有后平滑路径的 A* 和 Field D* (我们所知道的唯一一种沿着栅格边缘传播信息而不将路径限制在栅格边缘的 A* 版本)都要短,而且运行时间与 A* 在栅格上的运行时间相当。最后,我们将 Theta* 扩展到包含具有非均匀遍历成本的无阻塞单元格的栅格,并引入了 Theta* 的变体,这些变体在路径长度和运行时间之间做出了不同的权衡。

2. Path-Planning Problem and Notation

在本节中,我们将介绍本文所研究的路径规划问题,即在具有大小一致的阻塞和非阻塞单元的八邻栅格上进行路径规划。单元格被标记为受阻(灰色)或未受阻(白色)。我们使用单元格的边角(而不是中心)作为顶点。S 是所有顶点的集合。路径规划问题是找到一条从给定起点顶点 s s t a r t s_{start} sstart 到给定目标顶点 s g o a l s_{goal} sgoal 的畅通路径。

如果路径上的每个顶点都能看到路径上的后继顶点,那么这条路径就是畅通无阻的。如果从顶点 s s s 到顶点 s ′ s′ s 的直线既不经过受阻单元的内部,也不经过共享一条边的受阻单元之间,则顶点 s s s 与顶点 s ′ s′ s 具有视线,记为 L i n e O f S i g h t ( s , s ′ ) LineOfSight(s,s′) LineOfSight(s,s)。附录 A 给出了实现视线函数的伪代码。为简单起见,我们允许一条直线在对角相邻的受阻单元之间通过。

c ( s , s ′ ) c(s,s′) c(s,s) 是顶点 s s s 到顶点 s ′ s′ s 的直线长度。 n g h b r s v i s ( s ) nghbr s_{vis}(s) nghbrsvis(s) 是顶点 s s s 在八个罗盘方向上的可见相邻点集合,即顶点 s s s 的相邻点中与顶点 s s s 有视线的那些。图 1 显示了一个例子,顶点 B4 的可见邻域是顶点 A3、A4、A5、B3、B5、C3 和 C4。

img

3. Existing Terrain Discretizations

连续地形需要离散化才能进行路径规划。在本节中,我们将栅格与其他现有的地形离散化方法进行比较。我们使用栅格对地形进行离散化,因为栅格被广泛应用于机器人和视频游戏中(Deloura, 2000; Murphy, 2000; Rabin, 2004),并具有一些理想的特性:

  • 栅格是一种简单的数据结构,可以实现简单的路径规划算法。

  • 通过在地形上铺设栅格,并将所有部分或完全受阻的单元标注为受阻,就可以轻松地将地形离散成栅格。

  • 栅格提供了连续地形中所有可穿越表面的全貌。当路径规划算法在动态环境中使用并必须与导航规划器交互时,这一点至关重要。例如,如果一个机器人或视频游戏角色的路径遇到临时阻塞,它可以很容易地判断是向左转(未受阻)还是向右转(受阻)最好(Tozour,2004 年)。

  • 除了可穿越性之外,单元格还可以存储其他信息,例如该单元格对应的地形区域中隐藏的黄金数量,或者在显示地形时该区域的渲染效果。

  • 由于栅格是随机存取数据结构,因此可以快速访问存储在单元中的信息。

  • 只需提高栅格分辨率,就能提高路径和导航规划的精度。

为简单起见,假定地形中的障碍物是多边形的,我们现在列出一些可供选择的地形离散方法。

  • Voronoi 图(Aurenhammer,1991 年)通过使路径偏离受阻多边形,将地形离散化。这样得到的路径可能比真正的最短路径要长得多。
  • Mitchell 和 Papadimitriou(1991 年)的离散化研究将地形划分为具有线性边缘和双曲线边缘的区域,这样就可以找到真正的最短路径,其时间和空间复杂度为 O ( m 5 / 3 ) O(m^{5/3}) O(m5/3),其中 m m m 是受阻多边形的角数。因此,路径规划的运行时间可随受阻多边形的角数呈超线性增长。
  • 标准的四叉树(Yahja、Stentz、Singh 和 Brumitt,1998 年)会递归地将地形细分为四个大小相等的单元,直到所有单元都被完全遮挡、完全无遮挡或面积足够小为止。由此产生的路径可能会出现不必要的航向变化(即航向变化发生在自由空间而不是受阻多边形的角落)。
  • 概率路线图(Kavraki、Svestka、Latombe 和 Overmars,1996 年)喝快速探索随机树(LaValle 和 Kuffner,2001 年)随机放置顶点(除了起点和目标顶点)。如果两个顶点有视线,则它们通过直线相连。顶点的随机放置需要仔细调整,因为它会影响路径规划的运行时间、找到路径的可能性以及路径的长度。
  • 可见度图(Lee,1978 年;Lozano-P ́ erez & Wesley,1979 年)使用每个受阻多边形的角作为顶点(除了起点和目标顶点)。如果两个顶点有视线,则它们通过直线相连,这样就能找到真正的最短路径。路径规划的运行时间会随着顶点数量的增加而呈超线性增长,因为边的数量会随着顶点数量的增加而呈二次曲线增长。

img

4.Existing Path-Planning Algorithms

在本节中,我们将介绍一些现有的路径规划算法,它们都是 A* (Hart、Nilsson 和 Raphael,1968 年)的变体。A* 是机器人和视频游戏中常用的路径规划算法。算法 1 显示了 A* 的伪代码。第 13 行将被忽略。A* 为每个顶点 s 保留三个值:

  • g 值 g ( s ) g(s) g(s) 是目前发现的从起始顶点到顶点 s s s 的最短路径长度,因此是顶点 s s s 的起始距离的估计值。

  • 用户提供的 h h h h ( s ) h(s) h(s) 是顶点 s s s 目标距离的估计值。 f f f f ( s ) = g ( s ) + h ( s ) f (s) = g(s) + h(s) f(s)=g(s)+h(s) 是对从起始顶点经顶点 s s s 到目标顶点的最短路径长度的估计。

  • 在 A* 终止后,使用父级 p a r e n t ( s ) parent(s) parent(s) 提取从起始顶点到目标顶点的路径.

A* 还维护两个全局数据结构:

  • open list是一个优先队列,包含 A* 考虑扩展的顶点。在伪代码中, o p e n . I n s e r t ( s , x ) open.Insert(s, x) open.Insert(s,x) 将关键字为 x x x 的顶点 s s s 插入优先级队列 o p e n open open 中, o p e n . R e m o v e ( s ) open.Remove(s) open.Remove(s) 从优先级队列 o p e n open open 中移除顶点 s s s o p e n . P o p ( ) open.Pop() open.Pop() 从优先级队列 o p e n open open 中移除关键字最小的顶点并返回。

  • close list是一个包含 A* 已经展开过的顶点的集合。它确保 A* 最多扩展每个顶点一次。

A* 第一次遇到顶点时,会将每个顶点的 g 值设为无穷大,并将每个顶点的父顶点设为 NULL [第 17-18 行]。它将起始顶点的 g 值设置为零,并将起始顶点的父顶点设置为起始顶点本身 [第 2-3 行]。将打开列表和关闭列表设置为空列表,然后将起始顶点插入以 f 值为键的打开列表中 [4-6]。然后 A* 重复执行以下程序: 如果打开列表为空,则报告没有路径[第 20 行]。否则,它会找出开放列表中 f 值最小的顶点 s [第 8 行]。如果这个顶点是目标顶点,那么 A* 就会报告它找到了一条路径 [第 10 行]。路径提取[未在伪代码中显示]是沿着从目标顶点到起始顶点的父节点,反向检索从起始顶点到目标顶点的路径。否则,A* 会从打开列表 [第 8 行] 中删除顶点,并将该顶点插入到封闭列表 [第 11 行] 中,然后生成其每个未展开的可见相邻顶点,展开过程如下: A* 检查顶点 s 的 g 值加上顶点 s 到顶点 s′ 的直线长度是否小于顶点 s′ 的 g 值 [第 23 行]。如果是,则将顶点 s′ 的 g 值设为顶点 s 的 g 值加上从顶点 s 到顶点 s′ 的直线长度,将顶点 s′ 的父节点设为顶点 s,最后将顶点 s′ 插入以 f 值为键的开放列表,如果顶点 s′ 已在开放列表中,则将其键设为 f 值[第 24-28 行]。然后重复上述步骤。

概括地说,当 A* 在更新顶点(Update Vertex)过程中更新顶点 s 的未展开可见邻居 s′ 的 g 值和父节点时,会考虑从起始顶点到顶点 s s s 的路径 [ = g ( s ) ] [=g(s)] [=g(s)],以及从顶点 s s s 到顶点 s ′ s′ s 的直线路径 [ = c ( s , s ′ ) ] [=c(s, s′)] [=c(s,s)],结果长度为 g ( s ) + c ( s , s ′ ) g(s) + c(s, s′) g(s)+c(s,s) [第 23 行]。如果考虑的路径短于目前找到的从起始顶点到顶点 s ′ s′ s 的最短路径 [ = g ( s ′ ) ] [= g(s′)] [=g(s)],则 A* 更新顶点 s ′ s′ s g g g 值和父节点。

现在,我们将介绍几种现有的路径规划算法,它们都是 A* 的版本,以及它们如何在运行时间和路径长度这两个相互冲突的标准之间进行权衡,如图 2 所示。我们按照路径长度递减的顺序介绍这些算法。

[外链图片转存中…(img-I3B8MzxD-1700828443585)]

[外链图片转存中…(img-0yFtbyqx-1700828443585)]

4.1 A* on Grids

我们可以在栅格上运行 A* ,即在由栅格顶点和边给出的图形上运行。得到的路径被人为地限制为由栅格的边构成,如图 1(a) 所示。因此,A* 在栅格上找到的路径并不等同于真正的最短路径,而且看起来很不现实,因为它们要么与真正的最短路径有很大偏差,要么有更多的航向变化,这就为平滑它们提供了动力。我们在实验中使用算法 5 计算出的八分位距作为 h 值。

[外链图片转存中…(img-dCs6CfLx-1700828443586)]

A* with Post-Smoothed Paths (A* PS)

[外链图片转存中…(img-feUPFnGP-1700828443586)]

可以使用后平滑路径(A* PS)运行 A* (Thorpe,1984 年)。A* PS 在栅格上运行 A* ,然后在后处理步骤中平滑得到的路径,这通常会在增加运行时间的同时缩短路径。算法 2 显示了 A* PS 在我们的实验中使用的简单平滑算法的伪代码(Botea, Muller, & Schaeffer, 2004),该算法在运行时间和路径长度之间取得了良好的平衡。假设栅格上的 A* 找到路径 [ s 0 , s 1 , . . . , s n ] [s_0, s_1, ... , s_n] [s0,s1,...,sn],其中 s 0 = s s t a r t s_0 = s_{start} s0=sstart s n = s g o a l s_n = s_{goal} sn=sgoal。A* PS 将路径上的第一个顶点作为当前顶点。然后,它会检查当前顶点 s 0 s_0 s0 是否与其路径上的后继顶点 s 2 s_2 s2 有视线连接。如果是,A* PS 会从路径上删除中间顶点 s 1 s_1 s1,从而缩短路径。然后,A* PS 重复这一过程,再次检查当前顶点 s 0 s_0 s0 是否与其路径上的后继顶点 s 3 s_3 s3 有视线连接,以此类推。一旦当前顶点与其路径上的后继顶点的后继顶点不存在视线距离,A* PS 就会向前推进当前顶点并重复这一过程,直到到达路径的终点。我们在实验中使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h h h 值。

A* PS 在栅格上找到的路径通常比 A* 短,但不能保证找到真正的最短路径。图 3 显示了一个例子。假设 A* PS 找到的蓝色虚线路径是众多最短栅格路径之一。然后,它将这条路径平滑为蓝色实线路径,但这并不是一条真正的最短路径。红色虚线路径在受阻单元格 B2-B3-C3-C2 的上方(而非下方)移动,是一条真正的最短路径。A* PS 不能保证找到真正的最短路径,因为它在 A* 搜索过程中只考虑栅格路径,因此无法在 A* 搜索过程中对其他路径做出明智的决策,这也是交错搜索和平滑的动机。事实上,Theta* 除了交错搜索和平滑之外,与 A* PS 类似。

4.3 Field D* (FD*)

我们可以运行 Field D* (Ferguson & Stentz, 2006) (FD* )。FD* 沿栅格边缘传播信息,而不限制栅格边缘的路径。FD* 设计使用 D* Lite(Koenig & Likhachev,2002 年)进行快速重新规划(通过重复使用上一次 A* 搜索的信息来加速下一次搜索),并从目标顶点搜索到起始顶点。我们的 FD* 版本使用 A* ,并从起始顶点搜索到目标顶点,就像本文中的所有其他路径规划算法一样,这使得我们可以公平地比较它们,除了它们的重新规划能力。(Theta* is currently in the process of being extended for fast replanning in Nash, Koenig, & Likhachev, 2009.)

[外链图片转存中…(img-lHNlA6DI-1700828443586)]

当 FD* 更新顶点 s 的未扩展可见邻居 s ′ s′ s g g g 值和父节点时,会考虑从起始顶点到顶点 s ′ s′ s 的周长 [ = g ( X ) ] [=g(X)] [=g(X)] 上与顶点 s ′ s′ s 有视线的任意点 X(不一定是顶点)的所有路径、 其中,周长由连接顶点 s ′ s′ s 的所有相邻点以及从点 X 到顶点 s ′ s′ s 的直线 [ = c ( X , s ′ ) ] [= c(X, s′)] [=c(X,s)] 构成,长度为 g ( X ) + c ( X , s ′ ) g(X) + c(X, s′) g(X)+c(X,s) 。如果考虑的路径比目前发现的从起始顶点到顶点 s′ 的最短路径 [ = g ( s ′ ) ] [= g(s′)] [=g(s)] 短,则 FD* 更新顶点 $s′ $ 的 g g g 值和父节点。我们在实验中使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h h h 值。图 4 显示了一个例子。如粗体所示,顶点 s ′ = B 4 s′ = B4 s=B4 的周长由顶点 B4 的所有相邻点连接而成。考虑周长上的点 X。FD* 不知道点 X 的 g g g 值,因为它只存储顶点的 g g g 值。因此,它在 g ( B 3 ) = 2.41 g(B3) = 2.41 g(B3)=2.41 g ( C 3 ) = 2.00 g(C3) = 2.00 g(C3)=2.00 之间进行线性插值,得到 g ( X ) = 0.55 × 2.41 + 0.45 × 2.00 = 2.23 g(X) = 0.55 × 2.41 + 0.45 × 2.00 = 2.23 g(X)=0.55×2.41+0.45×2.00=2.23,因为 0.55 和 0.45 分别是 X 点到顶点 B3 和 C3 的距离。尽管顶点 B3 和 C3 的 g 值都等于它们的真实起始距离,但计算出的点 X 的 g g g 值与其真实起始距离 [ = 2.55 ] [= 2.55] [=2.55] 不同。出现这种错误的原因很简单。从起始顶点经过顶点 C3 或顶点 B3 到目标顶点存在真正的最短路径。因此,根据线性插值假设,从起始顶点经过连接顶点 B3 和 C3 的边上的任意点到目标顶点也一定存在一条短路径。但事实并非如此,因为这些路径需要绕过阻塞单元 B2-B3-C3-C2,这使得它们比预期的要长。由于错误计算了 X 点的栅格值,FD* 将顶点 B4 的父节点设置为 X 点,导致路径在 X 点出现不必要的航向变化,甚至比最短栅格路径还长。

[外链图片转存中…(img-YQeFhprR-1700828443586)]

FD* 的作者认识到,FD* 找到的路径经常会出现不必要的航向变化,因此建议在路径提取过程中使用一步前瞻算法(Ferguson & Stentz, 2006),FD* 在我们的实验中使用了这种算法。这种一步前瞻算法允许 FD* 避免一些不必要的航向变化,如图 4 中的航向变化,但并不能消除所有航向变化。图 5 显示了红色的 FD* 路径和蓝色的相应真实最短路径。FD* 路径仍有许多不必要的航向变化。

4.4 A* on Visibility Graphs

我们可以在可视图上运行 A* 。栅格的可见度图包含起始顶点、目标顶点和所有受阻单元的边角(Lozano-P ́ erez & Wesley,1979)。我们在实验中使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h h h 值。如图 6(a)所示,可见度图上的 A* 可以找到真正的最短路径。真正的最短路径只有在受阻单元的拐角处才会有航向变化,而栅格上的 A* 、A* PS 和 FD* 找到的路径可能会有不必要的航向变化。另一方面,可见度图上的 A* 可能比较慢。它沿着可见度图边传播信息,而可见度图边的数量会随着单元格数量的增加而呈二次增长,而栅格上的 A* 、A* PS 和 FD* 则沿着栅格边传播信息,而栅格边的数量只会随着单元格数量的增加而呈线性增长。如果在进行 A* 搜索之前构建可视图,则需要对每一对被遮挡单元的角进行视线检查,以确定它们之间是否应该有可见性图边,这对于图 6(b) 中的房间来说至少需要 2,556 次视线检查(Tozour,2004 年)。

[外链图片转存中…(img-5j1w1cPG-1700828443587)]

通过在 A* 搜索过程中构建可见性图,可以减少 A* 对可见性图进行视线检查的次数。当它扩展一个顶点时,会在扩展顶点和所有受阻单元的角落(以及目标顶点)之间执行视线检查。虽然这在某些环境下(如简单的室外地形)可以大大减少视线检查的次数,但在其他环境下(如杂乱的室内地形)却无法做到这一点。更复杂的优化方法(如减少可见度图)可以进一步减少视线检查的次数,但并不能充分提高可见度图上的 A* 速度(Liu 和 Arimoto,1992 年)。

Basic Theta*

在本节中,我们将介绍 Theta* (Nash 等人,2007 年),它是我们的任意角度路径规划 A* 版本,可沿着栅格边缘传播信息,而不会将路径限制在栅格边缘。它结合了可视图上的 A* (航向变化仅发生在受阻单元的角落)和栅格上的 A* (边的数量仅随单元数量线性增长)。如图 2 所示,它的路径只比真正的最短路径(如 A* 在可视图上找到的路径)稍长,却只比 A* 在栅格上的路径稍慢。Theta* 和 A* 在栅格上的主要区别在于,使用 Theta* 时,顶点的父节点可以是任何顶点,而使用 A* 时,顶点的父节点必须是该顶点的邻居。我们首先介绍基本 Theta* ,它是 Theta* 的一个简单版本

算法 3 显示了基本 Theta* 的伪代码。程序 Main 与算法 1 中的 A* 相同,因此没有显示。第 13 行忽略不计。我们在实验中使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h h h 值。

Operation of Basic Theta*

基本 Theta* 非常简单。它与 A* 相同,只是在更新顶点 s s s 的未展开可见邻居 s ′ s′ s g g g 值和父级时,会考虑两条路径,而不是 A* 所考虑的一条路径。图 7(a) 显示了一个示例。基本 Theta* 正在扩展具有父节点 A4 的顶点 B3,并需要更新未扩展的可见邻居 C3 的 g g g 值和父节点。基本 Theta* 考虑了两条路径:

[外链图片转存中…(img-EHmSEhla-1700828443587)]

  • 路径 1: 基本 Theta* 考虑的路径是从起始顶点到顶点 s [ = g ( s ) ] s [= g(s)] s[=g(s)] 以及从顶点 s s s 到顶点 s ′ s′ s 的直线 [ = c ( s , s ′ ) ] [= c(s, s′)] [=c(s,s)],结果长度为 g ( s ) + c ( s , s ′ ) g(s) + c(s, s′) g(s)+c(s,s) [第 52 行]。路径 1 是 A* 考虑的路径。它与图 7(a) 中红色虚线路径 [A4, B3, C3] 相对应。)
  • 路径 2: 基本 Theta* 还考虑了从起始顶点到顶点 s s s 的父顶点的路径 [ = g ( p a r e n t ( s ) ) ] [= g(parent(s))] [=g(parent(s))] 以及从顶点 s s s 的父顶点到顶点 s ′ s′ s 的直线路径 [ = c ( p a r e n t ( s ) , s ′ ) ] [= c(parent(s), s′)] [=c(parent(s),s)],结果长度为 g ( p a r e n t ( s ) ) + c ( p a r e n t ( s ) , s ′ ) g(parent(s)) + c(parent(s), s′) g(parent(s))+c(parent(s),s) [第 44 行]。路径 2 不在 A* 的考虑范围之内,它允许 Basic Theta* 构建任意角度的路径。它与图 7(a) 中的蓝色实线路径 [A4, C3] 相对应。

[外链图片转存中…(img-ggkG9CY9-1700828443587)]

由于三角形不等式,路径 2 不比路径 1 长。三角形不等式指出,三角形任意一边的长度都不长于其他两边长度之和。由于路径 1 由起始顶点到顶点 s s s 的父顶点的路径、顶点 s s s 的父顶点到顶点 s s s 的直线(直线 A)和顶点 s s s 到顶点 s ′ s′ s 的直线(直线 B)组成,路径 2 由起始顶点到顶点 s s s 的父顶点的相同路径和顶点 s s s 的父顶点到顶点 s ′ s′ s 的直线(直线 C)组成,且直线 A、B 和 C 构成一个三角形,因此三角形不等式在这里适用。路径 1 可以保证畅通无阻,但路径 2 却不能。因此,如果顶点 s ′ s′ s 与顶点 s s s 的父节点有视线相交,且路径 2 没有阻塞,则基本 Theta* 会选择路径 2 而不是路径 1。图 7(a) 显示了一个例子。图 7(b) 是一个示例。如果选择的路径短于目前发现的从起始顶点到顶点 s ′ s′ s 的最短路径 [ = g ( s ′ ) ] [= g(s′)] [=g(s)],基本 Theta* 会更新顶点 s ′ s′ s g g g 值和父节点。我们在实验中使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h 值。

5.2 Example Trace of Basic Theta*

图 8 显示了基本 Theta* 的示例轨迹。顶点标有其 g g g 值和父代。箭头指向其父节点。红色圆圈表示正在展开的顶点,蓝色箭头表示在当前展开过程中生成的顶点。首先,Basic Theta* 以父顶点 A4 展开起始顶点 A4,如图 8(a) 所示。它将顶点 A4 的未扩展可见相邻顶点的父顶点设置为顶点 A4,就像 A* 所做的那样。其次,基本 Theta* 将顶点 B3 与父节点 A4 展开,如图 8(b) 所示。顶点 B2 是顶点 B3 的未扩展可见邻居,与顶点 A4 没有视线关系。因此,基本 Theta* 根据路径 1 对其进行更新,并将其父节点设置为顶点 B3。另一方面,顶点 C2、C3 和 C4 是顶点 B3 的未展开可见邻居,与顶点 A4 有视线相交。因此,基本 Theta* 将根据路径 2 更新它们,并将它们的父节点设置为顶点 A4。(顶点 B3 的其他未扩展可见邻域的 g 值和父级不会更新)。第三,基本 Theta* 将顶点 B2 与父顶点 B3 展开,如图 8© 所示。顶点 A1 和 A2 是顶点 B2 的未扩展可见相邻顶点,与顶点 B3 没有视线关系。因此,基本 Theta* 根据路径 1 对其进行更新,并将其父节点设置为顶点 B2。另一方面,顶点 B1 和 C1 是顶点 B2 的未展开可见相邻顶点,与顶点 B3 有视线连接。因此,基本 Theta* 会根据路径 2 更新这两个顶点,并将它们的父顶点设置为顶点 B3。第四,如图 8(d)所示,Basic Theta* 将目标顶点 C1 与父顶点 B3 展开并终止。然后,路径提取会沿着目标顶点 C1 到起始顶点 A4 的父节点,反向检索出从起始顶点到目标顶点的真正最短路径 [A4, B3, C1]。

5.3 Properties of Basic Theta*

现在我们讨论基本 Theta* 的特性。

5.3.1 CORRECTNESS AND COMPLETENESS

基本 Theta* 是正确的(即只找到从起始顶点到目标顶点的无阻塞路径)和完整的(即找到一条从起始顶点到目标顶点的路径(如果存在的话))。我们在证明中使用了下面的定理。

定理 1. 如果两个顶点之间存在一条畅通无阻的路径,那么同样的两个顶点之间也存在一条畅通无阻的栅格路径。

证明 如果两个顶点之间存在一条畅通无阻的任意角路径 [ s 0 , . . . , s n ] [s_0, ... , s_n] [s0,...,sn],那么这两个顶点之间就存在一条畅通无阻的任意角路径。考虑这条任意角度路径的任意路径段 s k , s k + 1 s_k,s_{k+1} sk,sk+1。如果路径段是水平或垂直的,则考虑与路径段重合的从顶点 s k s_k sk 到顶点 s k + 1 s_{k+1} sk+1 的无阻塞栅格路径。否则,考虑该路径段经过的无阻塞单元的序列 ( b 0 , . . . , b m ) (b_0, ... , b_m) (b0,...,bm)。任何两个连续的单元格 b j b_j bj b j + 1 b_{j+1} bj+1 至少共享一个顶点 s ′ j + 1 s′_{j+1} sj+1,因为这两个单元格要么共享一条边,要么对角相邻。(考虑栅格路径 [ s ′ 0 = s k , s ′ 1 , . . . , s ′ m , s ′ m + 1 = s k + 1 ] [s′_{0} = s_{k}, s′_{1}, ... , s′_{m}, s′_{m+1} = s_{k+1}] [s0=sk,s1,...,sm,sm+1=sk+1]。这条从顶点 s k s_{k} sk 到顶点 s k + 1 s_{k+1} sk+1 的栅格路径是无阻塞的,因为上面任意两个连续的顶点都是同一个无阻塞单元的角,因此是可见的邻居。对任意角度路径的每个路径段重复此步骤,并将得到的栅格路径串联成一条从顶点 s 0 s_0 s0 到顶点 s n s_n sn 的无阻塞栅格路径(如果栅格路径上的几个连续顶点相同,则可以删除除一个顶点以外的所有顶点)。

定理 2. 在基本 Theta* 执行过程中的任何时刻,从开放或封闭列表中的任何顶点到起始顶点的父节点,都能检索到一条从起始顶点到该顶点的反向无阻塞路径。

证明 我们通过归纳法证明该定理成立,并且在开放列表或封闭列表的结合部中的任何顶点的父顶点本身也在开放列表或封闭列表的结合部中。这句话最初成立的原因是,起始顶点是开放列表或封闭列表联合体中的唯一顶点,而且它是自己的父顶点。我们现在证明,只要顶点改变了它的父顶点或它在开放列表或封闭列表的联合体中的成员身份,该声明就会继续成立。顶点一旦成为开放或封闭列表联盟的成员,它就会一直是联盟的成员。只有当基本 Theta* 扩展了某个顶点 s s s,并在更新顶点(UpdateVertex)过程中更新了顶点 s s s 的未扩展可见邻居 s ′ s′ s g g g 值和父级时,顶点才能成为开放或封闭列表联盟中的成员。因此,顶点 s s s 位于封闭列表中,根据归纳假设,其父节点位于开放列表或封闭列表的结合部。因此,根据归纳假设,沿着顶点 s s s(或其父节点)到起始顶点的父节点,可以反向检索出一条从起始顶点到顶点 s s s(或其父节点)的无阻塞路径。如果基本 Theta* 根据路径 1 更新顶点 s ′ s′ s,那么语句继续成立,因为顶点 s s s s ′ s′ s 是可见的相邻顶点,因此从顶点 s s s 到顶点 s ′ s′ s 的路径段是畅通的。如果基本 Theta* 根据路径 2 更新顶点 s ′ s′ s,那么语句继续成立,因为基本 Theta* 明确检查了从顶点 s s s 的父节点到顶点 s ′ s′ s 的路径段是否畅通无阻。顶点的父节点没有其他变化方式。

定理 1.​ 如果存在从起始顶点到目标顶点的无阻塞路径,则基本 Theta* 会终止,路径提取会检索到该路径。否则,基本 Theta* 将终止并报告不存在无阻塞路径。

证明 下列性质共同证明了本定理。它们的证明利用了这样一个事实,即如果open list的顶点为空或扩展了目标顶点,基本 Theta* 就会终止。起始顶点最初位于 open list 中。任何其他顶点最初既不在 open list 中,也不在 close list 中。既不在打开列表中也不在关闭列表中的顶点可以插入到open list中。open list中的顶点可以从open list中移除,并插入到close list中。close list中的顶点会一直保留在封闭列表中。

性质 1: 基本 Theta* 终止。每次迭代都会在 open list 中扩展一个顶点。在此过程中,它会将顶点从 open list 中移除,然后再也无法将其插入 open list 中。由于顶点的数量是有限的,open list 最终会变空,如果基本Theta* 没有提前终止,就必须终止。

性质 2: 如果基本 Theta* 因其 open list 为空而终止,则不存在从起始顶点到目标顶点的无阻塞路径。我们证明反证。假设存在一条从起始顶点到目标顶点的畅通无阻的路径。我们通过矛盾证明,Basic Theta* 不会终止,因为它的 open list 是空的。因此,也假设 Basic Theta* 终止是因为其 open list 为空。那么,根据定理 1,存在一条从起始顶点到目标顶点的无阻塞栅格路径 [ s 0 = s s t a r t , . . . , s n = s g o a l ] [s_0 = s_{start}, ... , s_n = s_{goal}] [s0=sstart,...,sn=sgoal]。选择顶点 si 作为栅格路径上的第一个顶点,当 Basic Theta* 终止时,该顶点不在 close list 中。基本 Theta* 终止时,目标顶点不在封闭列表中,因为基本 Theta* 在扩展目标顶点时会终止。因此,顶点 s i s_i si 存在。顶点 s i s_i si 不是起始顶点,因为起始顶点本应在打开列表中,而 Basic Theta* 不可能终止,因为它的打开列表是空的。因此,顶点 s i s_i si 在栅格路径上有一个前置顶点。由于顶点 s i s_i si 是栅格路径上的第一个顶点,在 Basic Theta* 终止时不在封闭列表中,因此当 Basic Theta* 终止时,这个前置顶点在封闭列表中。当 Basic Theta* 扩展前置顶点时,会将顶点 s i s_i si 添加到开放列表中。因此,当 Basic Theta* 终止时,顶点 s i s_i si 仍在打开列表中。但是,Basic Theta* 不可能终止,因为它的打开列表是空的,这是一个矛盾。

性质 3: 如果基本 Theta* 因为扩展了目标顶点而终止,那么路径提取会检索出一条从起始顶点到目标顶点的畅通无阻的路径,因为根据引理 2,沿着从目标顶点到起始顶点的父节点,可以反向检索出一条从起始顶点到目标顶点的畅通无阻的路径。

[外链图片转存中…(img-RTUXBSlL-1700828443587)]

5.3.2 OPTIMALITY

基本 Theta* 并不是最优的(也就是说,它不能保证找到真正的最短路径),因为顶点的父节点必须是该顶点的可见邻居或可见邻居的父节点,而真正的最短路径并非总是如此。图 9(a) 显示了这样一个例子:红色虚线路径 [E1, B9] 是一条从起始顶点 E1 到顶点 B9 的真正最短路径,因为顶点 E1 与顶点 B9 是视线相交。但是,顶点 E1 既不是顶点 B9 的可见邻居,也不是其可见邻居的父顶点,因为顶点 E1 与这些顶点(红色突出显示)之间没有视线。因此,Basic Theta* 无法将顶点 B9 的父顶点设置为顶点 E1,也无法找到从顶点 E1 到顶点 B9 的真正最短路径。

同样,图 9(b) 显示了一个示例,红色虚线路径 [E1, D8, C10] 是一条从顶点 E1 到顶点 C10 的真正最短路径。然而,顶点 D8 既不是顶点 C10 的可见邻居,也不是其可见邻居的父节点,因为起始顶点 E1 要么有视线通向它们,要么 Basic Theta* 找到了从顶点 E1 到它们的不包含顶点 D8 的路径。事实上,从顶点 E1 到顶点 C10 的所有可见相邻顶点的真正最短路径,顶点 E1 没有视线移动到受阻单元格 C7C8-D8-D7 的上方(而不是下方)。因此,Basic Theta* 无法将顶点 C10 的父节点设置为顶点 D8,也就无法找到从顶点 E1 到顶点 C10 的真正最短路径。图 9(a) 中从顶点 E1 到顶点 B9 的蓝色实线路径和图 9(b) 中从顶点 E1 到顶点 C10 的蓝色实线路径比真正的最短路径长不到 1.002 倍。

[外链图片转存中…(img-w0qqE1iE-1700828443587)]

5.3.3 HEADING CHANGES

Basic Theta* 利用了真正的最短路径只在受阻单元格的角上有方向变化这一事实。然而,Basic Theta* 找到的路径偶尔会出现不必要的方向变化。图 10 显示了一个示例,Basic Theta* 找到了从顶点 A1 到顶点 D6 的蓝色实线路径 [A1,D5,D6]。出现这种错误的原因很简单。假设 open list 同时包含顶点 C5 和 D5。顶点 C5 的 f 值为 f ( C 5 ) = g ( C 5 ) + h ( C 5 ) = 4.61 + 1.41 = 6.02 f (C5) = g(C5) + h(C5) = 4.61 + 1.41 = 6.02 f(C5)=g(C5)+h(C5)=4.61+1.41=6.02,其父顶点为顶点 C4。顶点 D5 的 f f f 值为 f ( D 5 ) = 5.00 + 1.00 = 6.00 f (D5) = 5.00 + 1.00 = 6.00 f(D5)=5.00+1.00=6.00,其父顶点为顶点 A1。因此,Basic Theta* 先于顶点 C5 展开顶点 D5(因为其 f f f 值更小)。当基本 Theta* 以父顶点 A1 展开顶点 D5 时,会生成顶点 D6。顶点 D6 是顶点 D5 的未展开可见邻居,与顶点 A1 没有视线关系。因此,基本 Theta* 根据路径 1 对其进行更新,将其 f 值设置为 f ( D 6 ) = 6.00 + 0.00 = 6.00 f (D6) = 6.00 + 0.00 = 6.00 f(D6)=6.00+0.00=6.00,将其父节点设置为顶点 D5,并将其插入到 open list 中。因此,基本 Theta* 会在顶点 C5 之前扩展目标顶点 D6(因为其 f 值更小)并终止。然后,路径提取会从目标顶点 D6 开始,沿着父级顶点 A1 提取出蓝色实线路径 [A1、D5、D6]。因此,Basic Theta* 从未扩展顶点 C5,这将导致它根据路径 2 将顶点 D6 的父节点设置为顶点 C4,而路径提取将检索到红色虚线路径 [A1、C4、D6],这才是真正的最短路径。图 10 中从顶点 A1 到顶点 D6 的蓝色实线路径比真正的最短路径长不到 1.027 倍。

[外链图片转存中…(img-hvmXIRvT-1700828443588)]

6. Angle-Propagation Theta* (AP Theta*)

==由于每次视线检查的运行时间与单元格数呈线性关系,因此每次顶点扩展(即在扩展顶点时生成未扩展的可见邻域所消耗的运行时间)的基本 Theta* 运行时间与单元格数呈线性关系。==在本节中,我们将介绍角度传播 Theta* (AP Theta* ),它将基本 Theta* 每个顶点扩展的运行时间从线性减少为常数1。AP Theta* 与 Basic Theta* 的主要区别在于,AP Theta* 传播角度范围,并利用它们来确定两个顶点是否有视线。

如果顶点处有光源,而光线无法穿过被遮挡的单元格,那么阴影中的单元格与顶点没有视线接触,而所有其他单元格与顶点有视线接触。每个与顶点有视线的点的连续区域都可以用两条从顶点发出的光线来描述,因此也可以用两个角度边界定义的角度范围来描述。图 11 显示了一个示例,由两个角度边界 θ 1 \theta_1 θ1 t h e t a 2 theta_2 theta2 定义的红色角度范围内的所有点都与顶点 s s s 有视线接触。 AP Theta* 在扩展顶点时计算顶点的角度范围,然后沿栅格边缘传播,因此每次顶点扩展的运行时间是恒定的,因为角度范围可以在恒定时间内传播,视线检查也可以在恒定时间内执行。

算法 4 显示了 AP Theta* 的伪代码。程序 Main 与算法 1 中的 A* 相同,因此没有显示。第 13 行将被执行。在实验中,我们使用直线距离 h ( s ) = c ( s , s g o a l ) h(s) = c(s, sgoal) h(s)=c(s,sgoal) 作为 h h h 值。

[外链图片转存中…(img-H9bzyBXo-1700828443588)]

6.1 Definition of Angle Ranges

现在我们讨论角度范围这一关键概念。AP Theta* 为每个顶点 s 保留两个附加值,即顶点 s 的下角边界 l b ( s ) lb(s) lb(s) 和顶点 s 的上角边界 u b ( s ) ub(s) ub(s),它们共同构成顶点 s 的角度范围 [ l b ( s ) , u b ( s ) ] [lb(s), ub(s)] [lb(s),ub(s)]。角度边界对应于从顶点 s 的父顶点出发的射线的方向(以度为单位),从顶点 s 的父顶点到顶点 s 的射线方向为零度。如果(但不一定只有)从顶点 s s s 的父顶点到顶点 s s s 的可见邻居的射线的方向包含在顶点 s s s 的角度范围内,则保证顶点 s 的可见邻居与顶点 s s s 的父顶点有视线相交。图 12 显示了这样一个例子:顶点 C3 的父顶点 A4 的角度范围为 [ − 18 , 27 ] [-18, 27] [18,27]。因此,红色区域中顶点 C3 的所有可见邻居都保证与顶点 C3 的父顶点有视线接触。例如,顶点 C4 保证与顶点 C3 的父顶点有视线接触,但顶点 B2 却没有。因此 AP Theta* 假设顶点 B2 与顶点 C3 的父节点不存在视线关系。

[外链图片转存中…(img-AROl54pw-1700828443588)]

现在我们更正式地定义角度范围的概念。 Θ ( s , p , s ′ ) ∈ [ − 90 , 90 ] \Theta(s, p, s′) ∈ [-90, 90] Θ(s,p,s)[90,90] 是顶点 p 到顶点 s 的射线与顶点 p 到顶点 s ′ s′ s 的射线之间的夹角(以度为单位),AP Theta* 也因此而得名。如果从顶点 p 到顶点 s s s 的射线与从顶点 p 到顶点 s ′ s′ s 的射线顺时针方向相反,则角度为正;如果从顶点 p 到顶点 s s s 的射线与从顶点 p 到顶点 s ′ s′ s 的射线方向相同,则角度为零;如果从顶点 p 到顶点 s s s 的射线与从顶点 p 到顶点 s ′ s′ s 的射线逆时针方向相反,则角度为负。图 12 显示了一个 Θ ( C 3 , A 4 , C 4 ) = 27 \Theta(C3, A4, C4) = 27 Θ(C3,A4,C4)=27 Θ ( C 3 , A 4 , B 3 ) = − 18 \Theta(C3, A4, B3) = -18 Θ(C3,A4,B3)=18 的例子。如果(但不一定只有) l b ( s ) ≤ Θ ( s , p a r e n t ( s ) , s ′ ) ≤ u b ( s ) lb(s) ≤ \Theta(s, parent(s), s′) ≤ ub(s) lb(s)Θ(s,parent(s),s)ub(s),则保证顶点 s s s 的可见邻居 s ′ s′ s 与顶点 s s s 的父顶点有视线接触(可见性属性)。

6.2 Update of Angle Ranges

现在我们讨论 AP Theta* 在扩展顶点时如何计算顶点的角度范围。由于顶点展开的顺序取决于多种因素,例如 h h h 值,因此 AP Theta* 无法保证拥有足够的信息来精确确定角度范围,这使得计算变得复杂。在这种情况下,AP Theta* 可以对角度范围进行超出必要的限制,以保证可见性属性成立,并找到未阻塞的路径。

AP Theta* 扩展顶点 s s s 时,最初会将顶点 s s s 的角度范围设置为 [ − ∞ , ∞ ] [-\infty, \infty] [,],这意味着该顶点的所有可见邻居都能保证与该顶点的父顶点有视线接触。然后,如果顶点 s 不是起始顶点,角度范围的限制会越来越大。

AP Theta* 根据与顶点 s s s 相邻的每个受阻单元 b b b(即顶点 s s s b b b 的一个角,写成 s ∈ c o r n e r s ( b ) s∈ corners(b) scorners(b))来限制顶点 s s s 的角度范围,前提是至少满足两个条件中的一个:

  • 情况 1:如果受阻单元 b 的每个角 s ′ s′ s 至少满足以下条件之一:

    • p a r e n t ( s ) = s ′ parent(s)= s′ parent(s)=s
    • Θ ( s , p a r e n t ( s ) , s ′ ) < 0 \Theta(s,parent(s), s') < 0 Θ(s,parent(s),s)<0
    • Θ ( s , p a r e n t ( s ) , s ′ ) = 0 \Theta(s,parent(s), s')=0 Θ(s,parent(s),s)=0 c ( p a r e n t ( s ) , s ′ ) ≤ c ( p a r e n t ( s ) , s ) , c(parent(s), s′) ≤ c(parent(s), s), c(parent(s),s)c(parent(s),s),

    那么 AP Theta* 假设,如果从顶点 s s s 的父顶点到顶点 s s s 的射线与从顶点 s s s 的父顶点到顶点 s ′′ s′′ s′′ 的射线逆时针方向,即如果 Θ ( s , p a r e n t ( s ) , s ′′) < 0 \Theta(s, parent(s), s′′)< 0 Θs,parent(s),s′′<0,则顶点 s ′′ s′′ s′′ 没有视线到顶点 s s s 的父顶点。因此 AP Theta* 将顶点 s 的下角边界设为 Θ ( s , p a r e n t ( s ) , s ) = 0 \Theta(s, parent(s), s) = 0 Θ(s,parent(s),s)=0 [第 83 行]。

  • 情况 2:如果受阻单元 b 的每个角 s ′ s′ s 至少满足以下条件之一:

    • p a r e n t ( s ) = s ′ parent(s) = s′ parent(s)=s
    • Θ ( s , p a r e n t ( s ) , s ′ ) > 0 \Theta(s, parent(s), s′) > 0 Θ(s,parent(s),s)>0
    • Θ ( s , p a r e n t ( s ) , s ′ ) = 0 \Theta(s, parent(s), s′) = 0 Θ(s,parent(s),s)=0 c ( p a r e n t ( s ) , s ′ ) ≤ c ( p a r e n t ( s ) , s ) c(parent(s), s′) ≤ c(parent(s), s) c(parent(s),s)c(parent(s),s)

    则 AP Theta* 假设,如果从顶点 s 的父顶点到顶点 s s s 的射线与从顶点 s s s 的父顶点到顶点 s ′′ s′′ s′′ 的射线顺时针方向,即如果 Θ ( s , p a r e n t ( s ) , s ′′ ) > 0 \Theta(s, parent(s), s′′)> 0 Θ(s,parent(s),s′′)>0,则顶点 s′′ 没有视线到顶点 s 的父顶点。因此 AP Theta* 将顶点 s 的角度上限设为 Θ ( s , p a r e n t ( s ) , s ) = 0 \Theta (s, parent(s), s) = 0 Θ(s,parent(s),s)=0 [第 86 行]。

AP Theta* 还会根据顶点 s s s 的每个可见邻居 s ′ s′ s 来限制顶点 s s s 的角度范围,前提是满足两个条件中的至少一个:

  • 情况 3:如果顶点 s ′ s′ s 满足以下所有条件:

    • s ′ ∈ c l o s e d s′ ∈ closed sclosed
    • p a r e n t ( s ) = p a r e n t ( s ′ ) parent(s) = parent(s′) parent(s)=parent(s)
    • s ′ ≠ s s t a r t s′ \not= sstart s=sstart,

    则 AP Theta* 通过与顶点 s ′ s′ s 的角度范围相交来限制顶点 s s s 的角度范围 [第 90 和 92 行]。为此,它首先将顶点 s ′ s′ s 的角度范围移动 Θ ( s , p a r e n t ( s ) , s ′ ) \Theta (s, parent(s), s′) Θ(s,parent(s),s)度,以考虑顶点 s ′ s′ s 的角度范围已校准为从顶点 s s s s ′ s′ s 的共同父顶点到顶点 s ′ s′ s 的射线方向为零度、 同时校准顶点 s s s 的角度范围,使顶点 s s s s ′ s′ s 的父顶点到顶点 s s s 的射线方向为零度。第 89 和 91 行分别确保角度下限值始终为非正值和角度上限值始终为非负值。角度下限值应为非正值(角度上限值应为非负值)这一事实很直观,因为如果顶点 s s s 被指定为父顶点 p,那么从顶点 p 到顶点 s 的射线角度应包含在顶点 s 的角度范围内。

  • 情况 4:如果顶点 s′ 满足以下所有条件:

    • c ( p a r e n t ( s ) , s ′ ) < c ( p a r e n t ( s ) , s ) c(parent(s), s′) < c(parent(s), s) c(parent(s),s)<c(parent(s),s)
    • p a r e n t ( s ) ≠ s ′ parent(s) \not= s′ parent(s)=s
    • s ′ ∉ c l o s e d s′ \not∈ closed sclosed p a r e n t ( s ) ≠ p a r e n t ( s ′ ) , parent(s) \not= parent(s′), parent(s)=parent(s),

    那么 AP Theta* 没有足够的顶点 s ′ s′ s 的信息。因此,AP Theta* 无法准确确定顶点 s s s 的角度范围,只能做一个保守的假设,即顶点 s ′ s′ s 几乎看不到顶点 s s s 的父点 [第 95 和 97 行]。

AP Theta* 在更新边界(UpdateBounds)过程中更新了顶点 s s s 的角度范围后,可见性属性保持不变。因此,当 AP Theta* 检查顶点 s s s 的可见邻居 s ′ s′ s 是否与顶点 s s s 的父节点有视线时,它现在会检查 l b ( s ) ≤ Θ ( s , p a r e n t ( s ) , s ′ ) ≤ u b ( s ) lb(s) ≤ \Theta(s, parent(s), s′) ≤ ub(s) lb(s)Θ(s,parent(s),s)ub(s) [第 60 行] 是否为真,而不是 L i n e O f S i g h t ( p a r e n t ( s ) , s ′ ) LineOfSight(parent(s), s′) LineOfSight(parent(s),s) [第 42 行] 是否为真。这就是 AP Theta* 和 Basic Theta* 之间的唯一区别。

[外链图片转存中…(img-2mOk8GBx-1700828443588)]

图 13(a) 显示了 AP Theta* 计算顶点 A4 的角度范围的示例。它将角度范围设置为 [ − ∞ , ∞ ] [-\infty, \infty] [,]。图 13(b) 是 AP Theta* 计算顶点 B3 的角度范围的示例。它将角度范围初始设置为 [ − ∞ , ∞ ] [-\infty,\infty] []。然后根据 A2-A3-B3-B2 单元 [第 83 行],按照情况 1 将角度下限设置为 0 度。根据情况 4,它将顶点 B4 的角度上限设置为 45 度,因为顶点 B4 尚未展开,因此不在 close list 中 [第 97 行]。图 13© 显示了 AP Theta* 计算顶点 B2 的角度范围的示例。它将角度范围初始设置为 [ − ∞ , ∞ ] [-\infty,\infty] []。然后根据 A2-A3-B3-B2 单元[第 83 行]的阻塞情况,按照情况 1 将角度下限设为 0 度。假设顶点 C1 不是目标顶点。图 13(d) 显示了 AP Theta* 计算顶点 C1 的角度范围的示例。它最初将角度范围设置为 [ − ∞ , ∞ ] [-\infty, \infty] [,]。然后,它根据情况 3,以顶点 B2 为基础,将角度下限设为 -27 度[第 90 行],并根据情况 4,以顶点 C2 为基础,将角度上限设为 18 度,而顶点 C2 是未展开的,因此不在 close list 中[第 97 行]。

6.3 Example Trace of AP Theta*

图 13 是利用图 8 中的路径规划问题绘制的 AP Theta* 曲线示例。顶点的标签现在包括了角度范围。

6.4 Properties of AP Theta*

现在我们来讨论 AP Theta* 的特性。AP Theta* 的运行方式与基本 Theta* 相同,因此具有与基本 Theta* 相似的特性。例如,AP Theta* 是正确和完整的。它不能保证找到真正的最短路径,而且其路径偶尔会出现不必要的航向变化。

[外链图片转存中…(img-J3hEcqEg-1700828443589)]

AP Theta* 有时会对角度范围进行超出必要的限制,以保证找到无遮挡的路径,这意味着它的视线检查有时会错误地失败,在这种情况下,它必须根据路径 1 而不是路径 2 更新顶点。AP Theta* 仍然是完整的,因为如果所有视线检查都失败,它也能找到一条无遮挡的栅格路径;如果存在一条无遮挡的任意角度路径,它也总是存在一条无遮挡的栅格路径。不过,AP Theta* 找到的路径可能比 Basic Theta* 找到的路径更长。图 14 显示了一个示例。当 AP Theta* 用父 B1 展开顶点 C4 并计算顶点 C4 的角度范围时,顶点 C3 未展开,因此不在 close list 中。这意味着 AP Theta* 没有关于顶点 C3 的足够信息,例如,它不知道单元格 C2-C3-D3-D2 是否未封锁。因此,AP Theta* 无法准确确定顶点 C4 的角度范围,只能做出顶点 C3 与顶点 B1 几乎没有视线的保守假设,并根据顶点 C3 按照情况 4 设置顶点 C4 的角度下限。然后,它使用得到的角度范围确定顶点 C4 的未扩展可见邻居 D4 不能保证与顶点 B1 有视线接触。但是,如果单元格 C2-C3-D3-D2 未被遮挡,顶点 D4 确实与顶点 B1 有视线连接。AP Theta* 最终找到了从起始顶点 B1 到顶点 D4 的蓝色实线路径 [B1,C3,D4],而 Basic Theta* 找到了红色虚线路径 [B1,D4],这是真正的最短路径。

由于 AP Theta* 执行视线检查的方式不同,Basic Theta* 的正确性和完整性证明需要针对 AP Theta* 稍作修改。

定理 2. AP Theta* 终止后,如果存在从起始顶点到目标顶点的无阻塞路径,路径提取将检索到该路径。否则,AP Theta* 终止并报告不存在无阻塞路径。

证明 证明与定理 1 的证明类似,因为 AP Theta* 只使用角度范围来确定路径 2 是否受阻,而不是确定路径 1 是否受阻。唯一需要证明的不同属性是,如果(但不一定只有当)AP Theta* 的视线检查成功,两个顶点确实有视线,见附录 B。

[外链图片转存中…(img-ohyo7Ey8-1700828443589)]

7. Experimental Results

在本节中,我们将基本 Theta* 和 AP Theta* 与栅格上的 A* 和可视图上的 A* 、 A* PS、FD* 进行比较,比较它们的路径长度、顶点扩展次数、运行时间(以秒为单位)和航向变化次数。

我们在 100 × 100 和 500 × 500 的栅格上对这些路径规划算法进行了比较,这些栅格包含不同比例的随机阻塞单元(随机栅格)和来自即时战略游戏《博德之门 II》的缩放地图(游戏地图)。图 15(Bulitko、Sturtevant 和 Kazakevich,2005 年)显示了游戏地图的一个示例。起始顶点和目标顶点是单元格的西南角。对于随机栅格,起始顶点位于西南方的单元格中。目标顶点位于从最东边的单元格列中随机选择的单元格中。单元是随机阻塞的,但未阻塞单元的一单元边界保证了从起点顶点到目标顶点的路径。对于游戏地图,起始顶点和目标顶点是从未被阻塞的单元格的角上随机选择的。我们对 500 个随机 100 × 100 栅格、500 个随机 500 × 500 栅格和 118 个游戏地图进行了平均计算。

[外链图片转存中…(img-QbeOQ77d-1700828443589)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/185519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EFAK-v3.0.1版部署与使用

一、前言 EFAK&#xff08;(Eagle For Apache Kafka&#xff0c;以前称为Kafka Eagle&#xff09;用于在使用 Topic 的情况下监控 Kafka 集群。包含Offset 的产生、Lag的变化、Partition的分布、Owner、Topic的创建以及修改的时间等信息。 二、环境&安装包 官方下载连接E…

2023年【R1快开门式压力容器操作】考试资料及R1快开门式压力容器操作复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R1快开门式压力容器操作考试资料参考答案及R1快开门式压力容器操作考试试题解析是安全生产模拟考试一点通题库老师及R1快开门式压力容器操作操作证已考过的学员汇总&#xff0c;相对有效帮助R1快开门式压力容器操作复…

运动鞋品牌识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

【Spring Boot 源码学习】自定义 Banner 信息打印

Spring Boot 源码学习系列 自定义 Banner 信息打印 引言往期内容主要内容1. ResourceBanner 打印1.1 添加默认的 banner.txt 资源文件1.2 指定任意路径的资源文件1.3 添加自定义的信息 2. ImageBanner 打印2.1 添加默认的图像资源文件2.2 指定任意路径的图像资源文件2.3 添加自…

网站监控是什么

在当今高度互联的世界中&#xff0c;网站已成为企业和个人成功的关键因素。无论是提供产品或服务&#xff0c;还是建立品牌形象&#xff0c;网站都是不可或缺的工具。然而&#xff0c;随着互联网用户对访问速度和用户体验的高要求&#xff0c;保持网站的稳定性和可用性变得至关…

旋转的数组

分享今天看到的一个题目&#xff0c;不同思路解法 题目 思路1&#xff1a;时间复杂度0(N*k&#xff09; void rotate(int *a,int N,int k)//N为数组元素个数 { while(k--) { int tema[N-1]; for(int rightN-2;right>0;right--) { a[right1]a[right]; } a[0]tem; …

Seata的部署和集成

文章目录 一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos配置 一、部署Seata的t…

静态web服务器开发之HTTP协议

文章目录 版权声明HTTP协议网址HTTPS补充&#xff1a;HTTP的无状态特性浏览器访问Web服务器流程HTTP协议请求报文HTTP GET请求报文分析POST请求方式要点总结 HTTP协议响应报文HTTP 响应报文分析HTTP 状态码要点总结 HTTP协议通信过程查看 版权声明 本博客的内容基于我个人学习…

矩阵论(Matrix)

​ 大纲 矩阵微积分&#xff1a;多元微积分的一种特殊表达&#xff0c;尤其是在矩阵空间上进行讨论的时候逆矩阵(inverse matrix)矩阵分解&#xff1a;特征分解&#xff08;Eigendecomposition&#xff09;&#xff0c;又称谱分解&#xff08;Spectral decomposition&#xf…

Spark SQL 时间格式处理

初始化Spark Sql package pbcp_2023.clear_dataimport org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{current_date, current_timestamp}object twe_2 {def main(args: Array[String]): Unit {val con new …

优秀的时间追踪软件Timemator for Mac轻松管理时间!

在现代社会&#xff0c;时间管理成为了我们工作和生活中的一大挑战。如果你经常感到时间不够用&#xff0c;无法高效地完成任务&#xff0c;那么Timemator for Mac将成为你的得力助手。 Timemator for Mac是一款出色的时间追踪软件&#xff0c;它可以帮助你精确记录和管理你的…

Codeforces Round 786 (Div. 3) D. A-B-C Sort

D. A-B-C Sort 步骤 1 &#xff1a;当 a不为空时&#xff0c;从 a中取出最后一个元素&#xff0c;并将其移动到数组 b的中间。如果 b 当前长度为奇数&#xff0c;则可以选择&#xff1a;将 a 中的元素放到 b 中间元素的左边或右边。结果&#xff0c; a 变空&#xff0c; b 由 n…

【2023.11.24】Mybatis基本连接语法学习➹

基本配置 1.如果使用Maven管理项目&#xff0c;需要在pom.xml中配置依赖。 2.安装Mybatis-3.5.7.jar包 3.进行XML配置&#xff1a;这里将文件命名为mybatis-config.xml 配置数据库连接XML文件 <?xml version"1.0" encoding"UTF-8" ?> <!DO…

数据结构-归并排序+计数排序

1.归并排序 基本思想&#xff1a; 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个…

Relabel与Metic Relabel

Prometheus支持多种方式的自动发现目标&#xff08;targets&#xff09;&#xff0c;以下是一些常见的自动发现方式&#xff1a; 静态配置&#xff1a;您可以在Prometheus配置文件中直接列出要监测的目标。这种方式适用于目标相对稳定的情况下&#xff0c;例如固定的服务器或设…

【多线程】Thread类的使用

目录 1.概述 2.Thread的常见构造方法 3.Thread的几个常见属性 4.启动一个线程-start() 5.中断一个线程 5.1通过共享的标记来进行沟通 5.2 调用 interrupt() 方法来通知 6.等待一个进程 7.获取当前线程引用 8.线程的状态 8.1所有状态 8.2线程状态和转移的意义 1.概述 …

字节序

计算机硬件有两种储存数据的方式&#xff1a;大端字节序big endian 和 小端字节序 little endian。 数值0x2211使用两个字节储存&#xff1a;高位字节是0x22&#xff0c;低位字节是0x11。 大端字节序&#xff1a;低位放高地址&#xff0c;高位字节在低地址&#xff0c;地址空间…

JDBC编程方法及细节

JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言用于连接和操作数据库的API&#xff08;Application Programming Interface&#xff09;。它为开发人员提供了一组Java类和接口&#xff0c;用于与各种关系型数据库进行通信。使用JDBC&#xff0c;开发人…

路径规划之Best-First Search算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之Best-First Search算法 系列文章目录前言一、Best-First Search算法1.1 起源1.2 过程 三、简单使用 前言 Best-First Search算法和Dijkstra算法类似&#xff0c;都属于BFS的扩展或改进 一、…

【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)

本文从14大模块展示了python高级用的应用。分别有Linux命令&#xff0c;多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 全套md格式笔记和代码自…