目录

MATLAB实现基于ACO-RNN-CNN 蚁群算法(ACO)结合循环神经网络(RNN)与卷积神经网络(CNN)进行无人机三维路径规划的详细项目实例... 2

项目背景介绍... 2

项目目标与意义... 3

提升无人机在复杂三维环境中的路径规划性能... 3

构建可复现、可扩展的MATLAB仿真实例工程... 4

探索智能优化与深度学习在路径规划中的协同机制... 4

为低空智能交通和应急应用提供技术参考... 4

项目挑战及解决方案... 5

三维复杂环境建模与栅格化精度平衡... 5

ACO与RNN-CNN耦合策略设计与参数调优... 5

MATLAB深度学习实现与性能优化... 5

项目模型架构... 6

三维栅格环境建模与状态空间表示... 6

蚁群算法全局搜索与路径构建机制... 6

CNN环境特征提取与风险评估模块... 7

RNN路径序列建模与策略修正模块... 7

ACO-RNN-CNN一体化协同与MATLAB实现流程... 7

项目模型描述及代码示例... 8

三维环境栅格构建与障碍物生成示例... 8

CNN局部环境特征提取网络构建示例... 10

RNN路径序列建模网络构建示例... 10

ACO主循环与CNN-RNN协同启发式示例... 11

三维路径可视化与结果展示示例... 15

MATLAB实现基于ACO-RNN-CNN 蚁群算法(ACO)结合循环神经网络(RNN)与卷积神经网络(CNN)进行无人机三维路径规划的详细项目实例

请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 

 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)

无人机三维路径规划已经成为智能装备、军事 reconnaissance、应急救援与城市低空交通中极其关键的基础技术。飞行平台在复杂三维环境中执行任务时,需要在有限能量、有限时间以及多种安全约束之下,从起点飞往终点,并同时规避静态与动态障碍物、保持通信链路稳定、尽量减少能耗与飞行风险。在过去较长一段时间,三维路径规划更多依赖传统的图搜索算法与启发式规划方法,例如A、D搜索、势场法、RRT及其改进版本。这些方法在结构相对简单、障碍物较少、代价函数较单一的场景中能够获得较为可靠的路径,但在场景维度逐渐增大、约束条件互相耦合、环境具有高度不确定性的背景下,这类算法在计算效率、全局最优性以及鲁棒性等方面逐渐暴露出明显不足。

智能算法的引入为三维路径规划打开了新的思路。其中蚁群算法通过模拟真实蚂蚁在寻找食物过程中借助信息素进行群体协作的过程,形成了分布式、自适应、鲁棒性强的启发式搜索框架。蚁群算法天然适合求解组合优化问题,在路径规划中可以通过构造状态转移概率、信息素更新规则以及启发式函数,将无人机从起点到终点的飞行任务映射为离散空间上的路径搜索问题。不同蚂蚁在搜索空间中并行采样,利用信息素逐步强化优秀路径,使得整体搜索在较大范围内兼顾探索与利用,从而在较高维空间中仍具有较强的全局搜索能力。但单纯依赖经典蚁群算法,仍然存在收敛速度缓慢、容易陷入局部最优、对复杂动态环境建模能力有限等问题,尤其是在三维场景中需要同时处理高度、高程障碍、飞行约束等多种因素时,这些弱点更加突出。

深度学习的发展,特别是循环神经网络和卷积神经网络,为路径规划提供了从数据中自动学习环境特征和策略的能力。卷积神经网络擅长处理具有空间局部关联性的栅格地图和三维环境数据,能够自动提取障碍物分布、地形起伏、禁飞区形状等高维特征。循环神经网络在处理序列数据上具有独特优势,可以建模路径上的动态演化过程、历史状态对当前决策的影响,适合刻画无人机飞行轨迹的时间依赖性和累积约束。通过对环境和轨迹数据的联合建模,可以构造出从三维地图到路径策略的复杂非线性映射。

在这样的背景下,将蚁群算法与RNN、CNN进行融合的混合智能框架应运而生。一方面,蚁群算法负责在离散化三维空间中进行路径搜索与全局优化,通过信息素机制实现多解候选的并行探索,使得算法在广阔搜索空间中仍保留较强的全局搜索能力。另一方面,卷积神经网络对三维环境栅格进行多尺度卷积与特征提取,将地形、障碍物、风险区域等信息映射为高维环境特征向量;循环神经网络对路径序列进行建模,学习在不同环境特征下路径演化的模式,从而在搜索过程中动态给蚂蚁提供更加合理的启发式信息或路径修正方案。通过这种协同机制,蚁群算法不再单纯依赖人工设计启发式函数,而是由深度网络根据大量历史样本学习更具有适应性的启发策略,使搜索过程更具方向性、更易收敛至高质量解。

在工程应用中,三维路径规划不仅仅关注路径长度最短,还需要综合考虑飞行安全、控制平滑性、能耗、时间窗约束以及通信链路保持的需求。混合ACO-RNN-CNN框架可以在代价函数设计中引入多目标权重,通过深度网络依赖环境特征对权重进行自适应调整。例如在城市峡谷区域增强障碍物安全间隔权重,在开放空域提高能耗优化权重,在通信覆盖较差地区增加高度约束的比重。这一思路能够将传统基于规则的规划方式转变为数据驱动与经验融合的智能规划,使得无人机系统在复杂环境中实现更加灵活的决策行为。

通过MATLAB R2025b实现这一混合算法,可以充分利用该平台在矩阵运算、数据可视化、深度学习工具箱与优化工具箱方面的成熟能力,并能够较为便捷地进行算法原型搭建、参数调优与三维仿真展示。项目将构建一个完整的三维栅格地图生成模块、蚁群路径搜索模块、基于CNN的环境特征提取模块、基于RNN的路径序列建模与修正模块,以及路径可视化与性能评估模块,使得研究者能够清晰观察不同策略组合对路径质量、收敛速度与鲁棒性的影响。通过大量仿真实验与参数对比,期望形成一套具有可复现性与实用价值的混合智能路径规划方案,为无人机路径规划从理论研究走向工程应用提供完整示例与技术参考。

项目目标与意义

提升无人机在复杂三维环境中的路径规划性能

本项目的首要目标是利用ACO-RNN-CNN混合算法框架,在复杂三维环境中显著提升无人机路径规划的整体性能。传统三维路径规划通常在规则地形、有限障碍或静态环境下进行评估,而现实应用常常需要面对动态障碍、非规则障碍簇、多层立体禁飞区以及高度变化突兀的地形。项目通过构建多类型三维仿真场景,结合蚁群算法的全局搜索能力和RNN-CNN的深度特征学习能力,使路径规划不仅能够找到从起点到终点的可行路线,更能在路径长度、障碍规避、航迹平滑度、能耗与时间等多个维度上接近或超越当前主流方法。通过CNN自动提取环境深层特征,通过RNN学习历史轨迹对当前决策的影响,使得整套系统在面对复杂环境模式时仍保持较快收敛和较高可行率,为多场景、多约束的任务规划提供统一算法框架。

构建可复现、可扩展的MATLAB仿真实例工程

另一个重要目标在于构建一个可完整运行、结构清晰、便于扩展的MATLAB工程实例,使研究者可以在同一平台内实现环境建模、算法训练、路径搜索与结果可视化。该工程不仅提供ACO-RNN-CNN核心流程,还在程序结构、模块划分、数据接口等方面形成规范,便于后续集成轨迹跟踪控制、状态估计与多机协同等模块。通过在MATLAB R2025b环境中实现全部关键功能,包括三维栅格地图构建、深度网络搭建与训练、蚁群搜索与并行加速、三维航迹绘制与统计分析,使工程具备较高的教学与研究价值。研究者可以在此基础上替换CNN结构、更换RNN类型或引入注意力机制模块,而无需从零搭建底层环境,从而有效降低复杂智能规划算法的入门与试验成本,推动相关技术在学术和工程实践中的快速迭代与真实验证。

探索智能优化与深度学习在路径规划中的协同机制

本项目不仅追求算法性能指标的提升,更关注智能优化方法与深度学习模型之间的协同机制和耦合方式。蚁群算法在全局搜索方面具有独特优势,但其启发式信息往往依赖经验设计,难以充分体现复杂环境中的隐藏结构;深度学习模型则擅长从数据中挖掘隐含规律,却在全局搜索与约束精细处理方面相对不足。通过构造ACO-RNN-CNN的联合框架,项目尝试将CNN提取的环境特征映射为蚁群的启发式因子或信息素初始化策略,将RNN对轨迹历史的建模结果用于修正蚁群搜索中的路径选择概率或局部重规划规则。这种从特征学习到搜索引导的闭环设计,有助于总结一种适用于路径规划问题的通用协同模式,为其他智能优化与深度学习融合问题提供经验与启发,包括车路协同路径规划、机器人集群协同调度等,从方法论层面提高智能决策系统的构建能力。

为低空智能交通和应急应用提供技术参考

在低空智能交通与应急救援场景中,无人机集群需要在密集建筑群、多源干扰及严苛安全约束下执行任务。本项目通过ACO-RNN-CNN路径规划框架,在三维城市环境、多层空域划分与临时禁飞区等场景中开展仿真分析,可以为未来低空通道规划、无人机航路网络优化、应急物资投送路径快速生成等应用提供方法参考。通过精细设计代价函数,将飞行安全、噪声影响、隐私保护等实际约束纳入规划过程,并利用深度网络从历史任务数据中学习经验权重设置方式,使得路径规划策略更接近工程实践需求。项目在MATLAB环境中形成的仿真平台也能够作为教学与培训工具,帮助相关领域技术人员理解复杂路径规划策略的内在逻辑,为低空交通管理系统与无人机调度平台的设计提供直观、可实验的技术支撑。

项目挑战及解决方案

三维复杂环境建模与栅格化精度平衡

项目在三维环境建模上面临的首个挑战是如何在复杂度与计算效率之间找到合理平衡。三维空间的离散化通常采用体素或栅格形式,分辨率越高,障碍物描述越精细,但同时会导致搜索空间维度急剧膨胀,给蚁群搜索和深度网络训练带来巨大计算压力。若分辨率过低,障碍物边界会变得粗糙,导致路径规划过程中出现“擦边飞行”甚至穿越障碍物的风险。为解决这一矛盾,项目在环境建模阶段采用多分辨率栅格策略,将全局空间以中等分辨率表示,而在障碍物密集或关键区域采用局部高分辨率嵌套栅格,并通过插值与融合方式构成统一坐标系下的三维地图结构。同时在MATLAB R2025b中通过矩阵运算与稀疏存储技巧,减少无障碍空域的数据占用,提升环境更新与存取效率。CNN输入时采用固定立方体区域裁剪与归一化处理,使网络既能捕获局部精细特征,又不会因为分辨率过高导致计算不可承受。通过在仿真阶段逐步调整栅格尺寸并对路径规划结果进行统计分析,最终形成一套在精度与效率之间具有良好折中的三维栅格化方案,为后续算法运行提供稳定的环境基础。

ACO与RNN-CNN耦合策略设计与参数调优

第二个核心挑战在于蚁群算法与RNN-CNN之间的协同机制设计。若二者耦合方式不合理,将可能出现深度网络输出与蚁群搜索方向不一致、信息素更新受误导、甚至整体算法震荡无法收敛等问题。项目通过多轮仿真逐步明确耦合策略:一方面利用CNN提取的环境特征生成空间风险评估图,将其作用于蚁群状态转移概率中的启发式函数部分,对高风险区域的转移概率进行抑制,对安全且代价较低区域给予更高倾向度;另一方面采用RNN对历史高质量轨迹序列进行学习,输出某一局部状态下较优动作或路径段,并将这些结果编码为先验信息素分布或本地路径重规划候选。为防止深度网络输出过于“强势”而压制蚁群算法的全局探索,耦合过程中引入动态权重控制:在算法迭代早期提升蚁群信息素与启发式函数的作用权重,让搜索过程保留足够随机性;在迭代中后期逐步提升RNN与CNN引导的比重,保证收敛速度与路径质量。此外,参数调优被视为独立模块,通过设置多组候选参数组合(包括信息素蒸发率、蚂蚁数量、RNN隐藏单元规模、CNN卷积核大小等),利用MATLAB脚本批量运行仿真,并记录收敛曲线与路径统计特征,最终选出在多场景中表现稳定的参数配置,以克服单场景过拟合问题。

MATLAB深度学习实现与性能优化

第三个挑战来自在MATLAB R2025b环境下实现深度网络与蚁群算法的集成,并兼顾运行性能。对比专门的深度学习框架,MATLAB在网络结构灵活性和算子生态上虽然已经较为完善,但在自定义复杂层与大规模训练时仍对代码组织和资源管理提出较高要求。项目在网络实现上避免使用R2025b不再推荐或已变更的接口,采用dlnetwork与深度学习工具箱中的基础层构建CNN与RNN模型,并通过自定义训练循环实现对前向传播、损失计算与梯度更新的控制。由于R2025b中针对Learnables的更新需要通过标准优化器流程而非dlupdate等结构体操作,项目在实现时将网络参数更新与网络结构严格分离,确保训练过程稳定。此外,在蚁群算法部分,合理利用MATLAB向量化运算与并行工具(如parfor)对路径构建和信息素更新进行加速,减少不必要的for循环与重复计算。在三维可视化过程中,关注R2025b中图形相关属性的变化,例如使用colormap(fig, turbo)方式设置色图,避免已废弃属性带来的异常。通过以上策略,项目在保证代码清晰度与可读性的前提下,尽量发挥MATLAB在原型验证与仿真展示方面的优势,使ACO-RNN-CNN路径规划在多个复杂场景中能够在可接受时间内完成规划与训练任务。

项目模型架构

三维栅格环境建模与状态空间表示

模型架构中的底层基础部分是三维环境建模与状态空间表示。整个三维任务空间被离散为规则的三维栅格,每个栅格单元对应无人机在某一位置上的潜在飞行状态,包含坐标三元组和障碍属性。通过设定空间范围与栅格步长,将物理坐标映射至栅格索引坐标系,形成适用于蚁群搜索和CNN输入的统一表示。障碍物被编码为二进制或多类别标签,例如可飞行区域标记为0,静态障碍物标记为1,缓冲区或高风险区域可设置为高代价标签。起点与终点分别占据特定栅格位置,并在状态空间中作为搜索起始节点与目标节点。为了进一步刻画空间属性,栅格单元可附加高度限制、风场影响或通信覆盖等信息,为后续代价计算提供更多特征。在实现层面,使用三维矩阵或稀疏数组存储栅格信息,并在构造CNN输入时选择以起点或当前飞行器位置为中心的子立方体块作为局部环境观测。通过这种统一栅格化结构,蚁群算法能够在状态空间中进行离散路径搜索,CNN则从中提取邻域空间模式,实现算法架构在环境感知层面的有机融合。

蚁群算法全局搜索与路径构建机制

在状态空间基础上,蚁群算法承担全局搜索与路径构建的核心任务。每只“蚂蚁”代表一个从起点出发沿栅格逐步前进的路径构建体,通过依次选择相邻可达栅格形成完整轨迹。状态转移概率由信息素强度和启发式信息共同决定,启发式信息通常与目标距离、局部地形代价相关。路径构建完成后,根据路径总成本更新信息素:较短且安全性高的路径获得较强的信息素增量,劣质路径的信息素则逐渐被蒸发削弱。通过多次迭代,信息素逐渐在高质量路径上聚集,指导后续蚂蚁更倾向于选择类似方案,从而达到全局优化的目的。为适应三维环境特性,状态转移需要考虑多维邻域,如26邻接或更广领域,并在代价函数中引入高度变化惩罚与障碍缓冲区惩罚。信息素更新采用全局最优路径强化与局部最优路径补充策略,防止过早收敛至局部极值。此外,通过动态调整信息素蒸发率与启发式因子权重,使搜索在前期更具探索性,后期更具开发性,形成从粗略搜索到精细优化的渐进过程。蚁群算法为整套架构提供了强大的全局寻优能力,为RNN-CNN提供轨迹样本与环境-路径对应数据。

CNN环境特征提取与风险评估模块

CNN模块在整个架构中负责从三维栅格环境中自动提取高层次空间特征与风险评估结果。对于当前规划任务,将以无人机当前状态或起点为中心的三维区域截取为输入张量,该张量包含障碍物标记、高风险区域标记以及可能的地形高度、风场强度等多通道数据。在网络结构设计上,通过多层三维卷积、批归一化与非线性激活,逐步提取局部与全局空间特征;池化层对空间维度进行降采样,得到更加紧凑的特征表示。最终通过若干全连接层,输出对各栅格的风险评分或代价修正因子,例如生成一张与局部栅格对应的风险热图,标记每个可行栅格的相对危险程度或通过代价。蚁群算法可以使用该风险热图对启发式函数进行调节,使转移概率对高风险区域进行抑制,对安全区域给予额外偏好。相比人工设计启发式代价,CNN能够从大量环境-路径数据中自动学习哪些环境结构更容易导致碰撞或高能耗,从而提供更加精细与可适应的风险评估。网络训练阶段使用历史规划结果或专家标注作为监督信号,最小化预测风险与真实风险之间的差异,使得CNN在多种环境下具有较强泛化能力。

RNN路径序列建模与策略修正模块

RNN模块主要承担对路径序列的建模与策略修正任务。在路径规划过程中,每条轨迹可以视作在时间维度上的状态序列,包含连续的三维位置和环境特征。RNN通过循环结构记忆历史状态,对当前状态的决策产生影响,特别适合处理路径平滑性、安全裕度与多步约束的累积效应。在训练阶段,将蚁群产生的高质量路径或专家规划路径转换为序列数据输入RNN,并使用LSTM或GRU单元提升长期记忆能力。RNN输出可以是下一个最优动作方向的概率分布,也可以是对整个后续路径段的修正建议。在集成到蚁群框架中时,一种方式是将RNN输出的动作偏好映射到蚂蚁的状态转移权重中,与信息素和启发式函数共同决定下一步节点选择;另一种方式是,当蚂蚁搜索到某个局部时,调用RNN生成一段可能更平滑或更安全的局部路径,用以替换原有搜索结果。通过这种机制,RNN利用从数据中学习到的“轨迹经验”对搜索过程进行引导与修正,使得最终路径更加符合全局优化目标与飞行控制需求。与CNN的空间特征提取不同,RNN更强调路径的时间序列属性与历史依赖,两者在架构中形成互补,共同提升路径规划质量与稳定性。

ACO-RNN-CNN一体化协同与MATLAB实现流程

在整套模型架构中,ACO、RNN与CNN并非各自独立运行,而是在统一流程下相互配合、形成闭环。大致流程为:首先通过三维栅格模块构建环境地图与状态空间;然后CNN基于当前局部环境生成风险图或代价修正因子,提供给蚁群作为动态启发式信息;蚂蚁在全局搜索中根据信息素、启发式函数与CNN输出的风险评估共同决定状态转移,以多轮迭代构建大量路径样本;在搜索过程中,将评价为高质量的路径序列存储下来,用于训练RNN,使其学习从当前状态到后续路径的映射规律;在后续迭代中,当蚂蚁到达某一局部关键区域,可调用RNN对下一步动作进行建议或对局部路径进行修正;信息素根据最终路径质量进行更新,反过来影响下一个循环中的搜索方向。通过这种协同,每个模块都在不断利用其他模块提供的数据或结果进行自适应调整,使得整套系统在多次任务执行中不断积累“经验”。在MATLAB R2025b中的实现依托脚本和函数组织,将环境建模、CNN构建与训练、RNN训练、蚁群搜索与可视化等划分为若干模块,通过统一的参数结构与数据接口连接各模块。深度网络部分使用dlnetwork与自定义训练循环实现参数更新,蚁群部分使用矩阵运算与随机采样实现多蚂蚁轨迹构建,三维可视化通过plot3与patch等函数展示路径与障碍物,使整个ACO-RNN-CNN架构在MATLAB环境中具备完整可运行性与良好可扩展性。

项目模型描述及代码示例

三维环境栅格构建与障碍物生成示例
envSize = [60, 60, 20]; % 定义三维栅格地图尺寸,分别对应x轴、y轴和z轴方向的栅格数,数值可根据任务空间范围调整
gridResolution = 1.0; % 定义栅格空间分辨率,单位可视为米,用于将栅格索引映射到实际物理距离
envGrid = zeros(envSize); % 创建三维矩阵表示环境栅格,初始值为0表示全部为可飞行区域
numObstacles = 80; % 设置障碍物数量,数值越大环境越复杂,路径规划难度越高
maxObstacleSize = [8, 8, 6]; % 定义障碍物在三维方向上的最大尺寸,控制障碍块体大小范围
rng(1); % 固定随机数种子,保证障碍物生成过程具有可复现性,便于调试与比较实验结果
for k = 1:numObstacles % 循环生成多块障碍物,每次迭代构造一个随机障碍区域
ox = randi([1, envSize(1) - maxObstacleSize(1)]); % 随机生成障碍物在x方向的起始栅格索引,避免越界
oy = randi([1, envSize(2) - maxObstacleSize(2)]); % 随机生成障碍物在y方向的起始栅格索引,确保整块障碍在地图内
oz = randi([1, envSize(3) - maxObstacleSize(3)]); % 随机生成障碍物在z方向的起始栅格索引,控制障碍高度位置
sx = randi([3, maxObstacleSize(1)]); % 随机选取障碍物在x方向的实际尺寸,使障碍块大小存在多样性
sy = randi([3, maxObstacleSize(2)]); % 随机选取障碍物在y方向的实际尺寸,形成不规则障碍分布
sz = randi([2, maxObstacleSize(3)]); % 随机选取障碍物在z方向的实际尺寸,模拟不同高度范围的立体障碍
envGrid(ox:ox+sx, oy:oy+sy, oz:oz+sz) = 1; % 将对应栅格区域标记为1,表示该区域为障碍物,不可穿越
end % 结束障碍物生成循环
envGrid(startPos(1), startPos(2), startPos(3)) = 0; % 强制将起点栅格设置为可飞行区域,避免被随机障碍覆盖
envGrid(goalPos(1), goalPos(2), goalPos(3)) = 0; % 强制将终点栅格设置为可飞行区域,确保存在至少一条潜在可行路径
figure; % 新建图窗用于显示三维环境和障碍分布
axis equal; % 设置各坐标轴比例相同,使三维显示不产生拉伸变形
hold on; % 保持当前图像内容,方便叠加绘制障碍物和路径
[xIdx, yIdx, zIdx] = ind2sub(size(envGrid), find(envGrid == 1)); % 找出所有障碍栅格的索引位置并转换为x、y、z坐标索引
scatter3(xIdx, yIdx, zIdx, 10, 'filled', 'MarkerFaceColor', [0.3 0.3 0.3]); % 绘制障碍点云,使用小圆点显示障碍物在三维空间中的分布
scatter3(startPos(1), startPos(2), startPos(3), 60, 'g', 'filled'); % 使用绿色大点标记起点位置,便于视觉辨识
scatter3(goalPos(1), goalPos(2), goalPos(3), 60, 'r', 'filled'); % 使用红色大点标记终点位置,突出任务目标位置
xlabel('X'); % 设置x轴标签为X,用于表示水平方向栅格索引
ylabel('Y'); % 设置y轴标签为Y,用于表示另一个水平向栅格索引
zlabel('Z'); % 设置z轴标签为Z,用于表示高度方向栅格索引
title('三维栅格环境与障碍物分布'); % 设置三维图标题,说明当前图像内容为环境与障碍布局
view(45, 30); % 设置三维视角角度,便于观察整体空间分布情况
grid on; % 打开网格线显示,使三维坐标刻度更加清晰可见
numAnts = 40; % 设置蚂蚁数量,蚂蚁越多并行采样越充分,但计算量也随之增加
maxIters = 120; % 设置蚁群算法最大迭代次数,用于控制搜索时间与收敛过程长度
rho = 0.4; % 信息素蒸发系数,数值越大信息素衰减越快,有助于避免过早收敛但可能降低记忆效果
alpha = 1.0; % 信息素重要程度参数,控制蚂蚁在状态转移时对信息素浓度的依赖程度
beta = 2.0; % 启发式信息重要程度参数,控制蚂蚁对局部代价或距离信息的重视程度
Q = 1.0; % 信息素释放强度常数,与路径长度共同决定每条路径对信息素增量的贡献水平
bestPath = []; % 初始化最优路径变量,用于记录迭代过程中找到的全局最优轨迹
bestCost = inf; % 初始化最优路径代价为无穷大,用于在更新时比较与当前路径代价
CNN局部环境特征提取网络构建示例
inputPatchSize = [15, 15, 9]; % 设置CNN输入的局部三维补丁尺寸,表示在x、y、z三个方向截取的栅格范围
numChannels = 1; % 指定输入补丁的通道数,此处仅使用障碍物占用信息作为单通道输入
imageInputLayerSize = [inputPatchSize, numChannels]; % 构造图像输入层的尺寸参数,将三维体素尺寸与通道数组合为层输入维度
inputLayer = image3dInputLayer(imageInputLayerSize, Normalization="none"); % 创建三维图像输入层,关闭默认归一化,保留原始栅格值以便后续自定义处理
flattenLayer = flattenLayer; % 添加展平层,将三维特征图展平为一维向量,为后续全连接层输入准备
fcLayer1 = fullyConnectedLayer(64); % 创建全连接层,将展平后的特征映射到64维特征空间,作为高层语义表示
reluLayer3 = reluLayer; % 在全连接后添加ReLU激活,增强非线性拟合能力
fcLayer2 = fullyConnectedLayer(prod(inputPatchSize)); % 创建输出全连接层,将64维特征映射回与输入栅格单元数相同的维度,用于生成每个栅格的风险评分
sigLayer = sigmoidLayer; % 使用Sigmoid激活层将输出范围压缩到0到1之间,作为归一化风险概率输出
layersCNN = [inputLayer; convLayer1; reluLayer1; poolLayer1; convLayer2; reluLayer2; poolLayer2; flattenLayer; fcLayer1; reluLayer3; fcLayer2; sigLayer]; % 将所有CNN层按前向传播顺序组成层数组,以构建完整网络结构
lgraphCNN = layerGraph(layersCNN); % 将层数组转换为层图对象,便于后续扩展或可视化结构
netCNN = dlnetwork(lgraphCNN); % 使用dlnetwork封装CNN层图,得到可训练的动态图网络对象,方便自定义训练循环
RNN路径序列建模网络构建示例
rnnInputDim = 6; % 设置RNN输入维度,包括三维位置与三维环境或代价特征,可根据具体设计调整
rnnHiddenUnits = 64; % 设置RNN隐藏单元数量,数值越大模型表达能力越强但计算开销也越高
rnnOutputDim = 3; % 设置RNN输出维度,表示下一步期望位移方向或目标位置的三维向量
layersRNN = [featureInputLayerRNN; lstmLayerRNN; fcLayerRNN; tanhLayerRNN]; % 将RNN相关层组合为层数组,构成完整路径序列建模网络
lgraphRNN = layerGraph(layersRNN); % 将RNN层数组转为层图对象,便于后续网络拓展与管理
netRNN = dlnetwork(lgraphRNN); % 使用dlnetwork将RNN层图封装为可训练网络,支持自定义训练过程与梯度更新
ACO主循环与CNN-RNN协同启发式示例
bestPathHistory = cell(maxIters,1); % 预分配单元数组存储各迭代轮次的最优路径,便于后续分析和可视化
bestCostHistory = zeros(maxIters,1); % 预分配数组记录每一代的最优路径代价,观察算法收敛情况
for iter = 1:maxIters % 外层循环控制蚁群迭代次数,每一轮蚂蚁构造路径并更新信息素
allPaths = cell(numAnts,1); % 为当前迭代中所有蚂蚁预分配路径存储单元格
allCosts = inf(numAnts,1); % 初始化每只蚂蚁对应路径代价为无穷,后续计算真实代价并更新
for ant = 1:numAnts % 内层循环遍历每一只蚂蚁,构造其从起点到终点的路径  
    currentPos = startPos; % 将当前蚂蚁位置初始化为起点位置  
    path = currentPos; % 初始化路径为包含起点单一节点的矩阵  
    visited(currentPos(1), currentPos(2), currentPos(3)) = true; % 将起点标记为已访问,避免后续再次访问该节点  


    maxSteps = prod(envSize); % 设置最大步数上限为栅格总数,防止死循环,确保搜索在有限步骤内完成  
    step = 0; % 初始化步计数器,用于控制终止条件  


        x = currentPos(1); % 提取当前节点x索引,便于后续计算候选邻居坐标  
        y = currentPos(2); % 提取当前节点y索引,用于计算邻居位置  

        candidates = []; % 初始化候选邻居位置数组,将存储所有合法可达的邻居节点  
        tauVals = []; % 初始化候选邻居对应的信息素值向量  

        for m = 1:numMoves % 遍历每一种可能的邻居移动方向  

                continue; % 略过该邻居,不将其加入候选列表  

            if envGrid(nx,ny,nz) == 1 % 若邻居为障碍物栅格,不可穿越  
                continue; % 略过此邻居候选  
            end % 结束障碍检查  

                continue; % 避免回退到已访问节点,减少回环行为  
            end % 结束访问标记检查  

            candidates = [candidates; nx, ny, nz]; % 将合法邻居坐标加入候选集合  
            tauVals = [tauVals; tauGrid(nx,ny,nz)]; % 记录该邻居位置处的信息素值,用于计算转移概率  
            etaVals = [etaVals; heuristicGrid(nx,ny,nz)]; % 记录该邻居的启发式信息值,为转移概率提供引导  
        end % 完成当前节点所有邻居的候选检测  

        if isempty(candidates) % 若没有合法候选邻居,说明陷入死路  
            break; % 终止路径扩展,结束当前蚂蚁路径构造  
        end % 结束无候选状况判断  

        patchHalfSize = floor(inputPatchSize ./ 2); % 计算局部环境补丁半尺寸,用于从全局栅格中截取局部立方体区域  
        xMin = max(1, x - patchHalfSize(1)); % 确定局部补丁在x方向的最小索引,防止越界  
        yMax = min(envSize(2), y + patchHalfSize(2)); % 计算局部补丁在y方向的最大索引  
        zMin = max(1, z - patchHalfSize(3)); % 计算局部补丁在z方向的最小索引  
        zMax = min(envSize(3), z + patchHalfSize(3)); % 计算局部补丁在z方向的最大索引  

        localPatch = envGrid(xMin:xMax, yMin:yMax, zMin:zMax); % 从全局栅格中截取以当前节点为中心的局部环境补丁  
        localPatchPad = zeros(inputPatchSize); % 创建与网络输入大小一致的零矩阵,用于填充局部补丁  
        localPatchPad(1:(xMax-xMin+1), 1:(yMax-yMin+1), 1:(zMax-zMin+1)) = localPatch; % 将真实补丁放置到填充矩阵左上角区域,保持尺寸一致  
        dlYPred = predict(netCNN, dlX); % 使用CNN网络对局部补丁进行前向推理,生成每个栅格的风险预测值  
        riskVec = extractdata(dlYPred); % 将dlarray格式输出转换为普通数值数组,以便进一步处理  

        cnnWeights = ones(size(candidates,1),1); % 初始化与候选邻居数量相同的CNN权重向量,默认值为1表示不调整  
        for c = 1:size(candidates,1) % 遍历每一个候选邻居节点  
            cx = candidates(c,1) - x + patchHalfSize(1) + 1; % 将邻居x坐标映射到局部补丁坐标系中的位置  
            cy = candidates(c,2) - y + patchHalfSize(2) + 1; % 将邻居y坐标映射到局部补丁坐标系相对索引  
            cz = candidates(c,3) - z + patchHalfSize(3) + 1; % 将邻居z坐标映射到局部补丁立方体内部索引  
            cy = max(1, min(inputPatchSize(2), cy)); % 同样对y方向索引进行范围裁剪  
            cz = max(1, min(inputPatchSize(3), cz)); % 对z方向索引进行范围限制  
            riskVal = riskMap(cx, cy, cz); % 读取CNN预测的该邻居位置风险值,值越大表示风险越高  
            cnnWeights(c) = 1.0 - 0.7 * riskVal; % 将风险值映射为候选权重,风险越高权重越低,0.7为调节系数  

        lstmInputStep = [currentPos, mean(etaVals)*ones(1,3)]; % 构造当前时间步的RNN输入特征,包含位置与启发式信息统计特征  
        dlSeq = dlarray(single(lstmInputStep'), "CBT"); % 将特征转换为列通道时间格式dlarray,满足RNN输入接口要求  
        dlRNNOut = predict(netRNN, dlSeq); % 使用RNN对当前状态进行前向推理,预测下一步位移方向向量  
        rnnDir = rnnDir(:,end); % 获取序列最后一个时间步对应的输出方向向量  
            rnnDir = rnnDir / norm(rnnDir); % 对方向向量归一化,使其表示单位方向而非任意长度  
        end % 确保RNN方向向量为单位长度或零向量  

            dirVec = double(candidates(c,:) - currentPos); % 计算从当前节点到候选邻居的位移向量  
            if norm(dirVec) > 0 % 若位移长度非零  
                dirVec = dirVec / norm(dirVec); % 将位移向量归一化为单位方向  
            end % 确保方向比较时不受长度影响  
            alignment = dot(rnnDir', dirVec); % 计算RNN预测方向与候选方向的点积,衡量方向一致性  
        end % 完成所有候选的RNN协同权重计算  

        tauAlpha = tauVals .^ alpha; % 将信息素值按alpha指数放大或压缩,用于状态转移概率计算  
        if sum(weightCombined) == 0 % 若综合权值全部为零,表示当前引导失效  
            probs = ones(size(weightCombined)) / numel(weightCombined); % 将转移概率设为均匀分布,恢复随机搜索特性  
        else % 若综合权值非全零  
            probs = weightCombined / sum(weightCombined); % 将权值归一化为概率分布,用于随机选择下一个节点  
        r = rand; % 生成0到1之间的随机数,用于轮盘赌选择下一节点  
        cumulative = cumsum(probs); % 计算转移概率的累积分布,便于根据随机数定位目标候选  
        selectIndex = find(cumulative >= r, 1, "first"); % 找到累积概率首次超过随机数的位置,作为被选中的邻居索引  

        moveCost = 1.0; % 将每步移动代价初始设置为1,可在后续引入高度变化或风险调整  
        pathCost = pathCost + moveCost; % 累加路径总代价,根据每一步移动成本更新  

        currentPos = nextPos; % 更新当前节点位置为刚选择的邻居节点  
        path = [path; currentPos]; % 将新节点追加到路径序列末尾,构成逐步增长的轨迹  
    end % 结束当前蚂蚁在本轮迭代中的路径构建过程  

    if isequal(currentPos, goalPos) % 若当前蚂蚁最终到达目标节点  
        allCosts(ant) = pathCost; % 记录该路径的累积代价,用于后续比较和信息素更新  
end % 完成所有蚂蚁在本轮迭代中的路径生成  
tauGrid = (1 - rho) * tauGrid; % 对全局信息素进行蒸发操作,将信息素强度按蒸发系数进行衰减  
validIdx = validIdx(isfinite(validCosts)); % 只保留代价有限的索引,即那些成功到达终点的路径  
    bestIdxIter = validIdx(1); % 选择代价最小的路径索引作为本轮最优路径索引  
    bestCostIter = allCosts(bestIdxIter); % 记录本轮最优路径的代价值  
    bestPathIter = allPaths{bestIdxIter}; % 提取本轮最优路径节点序列  

    if bestCostIter < bestCost % 若本轮最优路径优于全局历史最优路径  
        bestCost = bestCostIter; % 更新全局最优路径代价为当前值  
        bestPath = bestPathIter; % 更新全局最优路径节点序列  
    end % 完成全局最优路径更新的条件判断  
        pathK = allPaths{validIdx(k)}; % 提取当前可行路径节点序列  
        costK = allCosts(validIdx(k)); % 提取当前路径对应代价  
        deltaTau = Q / costK; % 根据信息素公式计算该路径对每个节点的信息素增量,路径越优增量越大  
        for p = 1:size(pathK,1) % 遍历路径中的每一个节点位置  
            yy = pathK(p,2); % 读取节点的y坐标索引  
            zz = pathK(p,3); % 读取节点的z坐标索引  
            tauGrid(xx,yy,zz) = tauGrid(xx,yy,zz) + deltaTau; % 在对应节点栅格处累加信息素增量,加强对该节点的搜索偏好  
        end % 完成对当前路径每个节点的信息素更新  
    end % 完成本轮所有可行路径的信息素增强操作  

bestPathHistory{iter} = bestPath; % 将当前全局最优路径记录到历史数组中,便于后续对比与可视化  

fprintf('迭代 %d / %d,当前最佳路径代价: %.2f\n', iter, maxIters, bestCost); % 在命令行输出迭代信息,监视算法收敛进展  
end % 完成所有迭代轮次的蚁群搜索与优化流程
三维路径可视化与结果展示示例
[xObs, yObs, zObs] = ind2sub(size(envGrid), find(envGrid == 1)); % 找出所有障碍栅格的索引并转换为三维坐标
scatter3(xObs, yObs, zObs, 8, 'filled', 'MarkerFaceColor', [0.5 0.5 0.5]); % 绘制障碍物点云,灰色点表示不可飞行区域
if ~isempty(bestPath) % 若全局最优路径非空说明找到至少一条可行路径
plot3(bestPath(:,1), bestPath(:,2), bestPath(:,3), 'b-', 'LineWidth', 2); % 使用蓝色折线绘制最佳路径轨迹,线宽加粗便于观察
end % 完成最优路径绘制条件判断
scatter3(startPos(1), startPos(2), startPos(3), 80, 'g', 'filled'); % 用绿色大点标记路径起点位置
scatter3(goalPos(1), goalPos(2), goalPos(3), 80, 'r', 'filled'); % 用红色大点标记路径终点位置
xlabel('X'); % 设置x轴标注文本,指示对应的栅格索引方向
ylabel('Y'); % 设置y轴标注文本,表示横向栅格步进
zlabel('Z'); % 设置z轴标注文本,表示高度方向栅格索引
title('ACO-RNN-CNN三维路径规划结果展示'); % 设置当前图窗的标题,说明展示内容为混合算法生成的三维航迹

三维环境栅格构建与障碍物生成示例

envSize = [60, 60, 20]; % 定义三维栅格地图尺寸,分别对应x轴、y轴和z轴方向的栅格数,数值可根据任务空间范围调整
gridResolution = 1.0; % 定义栅格空间分辨率,单位可视为米,用于将栅格索引映射到实际物理距离
envGrid = zeros(envSize); % 创建三维矩阵表示环境栅格,初始值为0表示全部为可飞行区域
numObstacles = 80; % 设置障碍物数量,数值越大环境越复杂,路径规划难度越高
maxObstacleSize = [8, 8, 6]; % 定义障碍物在三维方向上的最大尺寸,控制障碍块体大小范围
rng(1); % 固定随机数种子,保证障碍物生成过程具有可复现性,便于调试与比较实验结果

for k = 1:numObstacles % 循环生成多块障碍物,每次迭代构造一个随机障碍区域
ox = randi([1, envSize(1) - maxObstacleSize(1)]); % 随机生成障碍物在x方向的起始栅格索引,避免越界
oy = randi([1, envSize(2) - maxObstacleSize(2)]); % 随机生成障碍物在y方向的起始栅格索引,确保整块障碍在地图内
oz = randi([1, envSize(3) - maxObstacleSize(3)]); % 随机生成障碍物在z方向的起始栅格索引,控制障碍高度位置
sx = randi([3, maxObstacleSize(1)]); % 随机选取障碍物在x方向的实际尺寸,使障碍块大小存在多样性
sy = randi([3, maxObstacleSize(2)]); % 随机选取障碍物在y方向的实际尺寸,形成不规则障碍分布
sz = randi([2, maxObstacleSize(3)]); % 随机选取障碍物在z方向的实际尺寸,模拟不同高度范围的立体障碍
envGrid(ox:ox+sx, oy:oy+sy, oz:oz+sz) = 1; % 将对应栅格区域标记为1,表示该区域为障碍物,不可穿越
end % 结束障碍物生成循环

envGrid(startPos(1), startPos(2), startPos(3)) = 0; % 强制将起点栅格设置为可飞行区域,避免被随机障碍覆盖
envGrid(goalPos(1), goalPos(2), goalPos(3)) = 0; % 强制将终点栅格设置为可飞行区域,确保存在至少一条潜在可行路径

figure; % 新建图窗用于显示三维环境和障碍分布
axis equal; % 设置各坐标轴比例相同,使三维显示不产生拉伸变形
hold on; % 保持当前图像内容,方便叠加绘制障碍物和路径
[xIdx, yIdx, zIdx] = ind2sub(size(envGrid), find(envGrid == 1)); % 找出所有障碍栅格的索引位置并转换为x、y、z坐标索引
scatter3(xIdx, yIdx, zIdx, 10, 'filled', 'MarkerFaceColor', [0.3 0.3 0.3]); % 绘制障碍点云,使用小圆点显示障碍物在三维空间中的分布
scatter3(startPos(1), startPos(2), startPos(3), 60, 'g', 'filled'); % 使用绿色大点标记起点位置,便于视觉辨识
scatter3(goalPos(1), goalPos(2), goalPos(3), 60, 'r', 'filled'); % 使用红色大点标记终点位置,突出任务目标位置
xlabel('X'); % 设置x轴标签为X,用于表示水平方向栅格索引
ylabel('Y'); % 设置y轴标签为Y,用于表示另一个水平向栅格索引
zlabel('Z'); % 设置z轴标签为Z,用于表示高度方向栅格索引
title('三维栅格环境与障碍物分布'); % 设置三维图标题,说明当前图像内容为环境与障碍布局
view(45, 30); % 设置三维视角角度,便于观察整体空间分布情况
grid on; % 打开网格线显示,使三维坐标刻度更加清晰可见

numAnts = 40; % 设置蚂蚁数量,蚂蚁越多并行采样越充分,但计算量也随之增加
maxIters = 120; % 设置蚁群算法最大迭代次数,用于控制搜索时间与收敛过程长度
rho = 0.4; % 信息素蒸发系数,数值越大信息素衰减越快,有助于避免过早收敛但可能降低记忆效果
alpha = 1.0; % 信息素重要程度参数,控制蚂蚁在状态转移时对信息素浓度的依赖程度
beta = 2.0; % 启发式信息重要程度参数,控制蚂蚁对局部代价或距离信息的重视程度
Q = 1.0; % 信息素释放强度常数,与路径长度共同决定每条路径对信息素增量的贡献水平

bestPath = []; % 初始化最优路径变量,用于记录迭代过程中找到的全局最优轨迹
bestCost = inf; % 初始化最优路径代价为无穷大,用于在更新时比较与当前路径代价

CNN局部环境特征提取网络构建示例

inputPatchSize = [15, 15, 9]; % 设置CNN输入的局部三维补丁尺寸,表示在x、y、z三个方向截取的栅格范围
numChannels = 1; % 指定输入补丁的通道数,此处仅使用障碍物占用信息作为单通道输入

imageInputLayerSize = [inputPatchSize, numChannels]; % 构造图像输入层的尺寸参数,将三维体素尺寸与通道数组合为层输入维度
inputLayer = image3dInputLayer(imageInputLayerSize, Normalization="none"); % 创建三维图像输入层,关闭默认归一化,保留原始栅格值以便后续自定义处理

flattenLayer = flattenLayer; % 添加展平层,将三维特征图展平为一维向量,为后续全连接层输入准备
fcLayer1 = fullyConnectedLayer(64); % 创建全连接层,将展平后的特征映射到64维特征空间,作为高层语义表示
reluLayer3 = reluLayer; % 在全连接后添加ReLU激活,增强非线性拟合能力
fcLayer2 = fullyConnectedLayer(prod(inputPatchSize)); % 创建输出全连接层,将64维特征映射回与输入栅格单元数相同的维度,用于生成每个栅格的风险评分
sigLayer = sigmoidLayer; % 使用Sigmoid激活层将输出范围压缩到0到1之间,作为归一化风险概率输出

layersCNN = [inputLayer; convLayer1; reluLayer1; poolLayer1; convLayer2; reluLayer2; poolLayer2; flattenLayer; fcLayer1; reluLayer3; fcLayer2; sigLayer]; % 将所有CNN层按前向传播顺序组成层数组,以构建完整网络结构

lgraphCNN = layerGraph(layersCNN); % 将层数组转换为层图对象,便于后续扩展或可视化结构
netCNN = dlnetwork(lgraphCNN); % 使用dlnetwork封装CNN层图,得到可训练的动态图网络对象,方便自定义训练循环

RNN路径序列建模网络构建示例

rnnInputDim = 6; % 设置RNN输入维度,包括三维位置与三维环境或代价特征,可根据具体设计调整
rnnHiddenUnits = 64; % 设置RNN隐藏单元数量,数值越大模型表达能力越强但计算开销也越高
rnnOutputDim = 3; % 设置RNN输出维度,表示下一步期望位移方向或目标位置的三维向量

layersRNN = [featureInputLayerRNN; lstmLayerRNN; fcLayerRNN; tanhLayerRNN]; % 将RNN相关层组合为层数组,构成完整路径序列建模网络
lgraphRNN = layerGraph(layersRNN); % 将RNN层数组转为层图对象,便于后续网络拓展与管理
netRNN = dlnetwork(lgraphRNN); % 使用dlnetwork将RNN层图封装为可训练网络,支持自定义训练过程与梯度更新

ACO主循环与CNN-RNN协同启发式示例

bestPathHistory = cell(maxIters,1); % 预分配单元数组存储各迭代轮次的最优路径,便于后续分析和可视化
bestCostHistory = zeros(maxIters,1); % 预分配数组记录每一代的最优路径代价,观察算法收敛情况

for iter = 1:maxIters % 外层循环控制蚁群迭代次数,每一轮蚂蚁构造路径并更新信息素
allPaths = cell(numAnts,1); % 为当前迭代中所有蚂蚁预分配路径存储单元格
allCosts = inf(numAnts,1); % 初始化每只蚂蚁对应路径代价为无穷,后续计算真实代价并更新

for ant = 1:numAnts % 内层循环遍历每一只蚂蚁,构造其从起点到终点的路径  
    currentPos = startPos; % 将当前蚂蚁位置初始化为起点位置  
    path = currentPos; % 初始化路径为包含起点单一节点的矩阵  
    visited(currentPos(1), currentPos(2), currentPos(3)) = true; % 将起点标记为已访问,避免后续再次访问该节点  


    maxSteps = prod(envSize); % 设置最大步数上限为栅格总数,防止死循环,确保搜索在有限步骤内完成  
    step = 0; % 初始化步计数器,用于控制终止条件  


        x = currentPos(1); % 提取当前节点x索引,便于后续计算候选邻居坐标  
        y = currentPos(2); % 提取当前节点y索引,用于计算邻居位置  

        candidates = []; % 初始化候选邻居位置数组,将存储所有合法可达的邻居节点  
        tauVals = []; % 初始化候选邻居对应的信息素值向量  

        for m = 1:numMoves % 遍历每一种可能的邻居移动方向  

                continue; % 略过该邻居,不将其加入候选列表  

            if envGrid(nx,ny,nz) == 1 % 若邻居为障碍物栅格,不可穿越  
                continue; % 略过此邻居候选  
            end % 结束障碍检查  

                continue; % 避免回退到已访问节点,减少回环行为  
            end % 结束访问标记检查  

            candidates = [candidates; nx, ny, nz]; % 将合法邻居坐标加入候选集合  
            tauVals = [tauVals; tauGrid(nx,ny,nz)]; % 记录该邻居位置处的信息素值,用于计算转移概率  
            etaVals = [etaVals; heuristicGrid(nx,ny,nz)]; % 记录该邻居的启发式信息值,为转移概率提供引导  
        end % 完成当前节点所有邻居的候选检测  

        if isempty(candidates) % 若没有合法候选邻居,说明陷入死路  
            break; % 终止路径扩展,结束当前蚂蚁路径构造  
        end % 结束无候选状况判断  

        patchHalfSize = floor(inputPatchSize ./ 2); % 计算局部环境补丁半尺寸,用于从全局栅格中截取局部立方体区域  
        xMin = max(1, x - patchHalfSize(1)); % 确定局部补丁在x方向的最小索引,防止越界  
        yMax = min(envSize(2), y + patchHalfSize(2)); % 计算局部补丁在y方向的最大索引  
        zMin = max(1, z - patchHalfSize(3)); % 计算局部补丁在z方向的最小索引  
        zMax = min(envSize(3), z + patchHalfSize(3)); % 计算局部补丁在z方向的最大索引  

        localPatch = envGrid(xMin:xMax, yMin:yMax, zMin:zMax); % 从全局栅格中截取以当前节点为中心的局部环境补丁  
        localPatchPad = zeros(inputPatchSize); % 创建与网络输入大小一致的零矩阵,用于填充局部补丁  
        localPatchPad(1:(xMax-xMin+1), 1:(yMax-yMin+1), 1:(zMax-zMin+1)) = localPatch; % 将真实补丁放置到填充矩阵左上角区域,保持尺寸一致  
        dlYPred = predict(netCNN, dlX); % 使用CNN网络对局部补丁进行前向推理,生成每个栅格的风险预测值  
        riskVec = extractdata(dlYPred); % 将dlarray格式输出转换为普通数值数组,以便进一步处理  

        cnnWeights = ones(size(candidates,1),1); % 初始化与候选邻居数量相同的CNN权重向量,默认值为1表示不调整  
        for c = 1:size(candidates,1) % 遍历每一个候选邻居节点  
            cx = candidates(c,1) - x + patchHalfSize(1) + 1; % 将邻居x坐标映射到局部补丁坐标系中的位置  
            cy = candidates(c,2) - y + patchHalfSize(2) + 1; % 将邻居y坐标映射到局部补丁坐标系相对索引  
            cz = candidates(c,3) - z + patchHalfSize(3) + 1; % 将邻居z坐标映射到局部补丁立方体内部索引  
            cy = max(1, min(inputPatchSize(2), cy)); % 同样对y方向索引进行范围裁剪  
            cz = max(1, min(inputPatchSize(3), cz)); % 对z方向索引进行范围限制  
            riskVal = riskMap(cx, cy, cz); % 读取CNN预测的该邻居位置风险值,值越大表示风险越高  
            cnnWeights(c) = 1.0 - 0.7 * riskVal; % 将风险值映射为候选权重,风险越高权重越低,0.7为调节系数  

        lstmInputStep = [currentPos, mean(etaVals)*ones(1,3)]; % 构造当前时间步的RNN输入特征,包含位置与启发式信息统计特征  
        dlSeq = dlarray(single(lstmInputStep'), "CBT"); % 将特征转换为列通道时间格式dlarray,满足RNN输入接口要求  
        dlRNNOut = predict(netRNN, dlSeq); % 使用RNN对当前状态进行前向推理,预测下一步位移方向向量  
        rnnDir = rnnDir(:,end); % 获取序列最后一个时间步对应的输出方向向量  
            rnnDir = rnnDir / norm(rnnDir); % 对方向向量归一化,使其表示单位方向而非任意长度  
        end % 确保RNN方向向量为单位长度或零向量  

            dirVec = double(candidates(c,:) - currentPos); % 计算从当前节点到候选邻居的位移向量  
            if norm(dirVec) > 0 % 若位移长度非零  
                dirVec = dirVec / norm(dirVec); % 将位移向量归一化为单位方向  
            end % 确保方向比较时不受长度影响  
            alignment = dot(rnnDir', dirVec); % 计算RNN预测方向与候选方向的点积,衡量方向一致性  
        end % 完成所有候选的RNN协同权重计算  

        tauAlpha = tauVals .^ alpha; % 将信息素值按alpha指数放大或压缩,用于状态转移概率计算  
        if sum(weightCombined) == 0 % 若综合权值全部为零,表示当前引导失效  
            probs = ones(size(weightCombined)) / numel(weightCombined); % 将转移概率设为均匀分布,恢复随机搜索特性  
        else % 若综合权值非全零  
            probs = weightCombined / sum(weightCombined); % 将权值归一化为概率分布,用于随机选择下一个节点  
        r = rand; % 生成0到1之间的随机数,用于轮盘赌选择下一节点  
        cumulative = cumsum(probs); % 计算转移概率的累积分布,便于根据随机数定位目标候选  
        selectIndex = find(cumulative >= r, 1, "first"); % 找到累积概率首次超过随机数的位置,作为被选中的邻居索引  

        moveCost = 1.0; % 将每步移动代价初始设置为1,可在后续引入高度变化或风险调整  
        pathCost = pathCost + moveCost; % 累加路径总代价,根据每一步移动成本更新  

        currentPos = nextPos; % 更新当前节点位置为刚选择的邻居节点  
        path = [path; currentPos]; % 将新节点追加到路径序列末尾,构成逐步增长的轨迹  
    end % 结束当前蚂蚁在本轮迭代中的路径构建过程  

    if isequal(currentPos, goalPos) % 若当前蚂蚁最终到达目标节点  
        allCosts(ant) = pathCost; % 记录该路径的累积代价,用于后续比较和信息素更新  
end % 完成所有蚂蚁在本轮迭代中的路径生成  
tauGrid = (1 - rho) * tauGrid; % 对全局信息素进行蒸发操作,将信息素强度按蒸发系数进行衰减  
validIdx = validIdx(isfinite(validCosts)); % 只保留代价有限的索引,即那些成功到达终点的路径  
    bestIdxIter = validIdx(1); % 选择代价最小的路径索引作为本轮最优路径索引  
    bestCostIter = allCosts(bestIdxIter); % 记录本轮最优路径的代价值  
    bestPathIter = allPaths{bestIdxIter}; % 提取本轮最优路径节点序列  

    if bestCostIter < bestCost % 若本轮最优路径优于全局历史最优路径  
        bestCost = bestCostIter; % 更新全局最优路径代价为当前值  
        bestPath = bestPathIter; % 更新全局最优路径节点序列  
    end % 完成全局最优路径更新的条件判断  
        pathK = allPaths{validIdx(k)}; % 提取当前可行路径节点序列  
        costK = allCosts(validIdx(k)); % 提取当前路径对应代价  
        deltaTau = Q / costK; % 根据信息素公式计算该路径对每个节点的信息素增量,路径越优增量越大  
        for p = 1:size(pathK,1) % 遍历路径中的每一个节点位置  
            yy = pathK(p,2); % 读取节点的y坐标索引  
            zz = pathK(p,3); % 读取节点的z坐标索引  
            tauGrid(xx,yy,zz) = tauGrid(xx,yy,zz) + deltaTau; % 在对应节点栅格处累加信息素增量,加强对该节点的搜索偏好  
        end % 完成对当前路径每个节点的信息素更新  
    end % 完成本轮所有可行路径的信息素增强操作  

bestPathHistory{iter} = bestPath; % 将当前全局最优路径记录到历史数组中,便于后续对比与可视化  

fprintf('迭代 %d / %d,当前最佳路径代价: %.2f\n', iter, maxIters, bestCost); % 在命令行输出迭代信息,监视算法收敛进展  

end % 完成所有迭代轮次的蚁群搜索与优化流程

三维路径可视化与结果展示示例

[xObs, yObs, zObs] = ind2sub(size(envGrid), find(envGrid == 1)); % 找出所有障碍栅格的索引并转换为三维坐标
scatter3(xObs, yObs, zObs, 8, 'filled', 'MarkerFaceColor', [0.5 0.5 0.5]); % 绘制障碍物点云,灰色点表示不可飞行区域

if ~isempty(bestPath) % 若全局最优路径非空说明找到至少一条可行路径
plot3(bestPath(:,1), bestPath(:,2), bestPath(:,3), 'b-', 'LineWidth', 2); % 使用蓝色折线绘制最佳路径轨迹,线宽加粗便于观察
end % 完成最优路径绘制条件判断

scatter3(startPos(1), startPos(2), startPos(3), 80, 'g', 'filled'); % 用绿色大点标记路径起点位置
scatter3(goalPos(1), goalPos(2), goalPos(3), 80, 'r', 'filled'); % 用红色大点标记路径终点位置

xlabel('X'); % 设置x轴标注文本,指示对应的栅格索引方向
ylabel('Y'); % 设置y轴标注文本,表示横向栅格步进
zlabel('Z'); % 设置z轴标注文本,表示高度方向栅格索引
title('ACO-RNN-CNN三维路径规划结果展示'); % 设置当前图窗的标题,说明展示内容为混合算法生成的三维航迹

更多详细内容请访问

http://【无人机路径规划】MATLAB实现基于ACO-RNN-CNN蚁群算法(ACO)结合循环神经网络(RNN)与卷积神经网络(CNN)进行无人机三维路径规划的详细项目实例(含完整的程序,GUI设计和代码详资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/92781606

https://download.csdn.net/download/xiaoxingkongyuxi/92781606

https://download.csdn.net/download/xiaoxingkongyuxi/92781606

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐