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

打造你的家庭 AI 助手(三):QQ 机器人接入你的 OpenClaw

打造你的家庭 AI 助手(三):QQ 机器人接入你的 OpenClaw

不得不承认腾讯进步的速度太快了,几条命令就可以接入Openclaw,也不用设置IP白名单了,在 QQ开放平台还增加了专门的Openclaw入口: 没啥好说的,很简单,安装完Openclaw之后,执行如下命令(命令也是生成好的): openclaw plugins install @tencent-connect/openclaw-qqbot@latest openclaw channels add--channel qqbot --token"" openclaw gateway restart 以下内容已经过时了,留作纪念 以下内容已经过时了,留作纪念 以下内容已经过时了,留作纪念 ⚠️ 重要提示:如果是家用宽带,没有申请固定 IP 地址的话,大可以放弃这种方式。由于 QQ 开发平台的白名单限制,机器人会非常不稳定,频繁掉线。建议使用云服务器或有固定 IP 的环境部署。 前言 在完成 OpenClaw 安装后,

By Ne0inhk
OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,

By Ne0inhk
组建龙虾团队——OpenClaw多机器人构建

组建龙虾团队——OpenClaw多机器人构建

成功搭建了OpenClaw,也成功建立的自己的每日服务,这时候发现,似乎不太敢在当前的机器人中让他做别的事情,生怕会话太多会让他出现遗忘。(尽管我们配置了QMD记忆增强,但毋庸置疑任何技术都是有上限的)。 换做同样的情况,比如在DeepSeek或者豆包之类的对话窗口,我们会习惯性地新建一个对话。那么我们是否可以新建一个机器人,或者多个机器人,让他们各司其职,各尽所能,形成一个相互配合的团队呢~开干吧,没什么不可能的!! 🦞新建一个机器人 来到飞书开发者后台,新创建一个应用,在这里我们以短视频剪辑脚本应用为例。 创建之后,由于我们的openclaw绑定的是之前的飞书渠道,并没有链接到这个应用的APP ID,所以暂时不做其他操作,只需要记录一下他的APP ID和APP Secret。 🦞配置OpenClaw 如果还是按照claw的命令行安装,每一步都有些让人担心害怕,毕竟我们先前已经配置过一次了,接下来的操作,需要小心是否会把以前的配置给覆盖掉。 为了避免这样的不确定性,我们直接去操作他的配置文件 在WSL2终端中进入openclaw目录 cd .openclaw

By Ne0inhk

Z-Image-Turbo_UI界面+Gradio=超友好AI绘画交互体验

Z-Image-Turbo_UI界面+Gradio=超友好AI绘画交互体验 为什么说这是目前最顺手的本地AI绘图入口? 你有没有过这样的经历:下载好模型,配好环境,终于跑通命令行生成——结果发现每次改个提示词都要改代码、重运行?或者好不容易调出一张满意的图,却找不到保存在哪、没法批量查看、更别提分享给朋友看一眼? Z-Image-Turbo_UI界面彻底绕开了这些麻烦。它不依赖复杂配置,不强制你写Python,甚至不需要打开终端——只要一行命令启动,浏览器点开就能用。这不是“又一个WebUI”,而是把Gradio的简洁性、Z-Image-Turbo的极速推理和创作者的真实动线揉在一起的结果:输入文字→滑动调节→实时预览→一键下载。整个过程像用手机修图一样自然。 本文不讲部署原理,不列CUDA版本号,也不堆参数表格。我们只聚焦一件事:怎么让你在5分钟内,真正用起来、画出来、存下来、再画一张更好的。 1. 启动即用:三步完成从零到第一张图 1.1 一行命令,服务就绪 镜像已预装全部依赖,无需克隆、无需conda、

By Ne0inhk