阳光算法(改进版):面向密集小障碍物复杂环境的路径规划方法与严谨的O(n)时间复杂度证明

阳光算法(改进版):面向密集小障碍物复杂环境的路径规划方法与严谨的O(n)时间复杂度证明

        阳光算法是一种全新的基于采样的平面路径规划方法,该方法的主要思路是通过模仿阳光照射的自然现象搜索到采集地形或障碍物边缘的切点从而快速构建出可行性路径,非常适合于解决迷宫等复杂地形下的全局路径规划问题。该方法在简洁的同时拥有极高的搜索效率,其计算复杂度经证明也比现有的RRT系列算法更低,关于该方法的详细介绍可以参考https://blog.ZEEKLOG.net/seabiscuit1993/article/details/147731476, 本文不再赘述。尽管阳光算法相较于传统路径规划方法具备显著优势,但其在部分环节仍存在严谨性与完备性方面的不足。本文针对传统的阳光算法中存在的问题做出了两个关键性改进,并通过进一步的分析和仿真实验对比,验证了所提改进方案的优越性和有效性。该改进算法已发表在如下期刊。

Yingjie Deng et al 2026 Meas. Sci. Technol. 37 096303,doi:10.1088/1361-6501/ae49b1

        首先是地图搜索完备性的问题。阳光算法对于地图的探索主要通过

FindTangent(\cdot)

寻找地形或者障碍图的边缘切点,具体是通过模拟阳光照射的现象,以路径节点

x_{sun}

为中心发射等角度间隔的太阳光线的方式来进行采样,之后对采样点进行筛选就可以获得符合条件的路径切点,如图1所示。这种采样方法对于连续不间断的地形或者障碍物边缘效果很好,但是对于密集小障碍物环境却很不理想,这是因为用于搜索的射线间的角度间隔固定,随着射线的逐渐延长,两条射线间的弧长也在逐渐增大,最终两个切点间的距离也会逐渐增加,如图2所示。这会直接导致密集环境中障碍物边缘切点的大量丢失,从而影响算法对于最短可行性路径的搜索。

图1   左图为360°照射采样,右图为切点采样

        针对等角度间隔采样不足的问题,改进后的阳光算法提出了一种自适应采样补偿机制,可以有效解决采样点丢失。改进后的

FindTangent\_mod(\cdot)

函数的伪代码如图3所示。当阳光射线由点

x_{sun}

以等角度间隔射出后,首先寻找两条射线间的最短弧长并将其设为

s

,以最短弧长

s

为基准,对于其他任意两条射线所对应的弧长

L

,如果存在关系

L=m*s

,那么就在这两条射线间的区域额外插入

m-1

条射线来将该区域平均划分为

m

份,如图4所示,其中

m

的定义式为

m=\max\left \{ 1, round\left ( \frac{\min\left \{ L,L_{pre} \right \}*\pi*\theta_{step}}{180*arc} \right ) \right \}

图2   密集小障碍物环境中的切点采样图

        有些读者可能会有这样的问题,难道不可以通过减小太阳射线间的角度间隔来提高在小障碍物密集区域的采样点数量吗?这种思路其实是可行的,然而一般的搜索地图中不仅存在小障碍物密集区域,还存在具有连续不间断边缘的大型障碍物,在这种情况下较小的角度间隔反而会生成大量的冗余节点,降低采样进行的效率,因此自适应采样补偿机制本质上是一种角度间隔的自适应调整。

图3    

FindTangent\_mod(\cdot)

函数伪代码

        除了采样点丢失的问题外,传统的阳光算法还存在时间复杂度的证明不严谨的问题。由证明的过程可知,阳光算法的时间复杂度为

O\left ( n \right )

的前提是数据集

Openset

为有限集合。但是传统的阳光算法并不存在

Openset

筛选机制,因此实际上

Openset

是无上限的,这不仅导致了时间复杂度验证的严谨性问题,无上限也意味着集合中存在冗余节点,这将降低算法的运行速度。为了提高算法的搜索速度,同时确保计算复杂度验证的严谨性,改进后的阳光算法提出了一种新型的滤波筛选机制用来保证集合

Openset

的有限性。这种滤波机制建立在之前的

NotOtherSon

的基础上,在筛选切点之前,首先对已经保存在

Openset

中的节点进行筛选。如图5所示,首先选取任意一个切点

x_{pt}

,对于

Openset

中的任意一个节点

x

L_1

表示从出发点

x_{start}

到达该点的原始路径的长度,

L_2

表示由出发点

x_{start}

经过点

x_{sun}

和切点

x_{pt}

到达该点的长度,如果存在关系

L_1>L_2

,那么说明到达该点的原始路径不是最优的,并将该点和其对应的连接关系从相应的集合中去除,重复上述操作直到所有的切点都将

Openset

中的节点遍历完成。相应的对于切点

x_{pt}

,如果连接

x_{pt}

x_{sun}

的总路径长度比连接

x_{pt}

Openset

中任何一个点的总路径长度都要长,那么说明

x_{pt}

应该是其他点的子节点而不是

x_{sun}

的。通过上述过滤机制进一步限制了

Openset

的大小使其存在有限边界,保证了时间复杂度证明的严谨性。

图4   自适应采样补偿机制演示图

      首先需要找到在算法运行过程中重复出现次数最多的函数,即

CollisionFree(\cdot)

函数,选择此函数的原因是它需要逐个像素的检查占用率,并且在每次迭代循环中都会被调用。如图6所示为改进的阳关算法的伪代码,假设闭集

Closeset

中存在

n_c

个点,由第五行可知

CollisionFree(\cdot)

函数在

Illnuminate(\cdot)

函数中被调用

n_c

次;对于第十行的每次

FindTanget\_mod(\cdot)

函数调用,可以参考图3中的伪代码,假设阳光射线的长度存在上界

\bar L

,设

CollisionFree(\cdot)

FindTanget\_mod(\cdot)

函数中的总调用次数为

n_t

,在第五行中的调用次数为

n_{t1}

次,在第十六行的调用次数为

n_{t2}

次,存在关系

n_t=n_{t1}+n_{t2}

,由

FindTanget\_mod(\cdot)

函数的伪代码可知

n_{t1}\le\left ( ceil\left ( \frac{360^\circ}{\theta_{step}} \right )+1\right )*\left ( ceil\left ( \frac{\bar L}{\Delta_{step}} \right )+1 \right )

其中

ceil\left ( \cdot \right )

为向上取整函数。由第十行可知,while循环将会执行

ceil\left ( \frac{360^\circ}{\theta_{step}} \right )

次。由

m

的定义式和阳光射线长度的上界

\bar L

可知,

m

的上界可以定义为

\bar m=round\left ( \frac{\bar L*\pi*\theta_{step}}{180*arc} \right )

由此可以得到

n_{t2}

的边界为

n_{t2}\le\bar m*ceil\left ( \frac{360^\circ}{\theta_{step}} \right )*\left ( ceil\left ( \frac{\bar L}{\theta_{step}} \right )+1 \right )

由上述不等式可知

n_{t1}

n_{t2}

均存在有限上界,那么一定存在关系

n_{t}\le\bar n_t

,并且

\bar n_t

是一个正常数。由此可知在图6第十行处

FindTanget\_mod(\cdot)

函数最多执行

n_c*n_t

次。又由于数据集

Openset

存在有限边界

\bar n_0

,切点集合

X_{candidates}

存在有限边界

\bar n_{X}

,在第十四行

CollisionFree(\cdot)

最多执行

n_c*\bar n_X*\bar n_o

次,在第二十三行最多执行

n_c*\bar n_X

次。设

CollisionFree(\cdot)

函数的最大执行次数为

n_{all}

,那么存在关系

n_{all}\le n_c+n_c*\bar n_t+n_c*\bar n_X*\bar n_o+n_c*\bar n_X

由上式可以得出关系

n_{all}\in O\left ( n \right )

,所以改进后的算法的计算复杂度为

O\left ( n \right )

图5    

Openset

数据集筛选演示图

图6    改进后的阳光算法伪代码图

Read more

二叉搜索树深度解析:从原理实现到算法应用----《Hello C++ Wrold!》(18)--(C/C++)

二叉搜索树深度解析:从原理实现到算法应用----《Hello C++ Wrold!》(18)--(C/C++)

文章目录 * 前言 * 二叉搜索树(二叉排序树或二叉查找树) * 二叉搜索树的模拟实现 * 二叉搜索树和有序数组二分查找的比较 * 两个搜索模型 * 作业部分 前言 二叉搜索树(Binary Search Tree,简称 BST)作为一种重要的树形数据结构,在计算机科学领域有着广泛的应用。它凭借其基于键值的有序性,能够高效地支持数据的插入、删除和查找等操作,是许多复杂算法和系统的基础组件。 本文将围绕二叉搜索树展开全面而深入的探讨。首先,我们将从其核心定义和关键性质出发,帮助读者建立对二叉搜索树的基本认知,包括其通过中序遍历可得到升序序列这一重要特性。随后,详细剖析二叉搜索树的各项基本操作,如插入、查找、删除等,并通过 C++ 代码实现进行具体演示,同时对比递归与非递归实现方式的异同。 此外,我们还将对二叉搜索树与有序数组的二分查找进行对比分析,明确各自的优势与局限。最后,结合一系列经典的算法题目,如二叉搜索树与双向链表的转换、根据遍历序列构造二叉树、二叉树的非递归遍历等,展示二叉搜索树在实际问题中的应用,帮助读者巩固所学知识,提升解决复杂问题的

By Ne0inhk
【算法】【优选算法】多源BFS

【算法】【优选算法】多源BFS

目录 * 一、多源BFS * 二、542.01 矩阵 * 三、1020.⻜地的数量 * 四、1765. 地图中的最⾼点 * 五、1162. 地图分析 一、多源BFS 单源最短路:只有一个起点到终点的最短路问题。 多源最短路问题:有多个起点到终点的最短路问题。 多源BFS:用BFS来解决边权相同的多源最短路问题。 解法: 1. 暴力解题,把多源最短路问题,转化为若干个单源最短路问题。 2. 把所有起点当成一个起点,问题就变成了单源最短路问题。 二、542.01 矩阵 题目链接:542.01 矩阵 题目描述: 题目解析: * 给一个只有0 1 的二维数组,计算其中每一个元素到0的最短距离,自己是0距离就是0,将距离存入一个相同规模二维数组的下标中。 法一:

By Ne0inhk
ARM Linux 驱动开发篇---新版led驱动实验原理(2)--基于 mdev 机制实现设备节点自动创建及--利用私有数据结构体管理设备属性-- Ubuntu20.04

ARM Linux 驱动开发篇---新版led驱动实验原理(2)--基于 mdev 机制实现设备节点自动创建及--利用私有数据结构体管理设备属性-- Ubuntu20.04

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门:linux专栏 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言 一、自动创建设备节点 1.1、mdev 机制 1.2、创建和删除类 1.3、创建设备 1.4、示例 1.5、总结流程图 二、设置文件私有数据 2.1具体原理代码 2.2总体流程框图 总结 前言 上一期介绍了一些新的分配和释放设备号,字符设备注册方法,接下来本期博客将介绍一下自动创建设备节点,设置文件私有数据的方法。 一、

By Ne0inhk