MATLAB实现基于PSO-DNN-LSTM 粒子群优化算法(PSO)结合深度神经网络(DNN)与长短期记忆网络(LSTM)进行无人机三维路径规划的详细项目实例

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

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

无人机三维路径规划在低空智能交通、灾害搜救、电力巡检、环境监测与军事侦察等领域中已经成为关键技术之一。随着多旋翼、小型固定翼以及倾转旋翼等多类型无人机的大规模应用,飞行环境与任务场景的复杂度不断提升,单纯依靠人工规划或基于简单几何规则的路径规划方法,很难在兼顾安全性、实时性、节能性和任务完成质量的前提下生成高质量三维轨迹。典型的作业场景包括城市楼宇密集区的立体环境、山谷峡谷间的强气流扰动区域以及存在禁飞区、威胁区和复杂电磁环境的敏感区域。三维路径规划不仅要在空间中规避静态障碍物,还要兼顾动态障碍物、风场扰动、通信中断区域以及任务相关约束(例如观测点覆盖度、雷达/光电视场遮挡等)。简单的传统算法往往只处理某一方面的约束,难以综合多目标、多约束进行统一优化。

在数学模型层面,无人机三维路径规划属于典型高维非线性、多目标、多约束优化问题。搜索空间常为连续三维空间,包含水平位置坐标和高度维度,并且路径需满足无人机动力学约束、转弯半径约束、爬升率与下降率约束、电池续航时间约束以及任务时序约束等。这类问题的目标函数往往包括:总飞行距离最短、总能耗最低、飞行时间最短、路径平滑度较高、避障裕度最大化以及风险期望值最小化等。各目标之间常存在竞争关系,例如过分追求最短路径可能导致飞行高度过低,反而增加碰撞风险;过分保守的避障策略则会导致飞行距离和能耗显著上升。因此需要更智能、可自学习且具有全局优化能力的方法来寻求满意解。

粒子群优化算法(PSO)由于实现简单、参数较少、易于并行和具有较强的全局搜索能力,在连续空间优化问题中应用广泛。PSO通过模拟鸟群或鱼群在空间中协同搜索食物的行为,每个粒子代表一个候选路径,通过个体最优与群体最优信息共享迭代更新位置,从而在复杂空间中快速逼近全局最优区域。然而,传统PSO在高维复杂路径规划问题中容易遭遇早熟收敛,即粒子群在搜索早期聚集于局部最优附近而缺乏足够探索; 同时,标准PSO在处理强时序相关和环境动态变化时效果有限,因为粒子搜索行为对历史轨迹和时序上下文的利用非常粗糙。

深度神经网络(DNN)在高维非线性特征提取方面具有显著优势,能够从大量路径样本与环境数据中学习到复杂的路径质量评估模式。例如,在给定环境栅格地图、威胁强度分布、风场信息和任务要求后,DNN可以学习一个隐式的“路径优劣评分函数”,为优化算法提供更精细的搜索引导。特别是当环境特征维度较高时,传统人工设计的代价函数往往依赖经验,很难充分表达实际任务需求,而DNN能够通过数据驱动方式建立高维输入与路径质量之间的非线性映射,减轻人工建模难度。

长短期记忆网络(LSTM)属于典型的循环神经网络结构,专长在于处理序列数据和捕捉长期时间依赖关系。无人机三维航迹具有明显的时间和序列特征,当前时刻的动作不仅受当前环境状态影响,还受前序轨迹的影响,例如速度变化、已累积能耗、与危险区域的历史交互等。LSTM通过输入门、遗忘门和输出门的门控机制有效解决了传统RNN在长序列学习中易出现梯度消失或梯度爆炸的问题,能够在较长时间范围内记忆关键轨迹模式。因此,将LSTM引入无人机轨迹规划,可以通过学习历史路径序列来预测未来路径的质量或者动态环境变化,从而提升规划结果的连续性和安全性。

PSO、DNN与LSTM三者结合为无人机三维路径规划提供了一个兼具全局搜索能力、高维特征表示能力和时序信息建模能力的综合框架。PSO负责在三维空间中生成和更新候选路径,利用群体智能机制进行全局搜索;DNN构建高维环境特征与路径质量之间的映射,为PSO提供更加精细、接近真实任务需求的适应度评估;LSTM则对轨迹序列进行时序建模,能够预测路径的未来风险与潜在代价,或者为下一步路径更新提供增量信息。通过这种多层次融合,可以在复杂动态环境中更稳定地获得高质量三维路径。

在工程实现层面,选用MATLAB R2025b作为主要开发平台,能够充分利用其矩阵运算优势、深度学习工具箱以及优化工具箱等组件。MATLAB提供了便捷的数据可视化能力,可以在三维坐标系中直观展示无人机构型空间、障碍分布以及规划结果。同时,MATLAB对于自定义网络结构和序列网络训练提供了相对成熟的接口,尤其在实验验证与快速原型阶段具有明显效率优势。基于MATLAB构建PSO-DNN-LSTM三维路径规划项目,既可以满足算法研发和仿真验证需求,也便于后续向C/C++或嵌入式代码迁移,为工程应用打下基础。

综上,构建基于PSO-DNN-LSTM的无人机三维路径规划项目,旨在综合利用智能优化算法与深度学习模型各自的优势,解决传统规划方法在高维非线性环境中的局限问题,为高可靠、高效率、可扩展的无人机自主飞行系统提供新思路和技术支撑。

项目目标与意义

全局最优与实时规划能力的统一

无人机在复杂三维环境中执行任务时,既需要相对接近全局最优的路径,又常常面临实时或准实时的规划需求。传统全局规划方法(如离线搜索)往往耗时较长,难以适应环境快速变化,而单纯依靠局部规划方法则容易陷入局部最优,甚至在特定构型下出现“陷阱”。本项目通过采用PSO作为全局搜索核心,结合DNN预训练出的路径代价评估模型,能够在较少迭代次数中快速筛选出高质量候选路径,同时利用LSTM对轨迹序列进行时序预测与补偿,使规划过程既具备全局搜索能力,又能在有限时间内提供满足任务需求的路径。PSO在宏观上搜索路径空间的潜在优区域,DNN在微观层面提供精细的代价评估,LSTM则引入对未来轨迹质量的预估,这种分工协作使得规划系统在兼顾精度与速度方面具有明显优势,从而支持复杂任务场景下的在线或半在线决策。

多源环境信息与高维约束的融合建模

在实际任务过程中,无人机所处环境不仅包含几何障碍物信息,还包括雷达探测覆盖区、电磁干扰强度、风场扰动、气象条件以及地面设施等多维度信息。如果在规划过程中只考虑几何障碍,很容易出现规划路径在“空间上可行但在任务层面不可接受”的情况。项目通过构建高维输入的DNN模型,将环境栅格地图、威胁强度分布、风速风向场、禁飞区地图、目标点优先级等多种信息融合到统一特征空间中,进而在代价评估阶段对不同因素进行加权与非线性组合,实现多源信息的统一建模。LSTM进一步在时间维度上对这些环境特征及路径序列进行联合建模,捕捉时间演化趋势。通过这种方式,项目目标不仅是规划一条避障轨迹,而且是在多种复杂约束下寻求整体任务绩效最优,使规划结果更贴近真实应用需求,具有更高实用意义。

提升路径平滑性、安全性与可执行性

路径规划结果在传递给无人机姿态与动力学控制模块后,还需满足平滑性、曲率约束、速度与加速度限制等一系列可执行性要求。若规划算法给出的路径过于折线化或频繁出现急转弯,将给实际飞控系统带来较大跟踪误差以及能耗增加,甚至在极端情况下造成失稳。项目在目标设计中明确引入路径平滑度指标和姿态变化成本,在PSO搜索过程中通过代价函数约束粒子对应路径的曲率与爬升率,使其更加平滑和可执行。DNN通过学习大量可执行航迹样本,总结可执行与不可执行路径之间的隐含差异,为可执行性提供深度特征判别;LSTM则可利用历史轨迹信息对未来姿态变化趋势进行预测,避免规划结果中出现大幅度连续转弯的轨迹段。这种设计不仅提升飞行安全性,减少与障碍物的风险接触,还能降低飞控压力,改善飞行稳定性与任务执行效果。

构建可扩展的智能规划框架与研究平台

项目不仅关注单次规划效果,更强调构建一个易扩展、可迁移、便于后续研究的智能规划框架。通过在MATLAB R2025b环境中实现PSO-DNN-LSTM联合架构,为后续研究提供可重复、可调试、可视化的统一平台。研究人员或工程技术人员可以在此基础上替换或扩展DNN结构(如引入卷积模块处理栅格地图)、调整LSTM深度、修改PSO参数甚至引入其他元启发式算法,实现多种算法的对比试验和性能评估。同时,框架预留了与真实飞行数据和仿真器接口的集成空间,便于未来与硬件在环仿真或实际无人机试飞相结合。通过该项目,能够形成一个集算法研究、参数调优、场景仿真与性能评价于一体的综合平台,为无人机群协同规划、多机系统协作决策以及智能空域管理等后续深层研究提供基础支持,具有重要的科研与工程推广意义。

项目挑战及解决方案

高维复杂环境与多目标代价函数建模挑战与对策

无人机三维路径规划的问题本身就处在高维连续空间中,而当引入多源环境信息与多种任务目标时,问题维度和复杂性会进一步增加。传统代价函数通常采用人工设计的线性或分段式形式,例如距离权重、避障惩罚、威胁区惩罚等简单加权组合。这种方式在维度较低时尚可使用,但在包含障碍密度、威胁强度、地形起伏、风场扰动以及通信覆盖等多因素时,很难通过手工调参获得理想效果,并且代价函数的可解释性与泛化能力均受限。同时,多目标之间存在竞争甚至冲突,使目标加权的选择变得更加棘手,一旦权重设置不合理,规划结果可能偏向某一目标,忽略其他关键约束。

为应对这一挑战,项目选择引入DNN作为非线性代价函数近似器。具体思路为:使用历史规划数据或仿真生成数据构造样本集,对每条候选路径与其环境特征进行整体编码,训练DNN预测一个综合评分值。这个评分不再是简单的线性组合,而是通过深度网络自动从数据中学习多目标之间的复杂关联及权衡关系。通过这种方式,多目标代价函数不再直接手动构造,而是通过数据驱动的非线性模型来实现。为了保证网络在高维输入空间的稳定训练过程,需要采取适当的正则化措施、批量归一化以及学习率调度策略,同时利用交叉验证与多场景测试来提高模型的泛化能力。此外,通过将部分物理或安全性约束以硬约束方式加入到路径编码过程中(例如确保路径始终落在飞行安全走廊内),而将软约束交给DNN学习,可以在控制问题规模的前提下有效描述复杂环境与多目标关系,从而解决高维代价建模难题。

时序依赖与环境动态变化带来的学习与推理挑战

在实际应用中,无人机所面对的环境往往具有显著时间变化特征,例如风场随时间变化、动态障碍物移动、任务目标位置更新等。单次静态规划通常无法满足任务执行过程中的连续适应需求。因此在规划策略设计时需要考虑时序依赖与动态环境响应,单纯基于静态快照的规划很容易失效。传统PSO在更新过程中主要依赖当前位置与全局/个体历史最优位置,并没有显式建模环境随时间变化的过程,且不具备预测能力。一旦环境发生显著变化,需要重新规划或进行大量迭代,这将给实时性带来较大挑战。

针对这一问题,项目将LSTM作为关键时序建模模块,融入路径规划流程之中。一方面,LSTM可以对历史轨迹序列进行编码,从中学习路径平滑性、飞行姿态变化规律以及能耗变化趋势,用于辅助评估当前候选路径是否符合长期轨迹模式;另一方面,LSTM还可以对时间序列形式的环境状态进行预测,例如通过历史风场数据预测未来若干时间步的风速和风向,用于路径规划中的能耗估计或安全性评估。在具体实现中,可将PSO产生的候选路径作为序列输入,在每个路径节点处拼接环境状态,构成多维时序输入序列,由LSTM输出整体路径质量评分或者未来风险评分,从而增强PSO的评估能力。为了应对LSTM训练中可能出现的梯度消失或过拟合问题,需要合理设置网络层数与隐藏单元数,并利用序列正则化策略与适当的训练数据增强方法。此外,在推理阶段可以采用滑动窗口机制,在新的环境观测到来时快速更新LSTM状态,实现一种带有短期记忆的在线迭代规划,从而明显提升规划系统对环境动态变化的适应能力。

PSO搜索早熟、参数敏感与算法收敛稳定性问题及解决路径

粒子群优化虽然结构简单,但在复杂高维问题上,经常会遇到搜索早熟、局部收敛以及参数敏感等问题。惯性权重、个体学习因子与群体学习因子的取值对搜索过程具有重要影响,设置不当时,粒子群容易在早期就聚集到局部最优附近,大大削弱全局搜索能力。高维路径编码形式下,每个粒子对应的维度数量较多,位置更新时不同维度之间的协同作用更加复杂,如果缺少有效引导,很难在有限迭代中找到高质量解。此外,当PSO嵌入到深度学习评估模块中时,每次适应度评估的计算成本变大,如果迭代次数过多,将造成整体计算时间难以接受,影响实时性。

为解决这些问题,项目在PSO设计中采用若干改进策略。首先,引入动态惯性权重调整机制,在搜索早期使用较大的惯性权重以增强探索能力,逐步减小到较小值以增强收敛精度,避免过早集中到局部区域。其次,在个体与群体学习因子设置上,引入随机扰动和适应性调节机制,根据当前迭代中粒子群的多样性指标,动态调整学习因子比例,当粒子群多样性下降时,适度增强随机性和探索性,以防止早熟收敛。第三,在粒子位置更新过程中加入边界处理与路径平滑修正,例如对超出安全区域的粒子位置进行映射或惩罚,利用局部平滑滤波器对路径节点进行微调,从而在不破坏PSO主体更新机制的前提下提升路径可行性和质量。最后,通过与DNN和LSTM的紧密耦合,将三者形成闭环:PSO通过DNN/LSTM评估路径质量;DNN/LSTM通过PSO产生的大量候选样本进行持续学习与微调;在评估过程中根据网络输出的不确定性度量进一步调整PSO参数,使得搜索过程更稳健、更具针对性。这种多模块协同优化策略有效提升了算法的收敛稳定性与全局寻优能力。

项目模型架构

整体框架与三维环境建模

整个项目的模型架构围绕“环境建模 + PSO路径编码与搜索 + DNN高维代价评估 + LSTM序列补偿与预测”这一主线展开。在最底层,需要构建一个能够真实反映任务场景的三维环境模型。三维环境模型包含飞行空间边界、障碍物几何形状(例如立方体模拟建筑物、圆柱体模拟塔架、复杂多面体模拟山体)、禁飞区与威胁区的空间范围、风场矢量场以及其他任务相关数据。在数字表示上,可以采用三维栅格地图、体素数据或基于几何参数的解析描述。为了兼顾精度与计算效率,通常会在较广区域内采用较粗栅格,在关键区域采用局部精细化建模。环境模型提供的主要功能包括:路径可行性检测(判断路径与障碍物是否相交)、威胁代价查询(路径经过区域的威胁强度积分)以及风场影响估算等。

在MATLAB中,可以利用三维数组表示体素地图,或者使用结构体存储障碍物列表及其参数,并配以专门的碰撞检测函数。环境建模模块的输出,为上层路径规划提供基础数据,包括不同位置点的安全性评分、威胁强度以及风速风向。每条候选路径将被离散为一定数量的节点,每个节点在环境模型中的位置用于查询局部代价信息。这个过程为后续DNN与LSTM的特征构建提供了基础。整体框架将三维环境建模作为基础层,在其之上叠加PSO搜索和神经网络评估,从而形成一个分层、模块化的规划体系。

PSO路径编码与优化机制

在规划模型中,每个粒子代表一条完整的三维路径。为了便于优化与约束实现,路径常以若干中间控制点的形式进行编码:固定起点和终点,同时在空间中定义若干可变中间节点,粒子的位置向量由这些中间节点的三维坐标拼接而成。例如,若设置M个中间节点,则每个粒子位置向量维度为3M,包含所有中间节点的x、y、z坐标。通过样条插值或分段直线连接这些节点,可生成连续三维轨迹。PSO通过位置与速度更新规则,迭代调整这些中间节点的坐标,使路径在目标函数空间中逐步趋于优值。

粒子更新过程中,惯性权重控制当前速度的延续程度,个体学习因子引导粒子朝自身历史最优位置靠近,群体学习因子引导粒子向群体历史最优位置靠近。调整这些参数可以控制探索与开发之间的平衡。在本项目架构中,PSO不再单独使用简单代价函数,而是将候选路径输入到DNN与LSTM组成的评估模块中,由神经网络输出综合路径质量分数。PSO将这一分数作为适应度进行比较与更新,从而使搜索过程能够在复杂高维代价空间中进行。通过迭代,粒子群不断调整路径控制点位置,最终收敛到综合成本较低、满足约束条件的路径。

DNN高维环境特征与路径质量映射模块

DNN在模型中承担高维特征提取与非线性映射的核心角色。输入端包含编码后的环境特征与路径结构数据。环境特征可包括:路径节点处的障碍物密度、威胁强度、风速风向、地形高度差、通信覆盖可用性等;路径结构数据可以包括总距离、平均曲率、最大爬升角、平均高度等统计特征。通过将这些信息组合成一个高维特征向量输入DNN,网络在训练过程中学习将这些复杂因素映射到一个综合路径质量评分。评分可以设计为越小越好,也可转换为适应度形式。

DNN网络结构可采用多层全连接网络,配合非线性激活函数,例如ReLU、tanh等。通过增加网络深度与宽度,可以提升拟合复杂非线性关系的能力,但也需要适度控制模型容量以避免过拟合。在项目设计中,可采用多层全连接网络,配合批量归一化与dropout等正则化技术,提高泛化能力。DNN训练数据来源于历史规划样本或仿真构建样本,可以在离线阶段充分训练,使网络能够在在线规划时快速输出高质量评估结果。通过这一设计,DNN将原本难以人工设计的多目标代价函数转化为数据驱动的评分模型,从根本上提升规划系统对复杂环境的适应能力。

LSTM时序轨迹与环境动态补偿模块

LSTM模块专注于时序信息建模,用于处理路径节点序列与时间序列环境状态。在路径规划任务中,每条路径可视为按时间顺序依次到达的一系列空间节点。LSTM可以将这些节点及其对应的环境状态作为输入序列,通过门控机制在内部记忆单元中保存关键历史信息,进而在路径后续节点质量评估时发挥作用。例如,在路径前段已经存在较大爬升或急转弯情况下,LSTM可以将这一信息融入对后续节点的代价评估中,避免路径在中后段继续累积过多姿态变化,影响可执行性和安全性。

在环境动态方面,LSTM可以利用过去的环境观测序列预测未来一段时间内的环境变化趋势,例如风场变化或移动障碍物位置信息。这一预测结果可用于规划过程中的提前规避和能耗估计,使得规划不仅基于当前环境,还考虑到未来短期的环境变化。LSTM输出可以有两种典型形式:一是直接输出路径整体评分或未来风险评估,与DNN输出相结合形成综合评分;二是输出对未来环境状态的预测,用于构造DNN输入特征。通过这种设计,LSTM模块与DNN模块形成互补关系,共同提升路径规划对时间依赖与环境动态变化的敏感度和适应性。

PSO-DNN-LSTM协同集成与MATLAB实现结构

整个模型架构在MATLAB R2025b环境中实现。底层为环境建模模块,提供栅格地图、障碍物数据与环境状态查询接口。中间层为PSO优化模块,负责粒子初始化、位置与速度更新、边界处理以及主循环控制。上层为DNN与LSTM联合评估模块,通过MATLAB深度学习工具箱构建并训练相应网络。在规划过程中,PSO在每次迭代中生成若干候选路径,将路径及其环境特征编码后输入DNN和LSTM,得到综合评分作为适应度值。PSO据此更新粒子个体最优和全局最优,并迭代推进。整个系统通过函数调用与数据结构共享形成一个紧密耦合的优化闭环。

在软件组织结构上,可将环境建模、特征提取、DNN评估、LSTM评估以及PSO主循环分别封装成独立函数,主脚本负责调用这些模块完成规划任务。MATLAB提供的网络定义、训练与预测接口可以直接用于构建DNN和LSTM模型,注意在R2025b版本下遵循相关函数与属性的规范,不使用已弃用接口。最终输出包括三维路径节点坐标、路径评价指标以及可视化结果,例如三维轨迹曲线与障碍物分布图等。通过这一集成架构,实现从环境建模到智能路径规划的完整流程。

项目模型描述及代码示例

三维环境建模与基础数据结构示例
numObstacles = 5; % 设定环境中包含5个障碍物,用于初步测试场景复杂度
env.obstacles = cell(numObstacles,1); % 使用元胞数组存储各障碍物参数,便于多类型几何体扩展
for k = 1:numObstacles % 遍历每一个障碍物索引,逐个生成障碍物参数
obs.center = [200+100k, 300+50k, 50]; % 设置障碍物中心位置,随索引变化分布在场景内不同位置
obs.size = [80, 80, 150]; % 设置障碍物三维尺寸,分别对应x、y、z方向的长度
env.obstacles{k} = obs; % 将当前障碍物参数结构体存入环境结构的元胞数组位置k
end % 结束障碍物生成循环
occGrid = false(length(xGrid), length(yGrid), length(zGrid)); % 初始化体素占据矩阵,逻辑型表示是否有障碍物
for ix = 1:length(xGrid) % 遍历x方向所有栅格索引
for iy = 1:length(yGrid) % 遍历y方向所有栅格索引
for iz = 1:length(zGrid) % 遍历z方向所有栅格索引
pt = [xGrid(ix), yGrid(iy), zGrid(iz)]; % 计算当前栅格中心点三维坐标
occFlag = false; % 初始化当前栅格是否被障碍物占据的标志位
for k = 1:numObstacles % 遍历所有障碍物进行碰撞检测
obs = env.obstacles{k}; % 读取第k个障碍物参数结构体
minCorner = obs.center - obs.size/2; % 计算障碍物立方体最小角点坐标
maxCorner = obs.center + obs.size/2; % 计算障碍物立方体最大角点坐标
if all(pt >= minCorner) && all(pt <= maxCorner) % 判断当前栅格点是否落在障碍物立方体内部
occFlag = true; % 若在内部则将占据标志设为真
break; % 已确定被占据,无需继续检查其他障碍物
end % 结束位置判断条件
end % 结束障碍物循环
occGrid(ix,iy,iz) = occFlag; % 将当前栅格的占据状态写入体素矩阵
end % 结束z方向遍历
end % 结束y方向遍历
end % 结束x方向遍历
env.xGrid = xGrid; % 将x方向栅格坐标向量存入环境结构体,方便后续查询映射
env.yGrid = yGrid; % 将y方向栅格坐标向量存入环境结构体
env.zGrid = zGrid; % 将z方向栅格坐标向量存入环境结构体
env.occGrid = occGrid; % 将构建好的三维占据栅格矩阵存入环境结构体
startPos = [50, 50, 30]; % 设置无人机起始位置坐标,位于环境空间一侧低空处
goalPos = [900, 900, 80]; % 设置无人机目标位置坐标,位于环境空间另一侧适中高度处
路径编码与PSO粒子初始化示例
numParticles = 40; % 设置粒子群规模为40,兼顾搜索能力与计算量
maxIters = 80; % 设置PSO最大迭代次数,控制规划循环长度
lb = repmat([env.xMin, env.yMin, env.zMin], 1, numWaypoints); % 为所有中间点构建位置下界向量,保证落在环境内
ub = repmat([env.xMax, env.yMax, env.zMax], 1, numWaypoints); % 为所有中间点构建位置上界向量,对应空间边界上限
pos = rand(numParticles, dim); % 生成粒子位置的随机初始矩阵,范围在0到1之间
pos = pos .* (ub - lb) + lb; % 将随机矩阵按上下界缩放平移,使每个粒子位置落入合法空间范围
vel = zeros(numParticles, dim); % 初始化粒子速度矩阵为零,后续根据更新规则逐步形成速度分布
pbestPos = pos; % 初始化个体最优位置为当前随机位置,后续若适应度提高会更新
pbestVal = inf(numParticles,1); % 初始化个体最优适应度为正无穷,用于比较最小代价路径
gbestPos = zeros(1,dim); % 初始化群体最优位置向量,初始为空值占位
gbestVal = inf; % 初始化群体最优适应度为正无穷,表示尚未找到任何有效候选路径
wMax = 0.9; % 设置惯性权重最大值,用于搜索早期较强的探索能力
wMin = 0.4; % 设置惯性权重最小值,用于搜索后期提高收敛稳定性
c1 = 1.8; % 设置个体学习因子权重,引导粒子向自身历史最优收敛
c2 = 1.8; % 设置群体学习因子权重,引导粒子向全局历史最优收敛
numSamples = 200; % 设置用于训练DNN的样本数量,用于构建代价近似模型
Xfeat = zeros(numSamples, dim + 5); % 为输入特征矩阵预分配空间,包含路径控制点与额外5个统计特征
yScore = zeros(numSamples,1); % 为目标评分向量预分配空间,对应每条样本路径的综合成本
for n = 1:numSamples % 遍历每个样本索引,逐个构造训练样本
wpVec = rand(1,dim) .* (ub - lb) + lb; % 随机生成一条样本路径的中间控制点向量,保证在边界内
pathPts = zeros(numWaypoints+2,3); % 为包含起点和终点在内的路径节点矩阵预分配空间
pathPts(1,:) = startPos; % 将路径起点位置赋值到节点矩阵第一行
for j = 1:numWaypoints % 遍历中间控制点索引
idx = (j-1)*3 + 1; % 计算当前中间点x坐标在向量中的起始下标
pathPts(j+1,:) = wpVec(idx:idx+2); % 从向量中提取该中间点的三维坐标写入节点矩阵
end % 结束中间点循环
pathPts(end,:) = goalPos; % 将路径终点位置赋值到节点矩阵最后一行
segDiff = diff(pathPts,1,1); % 计算相邻节点之间的位置差,用于估算段距离与方向变换  
segLen = sqrt(sum(segDiff.^2,2)); % 计算每个路径段向量的欧式长度,得到路径段长度序列  
totalLen = sum(segLen); % 计算整条路径的总长度作为能耗与时间估计的基础指标  
curvatureCost = sum(vecnorm(diff(segDiff,1,1),2,2)); % 通过相邻段向量差的范数和,对路径弯曲程度进行粗略衡量  
zVar = var(pathPts(:,3)); % 计算路径高度序列的方差,用于衡量爬升下降起伏程度  
threatCost = 0; % 初始化威胁代价累积量,后续在每个节点处累积  
    pt = pathPts(j,:); % 读取当前节点三维坐标  
    threatLevel = exp(-pt(3)/100); % 使用高度的指数衰减函数构造一个简化威胁水平示例,高度越低威胁越高  
    threatCost = threatCost + threatLevel; % 将当前节点威胁水平累积到总威胁代价中  
collisionPenalty = 0; % 初始化碰撞惩罚项,若路径穿越障碍物则叠加惩罚  
for j = 1:size(pathPts,1) % 遍历路径所有节点索引进行碰撞检测  
    pt = pathPts(j,:); % 读取当前节点坐标  
    ix = round((pt(1)-env.xMin)/gridRes)+1; % 将x坐标映射为体素栅格x索引  
    iy = round((pt(2)-env.yMin)/gridRes)+1; % 将y坐标映射为体素栅格y索引  
    iz = round((pt(3)-env.zMin)/gridRes)+1; % 将z坐标映射为体素栅格z索引  
    if ix>=1 && ix<=length(env.xGrid) && ... % 检查x索引是否在体素矩阵合法范围内  
       iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引是否在体素矩阵合法范围内  
       iz>=1 && iz<=length(env.zGrid) % 检查z索引是否在体素矩阵合法范围内  
        if env.occGrid(ix,iy,iz) % 若当前栅格被标记为障碍物占据  
            collisionPenalty = collisionPenalty + 1e4; % 累积一个较大的惩罚项,用于强制避障  
        end % 结束占据判断  
    end % 结束边界检查  
end % 结束碰撞检测循环  
totalCost = totalLen + 0.5*curvatureCost + 20*zVar + threatCost + collisionPenalty; % 将各成本项按权重合成为综合代价值  
extraFeat = [totalLen, curvatureCost, zVar, threatCost, collisionPenalty]; % 将统计特征组合成额外特征向量,用于DNN输入补充  
yScore(n) = totalCost; % 将对应的综合代价写入目标评分向量对应位置  
end % 结束训练样本生成循环
Xmu = mean(Xfeat,1); % 计算输入特征矩阵每一列的均值,用于特征归一化中心化
Xsigma = std(Xfeat,0,1) + 1e-6; % 计算输入特征矩阵每一列的标准差并加入微小值,避免零方差导致除零错误
Xnorm = (Xfeat - Xmu) ./ Xsigma; % 对输入特征进行标准化处理,提高网络训练稳定性
numFeat = size(Xnorm,2); % 获取归一化后输入特征的维度,用作网络输入层节点数量参考
layersDNN = [ ... % 定义DNN网络层结构数组,使用序列网络形式
featureInputLayer(numFeat) ... % 特征输入层,接受指定维度的向量输入
fullyConnectedLayer(64) ... % 第一隐藏层,包含64个神经元,用于初步非线性映射
reluLayer ... % ReLU激活层,引入非线性并缓解梯度消失问题
fullyConnectedLayer(64) ... % 第二隐藏层,进一步提取高阶特征
reluLayer ... % 再一次使用ReLU激活以增强表达能力
fullyConnectedLayer(32) ... % 第三隐藏层,降低维度并压缩特征
reluLayer ... % 激活层继续引入非线性变化
fullyConnectedLayer(1) ... % 输出层,输出单一标量作为路径代价预测值
regressionLayer]; % 回归损失层,用于对连续目标值进行回归学习
optsDNN = trainingOptions("adam", ... % 使用Adam优化算法训练网络,适合中小规模回归任务
"MaxEpochs", 50, ... % 设置最大训练轮数为50,在训练数据规模下进行多轮迭代收敛
"MiniBatchSize", 32, ... % 设置每一训练小批量包含32个样本,提升训练效率与稳定性
"InitialLearnRate", 1e-3, ... % 设置初始学习率为0.001,在收敛速度与稳定性之间折中
"Verbose", false); % 关闭详细训练过程输出,避免命令行过度信息干扰
netDNN = trainNetwork(Xnorm, yScore, layersDNN, optsDNN); % 使用标准化特征和目标代价训练DNN网络,得到拟合好的代价评估模型
LSTM轨迹序列建模与网络结构示例
Xseq = cell(numSamples,1); % 使用元胞数组存储每个样本对应的序列输入矩阵,适应变长序列接口
Yseq = zeros(numSamples,1); % 为每个序列样本定义一个整体评分目标,用于序列级回归
seqFeat = zeros(numSeqFeat, seqLen); % 初始化序列特征矩阵,行表示特征维度,列表示时间步  
for t = 1:seqLen % 遍历每个时间步索引  
    pt = pathPts(t,:); % 读取当前时间步节点的三维坐标  
    localDist2Goal = norm(goalPos - pt); % 计算当前节点到终点的直线距离,用于表示任务完成进度  
    localDistNorm = localDist2Goal / norm(goalPos - startPos); % 对上述距离做归一化,使特征尺度统一  
end % 结束时间步特征构造循环  
Xseq{n} = seqFeat; % 将当前样本的序列特征矩阵存入元胞数组对应位置  
Yseq(n) = yScore(n); % 使用DNN训练时的目标代价作为LSTM的整体评分目标,保持评估一致性  
end % 结束LSTM训练数据构造循环
layersLSTM = [ ... % 定义LSTM网络层次结构,用于路径序列建模
sequenceInputLayer(numSeqFeat) ... % 序列输入层,接受具有指定特征维度的时间序列数据
lstmLayer(64, "OutputMode","last") ... % LSTM层,包含64个隐藏单元,仅输出最后时间步的隐藏状态
fullyConnectedLayer(32) ... % 全连接层,将LSTM输出映射到较低维特征空间
reluLayer ... % ReLU激活层,引入非线性并提升表达能力
fullyConnectedLayer(1) ... % 输出层,输出路径整体评分预测值
regressionLayer]; % 回归损失层,用于对连续评分进行监督学习
netLSTM = trainNetwork(Xseq, Yseq, layersLSTM, optsLSTM); % 使用构造好的序列特征与目标评分训练LSTM网络,得到时序评估模型
PSO迭代过程与DNN-LSTM联合评估示例
for iter = 1:maxIters % 启动PSO主循环,按最大迭代次数进行路径搜索
w = wMax - (wMax - wMin) * (iter-1)/(maxIters-1); % 使用线性递减策略更新惯性权重,逐步从探索过渡到收敛
    wpVec = pos(i,:); % 读取当前粒子的位置向量,即对应路径的中间控制点集合  
        idx = (j-1)*3 + 1; % 计算当前控制点在向量中的起始下标  
        pathPts(j+1,:) = wpVec(idx:idx+2); % 从粒子位置向量中提取中间点坐标写入路径节点矩阵  
    end % 结束中间点填充循环  
    pathPts(end,:) = goalPos; % 将终点位置写入路径节点矩阵最后一行  
    segLen = sqrt(sum(segDiff.^2,2)); % 计算路径段长度序列  
    totalLen = sum(segLen); % 计算整条路径总长度  
    zVar = var(pathPts(:,3)); % 计算路径高度变化的方差指标  
    threatCost = 0; % 初始化威胁代价累积量  
    collisionPenalty = 0; % 初始化碰撞惩罚项  
        localThreat = exp(-pt(3)/100); % 计算局部威胁指标,高度越低威胁越高  
        threatCost = threatCost + localThreat; % 将局部威胁累积到总威胁代价  
        ix = round((pt(1)-env.xMin)/gridRes)+1; % 将x坐标映射到体素栅格索引  
        iz = round((pt(3)-env.zMin)/gridRes)+1; % 将z坐标映射到体素栅格索引  
           iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引是否在合法范围内  
            end % 结束占据判断  
        localAltNorm = pt(3) / env.zMax; % 计算高度归一化值作为LSTM输入特征之一  
        localDist2Goal = norm(goalPos - pt); % 计算当前节点到终点的距离  
        localDistNorm = localDist2Goal / norm(goalPos - startPos); % 将该距离归一化,保持特征量纲一致  
        seqFeat(:,t) = [pt(1); pt(2); pt(3); localThreat; localAltNorm; localDistNorm]; % 将所有局部特征汇总成列向量写入序列矩阵  
    end % 结束路径节点循环  
    extraFeat = [totalLen, curvatureCost, zVar, threatCost, collisionPenalty]; % 构造DNN所需的额外特征向量  
    xInput = [wpVec, extraFeat]; % 将粒子位置向量与额外特征拼接形成完整DNN输入特征向量  
    costDNN = predict(netDNN, xNorm); % 使用训练好的DNN模型预测当前路径的代价值  
    costLSTM = predict(netLSTM, seqCell); % 使用训练好的LSTM网络预测路径评分值,反映时序特征影响  
    totalCost = 0.5*costDNN + 0.5*costLSTM; % 将DNN与LSTM输出按等权重加权形成综合代价,平衡静态特征与时序特征  
    if totalCost < pbestVal(i) % 若当前综合代价优于粒子历史最优适应度  
        pbestPos(i,:) = wpVec; % 更新该粒子的历史最优位置向量  
    end % 结束个体最优更新条件判断  
    if totalCost < gbestVal % 若当前综合代价优于全局历史最优适应度  
    end % 结束全局最优更新条件判断  
end % 结束粒子循环  
r1 = rand(numParticles, dim); % 为个体学习因子产生维度匹配的随机系数矩阵,引入随机性  
r2 = rand(numParticles, dim); % 为群体学习因子产生随机系数矩阵,增强搜索多样性  
pos = pos + vel; % 使用更新后的速度对粒子位置进行迭代更新,移动到新的候选路径位置  
pos = max(pos, repmat(lb, numParticles,1)); % 将超出下界的粒子位置截断到下界,保持位置合法性  
pos = min(pos, repmat(ub, numParticles,1)); % 将超出上界的粒子位置截断到上界,防止粒子飞出搜索空间  
end % 结束PSO主循环,输出最优路径结果
最优路径重构与三维可视化示例
bestWp = gbestPos; % 从PSO结果中读取最优粒子位置向量,对应最优中间控制点集合
bestPath = zeros(numWaypoints+2,3); % 为最优路径节点矩阵预分配空间,包含起点与终点
bestPath(1,:) = startPos; % 将起点坐标赋值到最优路径第一行
for j = 1:numWaypoints % 遍历中间控制点索引
idx = (j-1)*3 + 1; % 计算当前控制点在向量中的起始下标
bestPath(j+1,:) = bestWp(idx:idx+2); % 从最优向量中提取控制点坐标写入路径矩阵
end % 结束中间点重构循环
bestPath(end,:) = goalPos; % 将终点坐标赋值到最优路径矩阵最后一行
fig = figure; % 创建一个新的图窗用于三维可视化展示规划结果
ax = axes(fig); % 在图窗中创建坐标轴对象,用于绘制三维场景与轨迹
hold(ax,"on"); % 开启坐标轴的保持模式,允许叠加绘制多个图元对象
plot3(ax, bestPath(:,1), bestPath(:,2), bestPath(:,3), "b-o", "LineWidth",2); % 在三维坐标轴上绘制最优路径轨迹,用蓝色圆点连线显示节点与路径
plot3(ax, startPos(1), startPos(2), startPos(3), "go", "MarkerSize",10, "MarkerFaceColor","g"); % 使用绿色实心圆标记起点位置,便于识别
plot3(ax, goalPos(1), goalPos(2), goalPos(3), "ro", "MarkerSize",10, "MarkerFaceColor","r"); % 使用红色实心圆标记终点位置,突出目标位置
xlabel(ax,"X (m)"); % 设置x轴标签为X并注明单位米
ylabel(ax,"Y (m)"); % 设置y轴标签为Y并注明单位米
zlabel(ax,"Z (m)"); % 设置z轴标签为Z并注明单位米
axis(ax,[env.xMin env.xMax env.yMin env.yMax env.zMin env.zMax]); % 将坐标轴范围限定在环境边界范围内,匹配规划空间
grid(ax,"on"); % 打开坐标轴网格显示,便于观察三维位置关系
view(ax,3); % 设置默认三维视角,从斜上方观察三维场景
colormap(fig, turbo); % 为当前图窗设置turbo色图,满足R2025b版本关于colormap使用的规范要求
简单性能统计与路径指标输出示例
segDiffBest = diff(bestPath,1,1); % 计算最优路径相邻节点的位移向量序列
segLenBest = sqrt(sum(segDiffBest.^2,2)); % 计算最优路径各段长度并形成向量
bestTotalLen = sum(segLenBest); % 计算最优路径总长度,用作路径质量重要指标
bestCurvature = sum(vecnorm(diff(segDiffBest,1,1),2,2)); % 计算最优路径弯曲成本估计值,反映平滑程度
bestAltVar = var(bestPath(:,3)); % 计算最优路径高度变化方差,用于衡量高度起伏
iy = round((pt(2)-env.yMin)/gridRes)+1; % 将节点y坐标映射到栅格索引  
iz = round((pt(3)-env.zMin)/gridRes)+1; % 将节点z坐标映射到栅格索引  
if ix>=1 && ix<=length(env.xGrid) && ... % 检查x索引合法性  
   iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引合法性  
   iz>=1 && iz<=length(env.zGrid) % 检查z索引合法性  
    if env.occGrid(ix,iy,iz) % 若当前栅格被障碍物占据  
        bestCollisions = bestCollisions + 1; % 将碰撞计数加一,用于统计路径碰撞风险  
end % 结束边界检查  
end % 结束最优路径节点遍历

三维环境建模与基础数据结构示例

numObstacles = 5; % 设定环境中包含5个障碍物,用于初步测试场景复杂度
env.obstacles = cell(numObstacles,1); % 使用元胞数组存储各障碍物参数,便于多类型几何体扩展

for k = 1:numObstacles % 遍历每一个障碍物索引,逐个生成障碍物参数
obs.center = [200+100k, 300+50k, 50]; % 设置障碍物中心位置,随索引变化分布在场景内不同位置
obs.size = [80, 80, 150]; % 设置障碍物三维尺寸,分别对应x、y、z方向的长度
env.obstacles{k} = obs; % 将当前障碍物参数结构体存入环境结构的元胞数组位置k
end % 结束障碍物生成循环

occGrid = false(length(xGrid), length(yGrid), length(zGrid)); % 初始化体素占据矩阵,逻辑型表示是否有障碍物

for ix = 1:length(xGrid) % 遍历x方向所有栅格索引
for iy = 1:length(yGrid) % 遍历y方向所有栅格索引
for iz = 1:length(zGrid) % 遍历z方向所有栅格索引
pt = [xGrid(ix), yGrid(iy), zGrid(iz)]; % 计算当前栅格中心点三维坐标
occFlag = false; % 初始化当前栅格是否被障碍物占据的标志位
for k = 1:numObstacles % 遍历所有障碍物进行碰撞检测
obs = env.obstacles{k}; % 读取第k个障碍物参数结构体
minCorner = obs.center - obs.size/2; % 计算障碍物立方体最小角点坐标
maxCorner = obs.center + obs.size/2; % 计算障碍物立方体最大角点坐标
if all(pt >= minCorner) && all(pt <= maxCorner) % 判断当前栅格点是否落在障碍物立方体内部
occFlag = true; % 若在内部则将占据标志设为真
break; % 已确定被占据,无需继续检查其他障碍物
end % 结束位置判断条件
end % 结束障碍物循环
occGrid(ix,iy,iz) = occFlag; % 将当前栅格的占据状态写入体素矩阵
end % 结束z方向遍历
end % 结束y方向遍历
end % 结束x方向遍历

env.xGrid = xGrid; % 将x方向栅格坐标向量存入环境结构体,方便后续查询映射
env.yGrid = yGrid; % 将y方向栅格坐标向量存入环境结构体
env.zGrid = zGrid; % 将z方向栅格坐标向量存入环境结构体
env.occGrid = occGrid; % 将构建好的三维占据栅格矩阵存入环境结构体

startPos = [50, 50, 30]; % 设置无人机起始位置坐标,位于环境空间一侧低空处
goalPos = [900, 900, 80]; % 设置无人机目标位置坐标,位于环境空间另一侧适中高度处

路径编码与PSO粒子初始化示例

numParticles = 40; % 设置粒子群规模为40,兼顾搜索能力与计算量
maxIters = 80; % 设置PSO最大迭代次数,控制规划循环长度

lb = repmat([env.xMin, env.yMin, env.zMin], 1, numWaypoints); % 为所有中间点构建位置下界向量,保证落在环境内
ub = repmat([env.xMax, env.yMax, env.zMax], 1, numWaypoints); % 为所有中间点构建位置上界向量,对应空间边界上限

pos = rand(numParticles, dim); % 生成粒子位置的随机初始矩阵,范围在0到1之间
pos = pos .* (ub - lb) + lb; % 将随机矩阵按上下界缩放平移,使每个粒子位置落入合法空间范围

vel = zeros(numParticles, dim); % 初始化粒子速度矩阵为零,后续根据更新规则逐步形成速度分布

pbestPos = pos; % 初始化个体最优位置为当前随机位置,后续若适应度提高会更新
pbestVal = inf(numParticles,1); % 初始化个体最优适应度为正无穷,用于比较最小代价路径

gbestPos = zeros(1,dim); % 初始化群体最优位置向量,初始为空值占位
gbestVal = inf; % 初始化群体最优适应度为正无穷,表示尚未找到任何有效候选路径

wMax = 0.9; % 设置惯性权重最大值,用于搜索早期较强的探索能力
wMin = 0.4; % 设置惯性权重最小值,用于搜索后期提高收敛稳定性
c1 = 1.8; % 设置个体学习因子权重,引导粒子向自身历史最优收敛
c2 = 1.8; % 设置群体学习因子权重,引导粒子向全局历史最优收敛

numSamples = 200; % 设置用于训练DNN的样本数量,用于构建代价近似模型
Xfeat = zeros(numSamples, dim + 5); % 为输入特征矩阵预分配空间,包含路径控制点与额外5个统计特征
yScore = zeros(numSamples,1); % 为目标评分向量预分配空间,对应每条样本路径的综合成本

for n = 1:numSamples % 遍历每个样本索引,逐个构造训练样本
wpVec = rand(1,dim) .* (ub - lb) + lb; % 随机生成一条样本路径的中间控制点向量,保证在边界内
pathPts = zeros(numWaypoints+2,3); % 为包含起点和终点在内的路径节点矩阵预分配空间
pathPts(1,:) = startPos; % 将路径起点位置赋值到节点矩阵第一行
for j = 1:numWaypoints % 遍历中间控制点索引
idx = (j-1)*3 + 1; % 计算当前中间点x坐标在向量中的起始下标
pathPts(j+1,:) = wpVec(idx:idx+2); % 从向量中提取该中间点的三维坐标写入节点矩阵
end % 结束中间点循环
pathPts(end,:) = goalPos; % 将路径终点位置赋值到节点矩阵最后一行

segDiff = diff(pathPts,1,1); % 计算相邻节点之间的位置差,用于估算段距离与方向变换  
segLen = sqrt(sum(segDiff.^2,2)); % 计算每个路径段向量的欧式长度,得到路径段长度序列  
totalLen = sum(segLen); % 计算整条路径的总长度作为能耗与时间估计的基础指标  
curvatureCost = sum(vecnorm(diff(segDiff,1,1),2,2)); % 通过相邻段向量差的范数和,对路径弯曲程度进行粗略衡量  
zVar = var(pathPts(:,3)); % 计算路径高度序列的方差,用于衡量爬升下降起伏程度  
threatCost = 0; % 初始化威胁代价累积量,后续在每个节点处累积  
    pt = pathPts(j,:); % 读取当前节点三维坐标  
    threatLevel = exp(-pt(3)/100); % 使用高度的指数衰减函数构造一个简化威胁水平示例,高度越低威胁越高  
    threatCost = threatCost + threatLevel; % 将当前节点威胁水平累积到总威胁代价中  
collisionPenalty = 0; % 初始化碰撞惩罚项,若路径穿越障碍物则叠加惩罚  
for j = 1:size(pathPts,1) % 遍历路径所有节点索引进行碰撞检测  
    pt = pathPts(j,:); % 读取当前节点坐标  
    ix = round((pt(1)-env.xMin)/gridRes)+1; % 将x坐标映射为体素栅格x索引  
    iy = round((pt(2)-env.yMin)/gridRes)+1; % 将y坐标映射为体素栅格y索引  
    iz = round((pt(3)-env.zMin)/gridRes)+1; % 将z坐标映射为体素栅格z索引  
    if ix>=1 && ix<=length(env.xGrid) && ... % 检查x索引是否在体素矩阵合法范围内  
       iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引是否在体素矩阵合法范围内  
       iz>=1 && iz<=length(env.zGrid) % 检查z索引是否在体素矩阵合法范围内  
        if env.occGrid(ix,iy,iz) % 若当前栅格被标记为障碍物占据  
            collisionPenalty = collisionPenalty + 1e4; % 累积一个较大的惩罚项,用于强制避障  
        end % 结束占据判断  
    end % 结束边界检查  
end % 结束碰撞检测循环  
totalCost = totalLen + 0.5*curvatureCost + 20*zVar + threatCost + collisionPenalty; % 将各成本项按权重合成为综合代价值  
extraFeat = [totalLen, curvatureCost, zVar, threatCost, collisionPenalty]; % 将统计特征组合成额外特征向量,用于DNN输入补充  
yScore(n) = totalCost; % 将对应的综合代价写入目标评分向量对应位置  

end % 结束训练样本生成循环

Xmu = mean(Xfeat,1); % 计算输入特征矩阵每一列的均值,用于特征归一化中心化
Xsigma = std(Xfeat,0,1) + 1e-6; % 计算输入特征矩阵每一列的标准差并加入微小值,避免零方差导致除零错误
Xnorm = (Xfeat - Xmu) ./ Xsigma; % 对输入特征进行标准化处理,提高网络训练稳定性

numFeat = size(Xnorm,2); % 获取归一化后输入特征的维度,用作网络输入层节点数量参考

layersDNN = [ ... % 定义DNN网络层结构数组,使用序列网络形式
featureInputLayer(numFeat) ... % 特征输入层,接受指定维度的向量输入
fullyConnectedLayer(64) ... % 第一隐藏层,包含64个神经元,用于初步非线性映射
reluLayer ... % ReLU激活层,引入非线性并缓解梯度消失问题
fullyConnectedLayer(64) ... % 第二隐藏层,进一步提取高阶特征
reluLayer ... % 再一次使用ReLU激活以增强表达能力
fullyConnectedLayer(32) ... % 第三隐藏层,降低维度并压缩特征
reluLayer ... % 激活层继续引入非线性变化
fullyConnectedLayer(1) ... % 输出层,输出单一标量作为路径代价预测值
regressionLayer]; % 回归损失层,用于对连续目标值进行回归学习

optsDNN = trainingOptions("adam", ... % 使用Adam优化算法训练网络,适合中小规模回归任务
"MaxEpochs", 50, ... % 设置最大训练轮数为50,在训练数据规模下进行多轮迭代收敛
"MiniBatchSize", 32, ... % 设置每一训练小批量包含32个样本,提升训练效率与稳定性
"InitialLearnRate", 1e-3, ... % 设置初始学习率为0.001,在收敛速度与稳定性之间折中
"Verbose", false); % 关闭详细训练过程输出,避免命令行过度信息干扰

netDNN = trainNetwork(Xnorm, yScore, layersDNN, optsDNN); % 使用标准化特征和目标代价训练DNN网络,得到拟合好的代价评估模型

LSTM轨迹序列建模与网络结构示例

Xseq = cell(numSamples,1); % 使用元胞数组存储每个样本对应的序列输入矩阵,适应变长序列接口
Yseq = zeros(numSamples,1); % 为每个序列样本定义一个整体评分目标,用于序列级回归

seqFeat = zeros(numSeqFeat, seqLen); % 初始化序列特征矩阵,行表示特征维度,列表示时间步  
for t = 1:seqLen % 遍历每个时间步索引  
    pt = pathPts(t,:); % 读取当前时间步节点的三维坐标  
    localDist2Goal = norm(goalPos - pt); % 计算当前节点到终点的直线距离,用于表示任务完成进度  
    localDistNorm = localDist2Goal / norm(goalPos - startPos); % 对上述距离做归一化,使特征尺度统一  
end % 结束时间步特征构造循环  
Xseq{n} = seqFeat; % 将当前样本的序列特征矩阵存入元胞数组对应位置  
Yseq(n) = yScore(n); % 使用DNN训练时的目标代价作为LSTM的整体评分目标,保持评估一致性  

end % 结束LSTM训练数据构造循环

layersLSTM = [ ... % 定义LSTM网络层次结构,用于路径序列建模
sequenceInputLayer(numSeqFeat) ... % 序列输入层,接受具有指定特征维度的时间序列数据
lstmLayer(64, "OutputMode","last") ... % LSTM层,包含64个隐藏单元,仅输出最后时间步的隐藏状态
fullyConnectedLayer(32) ... % 全连接层,将LSTM输出映射到较低维特征空间
reluLayer ... % ReLU激活层,引入非线性并提升表达能力
fullyConnectedLayer(1) ... % 输出层,输出路径整体评分预测值
regressionLayer]; % 回归损失层,用于对连续评分进行监督学习

netLSTM = trainNetwork(Xseq, Yseq, layersLSTM, optsLSTM); % 使用构造好的序列特征与目标评分训练LSTM网络,得到时序评估模型

PSO迭代过程与DNN-LSTM联合评估示例

for iter = 1:maxIters % 启动PSO主循环,按最大迭代次数进行路径搜索
w = wMax - (wMax - wMin) * (iter-1)/(maxIters-1); % 使用线性递减策略更新惯性权重,逐步从探索过渡到收敛

    wpVec = pos(i,:); % 读取当前粒子的位置向量,即对应路径的中间控制点集合  
        idx = (j-1)*3 + 1; % 计算当前控制点在向量中的起始下标  
        pathPts(j+1,:) = wpVec(idx:idx+2); % 从粒子位置向量中提取中间点坐标写入路径节点矩阵  
    end % 结束中间点填充循环  
    pathPts(end,:) = goalPos; % 将终点位置写入路径节点矩阵最后一行  
    segLen = sqrt(sum(segDiff.^2,2)); % 计算路径段长度序列  
    totalLen = sum(segLen); % 计算整条路径总长度  
    zVar = var(pathPts(:,3)); % 计算路径高度变化的方差指标  
    threatCost = 0; % 初始化威胁代价累积量  
    collisionPenalty = 0; % 初始化碰撞惩罚项  
        localThreat = exp(-pt(3)/100); % 计算局部威胁指标,高度越低威胁越高  
        threatCost = threatCost + localThreat; % 将局部威胁累积到总威胁代价  
        ix = round((pt(1)-env.xMin)/gridRes)+1; % 将x坐标映射到体素栅格索引  
        iz = round((pt(3)-env.zMin)/gridRes)+1; % 将z坐标映射到体素栅格索引  
           iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引是否在合法范围内  
            end % 结束占据判断  
        localAltNorm = pt(3) / env.zMax; % 计算高度归一化值作为LSTM输入特征之一  
        localDist2Goal = norm(goalPos - pt); % 计算当前节点到终点的距离  
        localDistNorm = localDist2Goal / norm(goalPos - startPos); % 将该距离归一化,保持特征量纲一致  
        seqFeat(:,t) = [pt(1); pt(2); pt(3); localThreat; localAltNorm; localDistNorm]; % 将所有局部特征汇总成列向量写入序列矩阵  
    end % 结束路径节点循环  
    extraFeat = [totalLen, curvatureCost, zVar, threatCost, collisionPenalty]; % 构造DNN所需的额外特征向量  
    xInput = [wpVec, extraFeat]; % 将粒子位置向量与额外特征拼接形成完整DNN输入特征向量  
    costDNN = predict(netDNN, xNorm); % 使用训练好的DNN模型预测当前路径的代价值  
    costLSTM = predict(netLSTM, seqCell); % 使用训练好的LSTM网络预测路径评分值,反映时序特征影响  
    totalCost = 0.5*costDNN + 0.5*costLSTM; % 将DNN与LSTM输出按等权重加权形成综合代价,平衡静态特征与时序特征  
    if totalCost < pbestVal(i) % 若当前综合代价优于粒子历史最优适应度  
        pbestPos(i,:) = wpVec; % 更新该粒子的历史最优位置向量  
    end % 结束个体最优更新条件判断  
    if totalCost < gbestVal % 若当前综合代价优于全局历史最优适应度  
    end % 结束全局最优更新条件判断  
end % 结束粒子循环  
r1 = rand(numParticles, dim); % 为个体学习因子产生维度匹配的随机系数矩阵,引入随机性  
r2 = rand(numParticles, dim); % 为群体学习因子产生随机系数矩阵,增强搜索多样性  
pos = pos + vel; % 使用更新后的速度对粒子位置进行迭代更新,移动到新的候选路径位置  
pos = max(pos, repmat(lb, numParticles,1)); % 将超出下界的粒子位置截断到下界,保持位置合法性  
pos = min(pos, repmat(ub, numParticles,1)); % 将超出上界的粒子位置截断到上界,防止粒子飞出搜索空间  

end % 结束PSO主循环,输出最优路径结果

最优路径重构与三维可视化示例

bestWp = gbestPos; % 从PSO结果中读取最优粒子位置向量,对应最优中间控制点集合

bestPath = zeros(numWaypoints+2,3); % 为最优路径节点矩阵预分配空间,包含起点与终点
bestPath(1,:) = startPos; % 将起点坐标赋值到最优路径第一行
for j = 1:numWaypoints % 遍历中间控制点索引
idx = (j-1)*3 + 1; % 计算当前控制点在向量中的起始下标
bestPath(j+1,:) = bestWp(idx:idx+2); % 从最优向量中提取控制点坐标写入路径矩阵
end % 结束中间点重构循环
bestPath(end,:) = goalPos; % 将终点坐标赋值到最优路径矩阵最后一行

fig = figure; % 创建一个新的图窗用于三维可视化展示规划结果
ax = axes(fig); % 在图窗中创建坐标轴对象,用于绘制三维场景与轨迹
hold(ax,"on"); % 开启坐标轴的保持模式,允许叠加绘制多个图元对象

plot3(ax, bestPath(:,1), bestPath(:,2), bestPath(:,3), "b-o", "LineWidth",2); % 在三维坐标轴上绘制最优路径轨迹,用蓝色圆点连线显示节点与路径

plot3(ax, startPos(1), startPos(2), startPos(3), "go", "MarkerSize",10, "MarkerFaceColor","g"); % 使用绿色实心圆标记起点位置,便于识别

plot3(ax, goalPos(1), goalPos(2), goalPos(3), "ro", "MarkerSize",10, "MarkerFaceColor","r"); % 使用红色实心圆标记终点位置,突出目标位置

xlabel(ax,"X (m)"); % 设置x轴标签为X并注明单位米
ylabel(ax,"Y (m)"); % 设置y轴标签为Y并注明单位米
zlabel(ax,"Z (m)"); % 设置z轴标签为Z并注明单位米

axis(ax,[env.xMin env.xMax env.yMin env.yMax env.zMin env.zMax]); % 将坐标轴范围限定在环境边界范围内,匹配规划空间

grid(ax,"on"); % 打开坐标轴网格显示,便于观察三维位置关系
view(ax,3); % 设置默认三维视角,从斜上方观察三维场景

colormap(fig, turbo); % 为当前图窗设置turbo色图,满足R2025b版本关于colormap使用的规范要求

简单性能统计与路径指标输出示例

segDiffBest = diff(bestPath,1,1); % 计算最优路径相邻节点的位移向量序列
segLenBest = sqrt(sum(segDiffBest.^2,2)); % 计算最优路径各段长度并形成向量

bestTotalLen = sum(segLenBest); % 计算最优路径总长度,用作路径质量重要指标

bestCurvature = sum(vecnorm(diff(segDiffBest,1,1),2,2)); % 计算最优路径弯曲成本估计值,反映平滑程度

bestAltVar = var(bestPath(:,3)); % 计算最优路径高度变化方差,用于衡量高度起伏

iy = round((pt(2)-env.yMin)/gridRes)+1; % 将节点y坐标映射到栅格索引  
iz = round((pt(3)-env.zMin)/gridRes)+1; % 将节点z坐标映射到栅格索引  
if ix>=1 && ix<=length(env.xGrid) && ... % 检查x索引合法性  
   iy>=1 && iy<=length(env.yGrid) && ... % 检查y索引合法性  
   iz>=1 && iz<=length(env.zGrid) % 检查z索引合法性  
    if env.occGrid(ix,iy,iz) % 若当前栅格被障碍物占据  
        bestCollisions = bestCollisions + 1; % 将碰撞计数加一,用于统计路径碰撞风险  
end % 结束边界检查  

end % 结束最优路径节点遍历

更多详细内容请访问

http://【无人机路径规划】MATLAB实现基于PSO-DNN-LSTM粒子群优化算法(PSO)结合深度神经网络(DNN)与长短期记忆网络(LSTM)进行无人机三维路径规划的详细项目实例(含完整的程序,GU_时间序列预测GUI设计资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90259202

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

http:// https://download.csdn.net/download/xiaoxingkongyuxi/90259202

 

Logo

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

更多推荐