阳光算法(改进版):面向密集小障碍物复杂环境的路径规划方法与严谨的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

【数据结构-初阶】二叉树---链式存储

【数据结构-初阶】二叉树---链式存储

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章中,我们对二叉树的顺序存储结构进行了详细的学习,知道了二叉树的顺序存储结构方式是---也就是以堆的方式进行存储,那么我们想着,既然有顺序存储结构,那有没有链式的存储结构呢?答案是,有的兄弟,有的,那么这篇文章我们就来讲讲,二叉树的链式存储结构 目录 一、二叉树的链式结构 二、二叉树的创建 2.1、创建二叉树节点 2.2、二叉树节点的链接 三、链式二叉树的基本操作 3.1、前序遍历 3.2、中序遍历 3.3、后序遍历 3.4、计算二叉树的总结点个数 3.

By Ne0inhk
【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字

【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字

【C++】优选算法必修篇之双指针实战:有效三角形个数 & 和为s的两个数字 * 双指针应用场景 * 目录 * 1. 有效三角形个数 * 1.1 题目链接 * 1.2 题目描述 * 1.3 题目示例 * 1.4 算法思路 * 1.5 核心代码 * 1.6 示例测试(总代码) * 2. 和为s的两个数字 * 2.1 题目链接 * 2.2 题目描述 * 2.3 题目示例 * 2.4 算法思路 * 2.5 核心代码 * 2.6 示例测试(总代码) * 总结

By Ne0inhk
目标检测算法——YOLOV11——算法详解

目标检测算法——YOLOV11——算法详解

关键词:YOLO V11、目标检测、算法、解读、详解、教程、结构图、分析 一、主要贡献     其实到了YOLOV5 基本创新点就不太多了,主要就是大家互相排列组合复用不同的网络模块、损失函数和样本匹配策略,需要注意YOLO V5、V8 V11 都是1个公司的,其余的个人建议看看V6美团的,剩下的了解就好。     V11支持多种视觉任务:物体检测、实例分割、图像分类、姿态估计和定向物体检测(OBB)。     Yolo v11 基本和YOLOV8同源,甚至git目前都是1个,部分代码注释还是YOLOV8的,所以建议先看我写的YOLOV8相关博客,对比YOLOV8主要涉及到:     *backbone 中的使用C2f模块 变为 c3k2 模块。     *backbone 中的最后一层(sppf层)后增加了C2PSA模块。     *head 解耦头中的分类检测头两个Conv 变为 DWConv。     整体技术而言:

By Ne0inhk

按需购买Token:针对高频算法推理用户的灵活计费模式

按需购买Token:针对高频算法推理用户的灵活计费模式 在算法竞赛、科研验证和工程开发的日常中,一个现实问题正变得越来越突出:如何在保证模型推理质量的同时,有效控制使用成本?许多开发者发现,每当他们需要反复调试一段代码逻辑、批量测试不同输入条件下的解题路径,或是进行多轮数学证明推演时,依赖通用大模型API所带来的费用迅速累积——一次看似简单的调用可能不贵,但成百上千次的迭代下来,账单却令人望而却步。 正是在这种背景下,一种新的技术范式正在兴起:小参数、高密度、垂直优化的专用模型 + 本地部署 + 按Token计量计费。VibeThinker-1.5B-APP 正是这一趋势的典型代表。它不是一个泛化能力强大的“全能助手”,而是一位专注于数学推理与算法编程任务的“专项选手”。仅15亿参数的体量,却能在AIME、HMMT等高难度数学竞赛题上超越数百亿参数的大模型;支持Docker镜像一键部署,可在消费级GPU上稳定运行;更重要的是,它的使用方式打破了传统云服务“按请求收费”的固定模式,引入了更精细、更公平的“按生成Token数量计费”机制。 这不仅仅是一次性能与成本的再平衡,更是对AI

By Ne0inhk