项目介绍 MATLAB实现基于ACO-DNN 蚁群算法(ACO)结合深度神经网络(DNN)进行无人机三维路径规划(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励
MATLAB实现基于ACO-DNN 蚁群算法(ACO)结合深度神经网络(DNN)进行无人机三维路径规划的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
在现代智能化战场环境与民用复杂空域管理需求持续提升的驱动下,三维空间中的无人机路径规划正逐渐从理论研究走向工程落地。从早期仅关注平面航迹长度最短,到当前综合考虑避障安全、能源消耗、任务时效、通信链路稳定性以及编队协同等多目标约束,三维路径规划问题已经演变为一个高度复杂的非线性、强约束、带有不确定性的优化难题。传统的规则规划方法、栅格搜索方法以及基于图论的经典算法(如Dijkstra、A*等),在高维连续空间、多障碍密集场景以及实时性要求较高的任务中往往会遇到计算复杂度高、易陷入局部最优或难以适应动态环境变化等问题。
蚁群算法作为典型的群智能优化方法,具有自组织、自适应、分布式协同等特性,通过模拟自然界蚂蚁在觅食过程中通过信息素进行间接通信、逐步收敛到最优路径的行为,对求解路径优化和组合优化问题表现出良好的全局搜索能力。其核心思想在于通过信息素的累积与挥发,实现集体智慧下的“优胜劣汰”:优质路径获得更多信息素强化,从而在后续迭代中被更高概率地选择。然而,在复杂三维空间中的无人机路径规划场景中,蚁群算法仍然存在收敛速度较慢、参数敏感、在高维连续空间中离散化精度与计算量之间难以平衡等问题。单纯依靠蚁群算法往往很难兼顾规划精度、计算效率与实时响应能力。
深度神经网络在高维非线性函数拟合、特征抽取及复杂模式学习方面具有显著优势,特别是在大量历史数据和仿真数据支撑下,能够从环境特征、障碍物分布、任务约束以及已有最优/次优路径中自动学习隐含规律,构建端到端或中间特征驱动的路径生成模型。与传统启发式函数或人工经验规则相比,深度神经网络可以通过大规模数据训练,获得更加鲁棒、泛化能力更强的策略表达形式。然而,深度神经网络也存在训练数据需求大、可解释性有限、容易陷入局部收敛点等问题,单独使用时在面对高度约束的安全飞行规则与实时性要求时也可能表现不稳定。
基于蚁群算法与深度神经网络的互补特点,将蚁群算法与深度神经网络进行深度融合,可以形成一种兼具全局搜索与局部精调能力的混合智能规划框架。蚁群算法侧重在三维路径空间中进行启发式全局搜索,快速探索多种候选航路,并通过信息素的迭代更新不断强化优质路径;深度神经网络则在充分利用这些候选路径及环境特征的基础上,通过监督学习或强化学习对路径代价分布进行建模,从而为蚁群算法提供更精确的启发信息、路径质量预测或搜索策略调整,实现“数据驱动 + 群体智能”的协同优化模式。
在三维无人机路径规划任务中,环境通常包含地形起伏结构、建筑物障碍、禁飞区、雷达覆盖范围以及动态威胁源等多种因素。路径规划需要同时考虑飞行器的动力学约束(如最大爬升角、最大转弯半径、速度范围)、能源约束(电池容量或燃油限制)、通信链路约束以及任务相关约束(到达时间窗、任务优先级等)。在这种背景下,基于蚁群算法与深度神经网络的三维路径规划框架可以发挥多方面优势:一方面,蚁群算法通过在离散化三维网格或航点集合上进行搜索,快速给出可行解并持续优化;另一方面,深度神经网络则通过学习复杂任务场景的高维特征,把环境状态映射为路径质量估计或下一步动作选择概率,帮助蚁群在搜索过程中更快收敛到高质量解。
MATLAB作为工程计算和算法验证的重要平台,具备丰富的数值计算工具箱、可视化工具以及深度学习与优化相关工具箱,非常适合用于快速搭建蚁群算法与深度神经网络混合模型的原型系统。在此基础上,可以构建三维仿真环境,定义障碍物体积、无人机飞行区域、代价函数等,并基于蚁群算法进行路径搜索,再通过深度神经网络对路径评价、搜索策略或节点选择概率进行学习优化。通过反复仿真与数据积累,在MATLAB环境中形成可扩展、可视化、易于调参的算法开发与验证平台,为无人机实际任务部署提供可靠的工程算法基础。
本项目将围绕基于蚁群算法与深度神经网络的三维无人机路径规划问题,在MATLAB R2025b环境中构建一个可运行、可扩展的算法框架,包括环境建模、蚁群路径搜索、DNN结构设计及训练、ACO与DNN的耦合机制以及三维可视化等模块,旨在为无人机三维路径规划领域提供一套具有工程可操作性与理论创新性的实现参考。
项目目标与意义
提升三维复杂环境中的路径规划性能
三维无人机路径规划面临环境维度高、障碍物类型多样、约束条件复杂等特征,仅依赖传统算法往往难以兼顾计算效率和规划质量。本项目以构建蚁群算法与深度神经网络融合的三维路径规划框架为核心目标,重点提升在复杂环境下的路径可行性、安全性和综合代价优化能力。通过在三维空间中引入合理的节点离散策略、路径代价函数设计以及多约束检查机制,使得规划结果不仅在路径长度上具有优势,同时能更好地满足避障、能耗和平滑性等综合要求。藉由蚁群算法的全局搜索优势,结合深度神经网络对环境特征与路径质量的学习能力,可以在较短迭代过程中找到更接近全局最优的三维航迹。项目目标之一在于在MATLAB R2025b平台上构建可重复、可调参的实验环境,通过多场景对比实验验证融合算法相对于单独使用蚁群算法或常规启发式方法在收敛速度、路径质量和鲁棒性方面的优势,从而为无人机系统在复杂环境执行任务提供更可靠的路径规划算法支撑。
构建ACO与DNN协同优化的通用框架
群体智能算法与深度学习算法的融合不仅适用于无人机路径规划,在诸多组合优化与连续优化领域也具有广泛潜力。本项目在路径规划任务背景下搭建一个具有通用结构的ACO-DNN协同优化框架,目标是探索如何利用深度神经网络学习蚁群搜索中蕴含的经验信息,将传统依赖人工设定的启发函数转变为数据驱动的策略,从而构建可迁移、可扩展的智能优化模式。在框架中,蚁群算法负责产生多样化路径样本,深度神经网络负责对路径质量、环境状态与节点间转移关系进行拟合推断,实现“搜索生成—数据学习—策略反哺”的闭环。通过对这种协同模式的结构化设计和MATLAB实现,可以为后续在物流路径优化、多机器人协作规划、复杂网络路由等问题中的算法迁移提供范式支持,体现项目在方法论层面的重要意义。
为工程应用提供可实现的MATLAB算法参考
理论算法需要在工程环境中具备可实现性和可调试性才能真正发挥价值。本项目在MATLAB R2025b环境中给出完整可运行的三维路径规划实例,实现从环境建模、蚁群初始化、路径搜索、深度神经网络设计与训练、融合策略更新到结果可视化的端到端流程。目标在于为研究者、工程技术人员提供一个结构清晰、模块划分明确的参考实现,便于在此基础上进行参数调整、模块替换或与其他算法比较。通过完整的MATLAB脚本实现,将关键部分的核心代码与注释紧密结合,降低理解与二次开发门槛,使项目成果不仅停留在理论方案层面,还能够实际运行和验证,为未来扩展到更大规模环境、更复杂约束条件或者多无人机协同规划等方向打下坚实基础。
推动智能规划算法在无人系统领域的应用与发展
无人机及其他无人系统在智能交通、应急救援、环境监测、安防巡逻、军事侦察与打击等领域应用日益广泛,而路径规划算法作为任务执行的基础模块,其性能直接影响任务成功率与安全性。本项目通过研究蚁群算法与深度神经网络融合的三维路径规划方案,在理论层面探索数据驱动与群体智能结合的优势,在工程层面给出MATLAB实现范例,为无人系统领域的智能规划算法应用与推广提供可行路径。项目的实施有助于推动智能规划相关技术在实际工程项目中的落地,例如通过对地形数据和任务数据的集成,实现针对具体任务场景的定制化路径规划模块;同时,通过对算法性能的对比评估,为后续在嵌入式平台或机载计算平台上的移植提供算法裁剪和优化参考,促进无人系统整体智能水平的提升。
项目挑战及解决方案
三维环境建模与路径约束表达的复杂性
三维无人机路径规划首先需要解决的问题是对环境进行合理建模与对路径约束进行准确表达。这一过程中,三维空间范围、障碍物形状和位置、禁飞区以及地形高度等信息需要以合适的数据结构进行统一表示。在工程实践中,环境数据通常来自数字高程模型、建筑物三维模型或雷达探测数据等原始信息,具有数据量大、格式多样、精度不一致等特点。在MATLAB中进行三维环境建模时,既要考虑模型精细度对路径精度的影响,又要兼顾计算负担和算法实时性,如何在网格分辨率与计算复杂度之间建立合理平衡是一项重要挑战。同时,无人机的动力学和任务约束,如最大爬升角、最大倾斜角、速度范围、转弯半径以及飞行高度限制等,都必须在路径规划过程中得到满足,否则即便路径在几何上可行,也可能在实际飞行中无法执行。
针对上述挑战,解决方案是在MATLAB中将三维空间离散为规则网格或非规则节点图,同时引入高度、障碍物占据标记、禁飞标志等属性,为每个网格或节点定义可行性状态与代价权重。通过合理选择网格尺寸,保证在典型任务区域内既能覆盖地形细节,又避免过度细分导致计算时间过长。在路径约束表达方面,通过在代价函数中显式加入高度变化惩罚、急转弯惩罚以及接近障碍物距离惩罚等项,将动力学约束与安全边界转化为路径代价优化问题中的软约束项,借助蚁群算法的路径搜索过程自然规避不符合约束的路径。对于硬约束,如进入禁飞区或超出飞行高度上限,可以在路径构造过程中进行实时检测,一旦违反约束立即将该路径标记为不可行或给予极大代价,从而在迭代过程中逐步排除不合理方案。通过这种建模方式,三维环境复杂性被压缩到可控数据结构中,便于与蚁群算法、深度神经网络模块进行耦合,实现统一的规划框架。
蚁群算法收敛速度与参数敏感性问题
蚁群算法在路径规划中的优势在于其全局搜索能力和分布式并行搜索机制,但在实际应用中常面临收敛速度较慢、参数选择敏感等问题。信息素挥发系数、启发因子权重、信息素重要性系数、蚂蚁数量以及迭代次数等参数,对算法性能影响显著。如果信息素挥发太快,全局记忆作用弱,算法可能在搜索过程中难以积累有效经验;反之,如果挥发太慢,则早期较差路径可能被过度强化,导致搜索过早收敛在局部最优。蚂蚁数量与迭代次数的设定需要在搜索质量与计算时间之间取得平衡,盲目增加蚂蚁数量可能导致计算代价迅速提升,尤其是在三维环境网格较密、候选节点数较大时。因此,如何提高蚁群算法在三维路径规划中的收敛效率、降低对人工调参的依赖,是项目中的一项关键挑战。
为此,融合深度神经网络的策略提供了有力解决方案。在项目框架中,深度神经网络通过学习过去迭代中产生的大量路径数据和环境特征,对路径代价与节点转移概率进行预测,从而为蚁群提供数据驱动的启发信息。具体而言,可以构建一个以当前节点与目标位置、周围障碍物距离等特征为输入,以转移到各邻接节点的优劣评估或路径代价估计为输出的网络结构。在蚁群构造路径时,不再完全依赖传统的距离启发函数,而是在信息素引导基础上引入DNN输出的动态启发权重,使蚂蚁在搜索过程中更倾向于选择DNN评估为潜在较优的方向,从而缩短收敛时间并降低对人工设定参数的敏感性。随着迭代进行,蚁群产生新的路径样本,再喂入深度网络进行持续训练,形成自适应的协同优化过程。通过这种方式,蚁群算法的参数可以在较宽范围内保持稳定性能,收敛过程也更为高效。
深度神经网络训练数据构建与泛化能力保障
深度神经网络的表现高度依赖训练数据的质量和多样性,在三维无人机路径规划问题中,训练数据既需要包含丰富的环境场景,也需要包含多种质量层次的路径样本,以便网络正确学习环境状态与路径优劣之间的映射关系。如果训练数据过于单一,例如仅来源于某一类地形或障碍布局,网络在面对新的任务场景时可能出现泛化能力不足的问题,表现为对新环境下的路径质量预测不准确,甚至引导蚁群算法走向不良搜索方向。另外,路径规划问题往往具有多目标特征,如路径长度、能耗、安全性之间存在权衡关系,如何在网络输出中合理表达这些多目标信息,并使网络学习到符合任务需求的综合评价标准,也是项目中需要解决的难点。再加上MATLAB环境中深度学习工具箱对网络训练的配置与调参,如何在保证训练收敛的前提下避免过拟合同样需要精心设计。
本项目中,通过在仿真环境中自动生成多种随机障碍布局、不同起止点组合以及不同任务权重配置的场景,构建多样化训练数据集。蚁群算法在这些场景下运行,产生多批次路径样本,并记录每条路径的综合代价,然后将路径特征(包括节点坐标序列、路径长度、与障碍距离统计特征等)及其代价作为监督学习的训练对。深度神经网络采用相对简洁且容易在MATLAB R2025b中实现的多层前馈网络结构,使用标准的均方误差或自定义的多目标加权损失函数进行训练。为提升泛化能力,在数据构建阶段引入场景随机化与路径扰动策略,使网络在训练中见到尽可能多的环境变化组合;在训练过程中通过划分训练集与验证集、早停策略以及合适的正则化参数控制网络复杂度,降低过拟合风险。通过这样的训练数据与网络设计,能够有效提升深度神经网络在不同环境和任务配置下的泛化能力,为蚁群算法提供稳定可靠的启发信息,使整个ACO-DNN路径规划框架在多场景下保持较好性能。
项目模型架构
整体框架结构
ACO-DNN三维无人机路径规划模型由环境建模模块、蚁群路径搜索模块、深度神经网络评估模块、ACO-DNN耦合模块以及结果分析与可视化模块构成,形成从场景输入到路径输出的完整流程。整体框架的运行逻辑是:首先在三维空间中构建包含障碍物、禁飞区、飞行边界等信息的环境模型,并给出起点和终点位置;随后利用蚁群算法在离散化的三维节点或网格之间进行多代迭代搜索,每代由多只蚂蚁根据信息素和启发信息构造完整路径;在搜索过程中,记录路径代价与环境特征,同时将这些信息累积形成训练数据;深度神经网络模块对这些数据进行训练或在线更新,学习环境配置与路径质量之间的映射关系;在后续迭代中,蚁群路径搜索模块在信息素导向的基础上参考DNN提供的节点转移评估或路径延伸优先级,对搜索策略进行动态调整,实现基于数据驱动的搜索加速;最后,通过可视化模块展示三维路径、障碍物分布及信息素分布演化情况,进行路径质量分析与算法性能评估。
整体架构中,各模块之间通过明确的数据接口进行连接。例如,环境建模模块输出包含节点坐标、邻接关系、障碍物标记、禁飞标记等内容的结构体;蚁群模块根据该结构体进行路径搜索,同时生成路径序列与代价;深度神经网络模块输入路径序列和环境特征,输出路径代价估计或节点转移评分;ACO-DNN耦合模块则将DNN输出注入到蚁群的状态转移概率计算或信息素更新规则中,从而实现搜索策略的自适应优化。通过这种模块化设计,框架可以方便地替换或扩展个别模块,例如更换不同类型深度网络、引入其他群智能算法进行对比,具有较强的扩展性和可维护性。
三维环境建模与网格离散策略
在三维路径规划模型中,环境建模是基础环节。三维空间可以使用规则栅格(Voxel)或节点图的形式进行离散。规则网格方法中,将飞行区域划分为等间距立方体小块,每个体素中心点作为候选导航节点,通过检查体素是否与障碍物或禁飞区重叠来判断节点可行性,并为每个节点存储坐标、可行标记以及代价权重。节点图方法则可以基于地形特征或人为设定在空间中布置离散航点,增加在路径规划中的灵活性。考虑到实现复杂度与可视化需求,项目中采用规则三维网格为主的建模方式,通过设置合理的网格步长在精度与计算复杂度之间取得平衡。
在MATLAB R2025b中,可使用三维矩阵或结构数组来存储网格信息。例如,用三维逻辑矩阵标记障碍物占用情况,用三维数值矩阵存储高度或代价系数,用一个节点列表记录所有可行节点的索引及其坐标。邻接关系可以通过在每个可行节点周围查找上下左右前后以及对角方向可行节点建立。路径规划过程中,蚁群算法在这些节点之间进行状态转移。为了避免路径在障碍物边缘过于紧贴,可以为接近障碍物一定距离范围内的节点设置较高代价权重,使蚂蚁倾向于走远离障碍物的安全通道。此外,起点与终点可以根据实际飞行任务所在坐标映射到邻近的可行节点,作为蚁群路径搜索的起始和终止节点。通过这种建模方式,三维环境以规则结构体形式被送入后续算法模块,既便于计算又便于可视化展示。
蚁群算法路径搜索机制
蚁群算法在路径规划中的基本原理为:在离散节点图上,模拟多只蚂蚁从起点出发,通过不断选择下一节点最终到达终点,每条蚂蚁构造一条完整路径;路径构造过程中,每次选择下一个候选节点时,利用信息素浓度与启发信息(如距离终点的估计、环境代价评估等)计算转移概率,采用轮盘赌等方式进行随机选择。完成路径构造后,根据路径质量(综合代价)对路径上经过的边或节点进行信息素更新,高质量路径得到更多信息素强化,从而在下一代迭代中更容易被选择。信息素挥发机制则防止历史信息长时间过度累积,保证算法在搜索过程中保留一定的探索能力,避免过早陷入局部最优。
在三维节点图中,蚂蚁的状态空间更加庞大,节点邻接度可能高于二维情况。因此,路径搜索机制中除了传统的距离与信息素,还需要引入多种约束信息。例如在状态转移时,对已经访问过的节点设定访问次数限制,以避免路径出现无意义的循环;对路径长度超过一定阈值的构造过程可以中止,并给予较大惩罚;对接近障碍物区域的节点在启发信息中加入负面权重,以减少不安全路径的产生。在信息素更新方面,可采用 elitist 策略,即只允许若干条最优路径或全局最优路径参与信息素强化,以提高收敛效率。通过在MATLAB中使用矩阵与向量化运算实现路径代价计算和信息素更新,可在一定程度上降低计算时间,提高算法的整体性能。
深度神经网络结构与功能定位
深度神经网络在模型架构中主要承担对路径质量和节点转移策略的预测与评估任务。为了与蚁群算法的离散路径构造过程匹配,网络输入可以设计为当前节点与目标节点的相对位置、当前节点周围环境的局部特征(如邻域障碍物密度、相对高度差)、历史路径统计信息(如已走路径长度、接近障碍物的程度统计)等,通过这些特征描述当前路径状态与环境局部结构。网络输出则可以是对各候选下一节点的综合评分,或者是对当前部分路径完扩展到终点的预测代价。在实际实现中,为方便在MATLAB R2025b中直接使用深度学习工具箱,可采用多层全连接前馈网络结构,以ReLU或其他常见激活函数为主,避免使用该版本中不支持的高级网络层。
网络训练可采用监督学习方式,即将蚁群在不同环境中得到的路径样本作为训练数据,将路径或局部决策与真实代价作为监督信号。网络损失函数可以是预测代价与真实代价之间的均方误差,也可以是带权重的多目标损失函数。训练完成后,在路径规划过程中,通过神经网络预测当前节点在各候选方向的代价或优劣评分,将这些预测值转化成启发信息,引入蚁群状态转移概率计算中,使蚂蚁在搜索过程中更倾向于选择通过DNN评估为更优的节点。通过迭代引入新样本并持续训练,可实现对DNN的在线或离线更新,使网络逐步适应新的环境分布与任务要求。
ACO与DNN协同优化与MATLAB实现要点
ACO与DNN协同优化的关键在于信息交互机制的设计与实现,即如何将DNN的输出自然嵌入蚁群的路径搜索过程,并且如何利用蚁群生成的数据提升DNN模型质量。在状态转移过程中,蚁群算法的经典概率计算中包含信息素因子与启发因子两个部分,在本项目中,可以将DNN输出的节点评分作为启发因子的一部分或全部,从而替代传统的基于几何距离的启发函数。这样,每次状态转移时,不再只根据距离终点的直线距离来衡量候选节点优劣,而是根据DNN对复杂环境与路径代价的综合建模结果,使搜索方向更具“经验性”。同时,在信息素更新过程中,也可以根据DNN对整条路径评估结果调整信息素增量,例如对DNN与真实代价相吻合的高质量路径加大信息素奖励,对误差较大的路径适当削弱信息素强化,形成DNN与ACO之间的互相校正机制。
在MATLAB R2025b中实现该协同框架时,需要注意深度学习部分与传统算法部分之间的数据格式转换和性能优化。例如,路径特征与代价需要转换为神经网络训练所需的输入矩阵和标签向量,采用mini-batch训练策略时需在代码中控制批次划分。在R2025b版本中,避免使用已不推荐的特性,采用兼容性良好的网络训练接口和数值优化函数。通过合理设计脚本结构和函数接口,使蚁群主循环与DNN训练和预测过程在MATLAB中得以顺畅衔接。最终实现中,整体协同优化流程不仅要保证路径规划结果的质量,还要在仿真时间上满足一定的效率要求,以便在后续扩展到更大规模环境时具有可行性。
项目模型描述及代码示例
三维环境与障碍物建模示例
clear; clc; close all; % 清空工作区、命令行和图窗,为环境建模提供干净起点
env.xRange = [0 100]; % 定义三维环境在x轴方向的范围,单位可视作米
env.yRange = [0 100]; % 定义三维环境在y轴方向的范围,形成正方形平面区域
env.zRange = [0 50]; % 定义三维环境在z轴方向的高度范围,对应飞行高度限制
env.resolution = 5; % 设定栅格分辨率,将空间按5米间距离散成体素网格
env.yRange(1):env.resolution:env.yRange(2), ... % 使用ndgrid生成三维网格y坐标
env.xGrid = xGrid; % 将三维网格的x坐标存入环境结构体,便于后续索引和可视化
env.zGrid = zGrid; % 将三维网格的z坐标存入环境结构体,描述各体素中心的高度位置
env.obstacle = false(size(xGrid)); % 初始化障碍物占据矩阵,默认所有体素均为空闲空间
obsCenter = [50 50 25]; % 设置一个立方体障碍物的几何中心点坐标
obsSize = [30 30 30]; % 定义障碍物在x、y、z三个方向上的边长尺寸
inObsX = abs(xGrid - obsCenter(1)) <= obsSize(1)/2; % 计算各栅格在x方向是否落入障碍物范围
inObsY = abs(yGrid - obsCenter(2)) <= obsSize(2)/2; % 计算各栅格在y方向是否落入障碍物范围
inObsZ = abs(zGrid - obsCenter(3)) <= obsSize(3)/2; % 计算各栅格在z方向是否落入障碍物范围
env.obstacle = inObsX & inObsY & inObsZ; % 将同时满足x、y、z范围条件的栅格标记为障碍物占据
env.costWeight = ones(size(xGrid)); % 初始化代价权重矩阵,默认每个可行栅格的基础代价为1
inflateDist = 10; % 定义障碍物膨胀距离,用于构建安全缓冲区,单位与栅格坐标一致
distToObs = bwdist(env.obstacle) * env.resolution; % 利用bwdist计算每个栅格到最近障碍物的距离并换算为实际距离
env.costWeight(nearObs) = 5; % 对靠近障碍物的栅格提高代价权重,使路径偏向更安全的区域
goalPos = [95 95 45]; % 设定无人机终点在三维空间中的笛卡尔坐标
[~,startIdx] = min((xGrid(:)-startPos(1)).^2 + (yGrid(:)-startPos(2)).^2 + (zGrid(:)-startPos(3)).^2); % 在栅格中心中寻找与起点几何距离最小的索引
[~,goalIdx] = min((xGrid(:)-goalPos(1)).^2 + (yGrid(:)-goalPos(2)).^2 + (zGrid(:)-goalPos(3)).^2); % 在栅格中心中寻找与终点几何距离最小的索引
env.startIdx = startIdx; % 在环境结构体中记录起点栅格索引,供蚁群算法初始化起始位置使用
env.goalIdx = goalIdx; % 在环境结构体中记录终点栅格索引,作为路径搜索的目标节点
邻接关系构建与可行节点筛选示例
gridSize = size(env.xGrid); % 获取三维栅格在x、y、z三个维度上的尺寸,用于索引与邻接计算
validMask = ~env.obstacle; % 创建可行栅格掩码矩阵,将非障碍物栅格标记为可用节点
numNodes = numel(validX); % 统计可行节点的数量,作为蚁群搜索图中节点总数
nodeIndexMap = zeros(gridSize); % 初始化从三维栅格下标映射到节点编号的索引映射矩阵
for k = 1:numNodes % 遍历每一个可行栅格点,为其分配一个连续节点编号
nodeIndexMap(validX(k),validY(k),validZ(k)) = k; % 在索引映射矩阵中记录栅格对应的节点编号
end
env.nodeIndexMap = nodeIndexMap; % 将栅格到节点编号的映射保存到环境结构体中,方便查询
env.nodePos = [env.xGrid(validMask), env.yGrid(validMask), env.zGrid(validMask)]; % 提取所有可行节点的空间坐标,形成节点坐标列表
adjList = cell(numNodes,1); % 使用元胞数组存储每个节点的邻接节点编号,实现稀疏图结构
ix = validX(k); iy = validY(k); iz = validZ(k); % 获取当前节点在三维栅格中的下标坐标
neighbors = []; % 初始化当前节点的邻接节点编号列表
for d = 1:size(neighborOffsets,1) % 遍历所有六个邻接方向,搜索可行邻接节点
nx = ix + neighborOffsets(d,1); % 在x方向偏移一个单位,得到候选邻接栅格的x坐标
nz = iz + neighborOffsets(d,3); % 在z方向偏移一个单位,得到候选邻接栅格的z坐标
if nx>=1 && nx<=gridSize(1) && ny>=1 && ny<=gridSize(2) && nz>=1 && nz<=gridSize(3) % 检查候选栅格是否仍在环境边界范围内
if validMask(nx,ny,nz) % 检查候选栅格是否为可行节点,即未被障碍物占据
nid = nodeIndexMap(nx,ny,nz); % 从映射矩阵中查找该可行栅格对应的节点编号
neighbors(end+1) = nid; %#ok<AGROW> % 将邻接节点编号加入当前节点的邻接列表
end
end
adjList{k} = neighbors; % 将当前节点的邻接节点集合存入邻接列表中
end
env.adjList = adjList; % 将整个图的邻接信息保存在环境结构体中,供蚁群构造路径时使用
startNode = nodeIndexMap(validX == validX(env.startIdx) & validY == validY(env.startIdx) & validZ == validZ(env.startIdx)); % 根据起始栅格索引推导对应的节点编号
goalNode = nodeIndexMap(validX == validX(env.goalIdx) & validY == validY(env.goalIdx) & validZ == validZ(env.goalIdx)); % 根据目标栅格索引推导对应的节点编号
env.startNode = startNode; % 在环境结构体中记录起始节点编号,使蚁群算法能从该节点出发
蚁群算法参数与核心路径搜索循环示例
numAnts = 30; % 设置蚂蚁数量,决定每一代构造的候选路径数目
maxIter = 80; % 设置最大迭代次数,控制蚁群搜索过程的整体迭代深度
alpha = 1.0; % 设置信息素重要性权重,值越大表示对历史信息素依赖越强
rho = 0.3; % 设置信息素挥发系数,控制每一代后信息素保留比例
Q = 100; % 设置信息素总量系数,用于根据路径质量分配信息素增量
numNodes = size(env.nodePos,1); % 根据节点坐标列表计算图中节点的总数
tau(logical(eye(numNodes))) = 0; % 将对角线信息素置零,避免从节点到自身的伪路径
eta = zeros(numNodes); % 初始化启发矩阵,用于存储节点间的启发性信息
for j = adjList{i} % 对每一个邻接节点计算到目标节点的启发性指标
dist = norm(env.nodePos(j,:) - env.nodePos(env.goalNode,:)); % 计算邻接节点到目标节点的欧氏距离
end
bestCost = inf; % 初始化全局最优路径代价为无穷大,为后续比较提供起点
for iter = 1:maxIter % 进行蚁群主循环,每次迭代构造一批路径并更新信息素
allCosts = zeros(numAnts,1); % 用向量记录每条路径的总成本值
path = env.startNode; % 初始化路径,将起点节点作为路径第一个元素
visited = false(numNodes,1); % 创建访问标记数组,避免节点重复访问导致无效循环
current = env.startNode; % 设置当前节点为起点,作为路径构造的起始位置
for step = 1:maxSteps % 逐步扩展路径,直到达到最大步数或抵达目标
break; % 退出步进循环,保留已构造的路径序列
end
neighbors = env.adjList{current}; % 获取当前节点的所有邻接节点集合
if isempty(neighbors) % 如果可用邻接节点为空,说明该路径在此处陷入死路
break; % 中止路径扩展,让该蚂蚁路径在当前节点结束
tauVals = tau(current, neighbors); % 读取当前节点到各候选邻接节点的边上信息素值
etaVals = eta(current, neighbors); % 读取当前节点到各候选邻接节点的启发因子值
desirability = (tauVals .^ alpha) .* (etaVals .^ beta); % 按蚁群公式计算候选节点的相对吸引力
probs = desirability / sum(desirability); % 将吸引力归一化为概率向量,作为状态转移概率
r = rand; % 生成0到1之间的均匀随机数,用于轮盘赌选择下一节点
nextIdx = neighbors(find(r <= cumulative,1,'first')); % 根据轮盘赌原则选择满足条件的第一个候选节点
path(end+1) = nextIdx; %#ok<AGROW> % 将选中的节点编号追加到路径节点序列中
visited(nextIdx) = true; % 将新加入的节点标记为已访问,防止后续重复
current = nextIdx; % 更新当前节点为刚刚选择的下一节点,继续路径扩展
pathPos = env.nodePos(path,:); % 根据节点编号序列提取各节点三维坐标,构成路径几何形状
segmentLengths = sqrt(sum(diff(pathPos,1,1).^2,2)); % 计算相邻节点间的欧氏距离,得到各线段长度
baseCost = sum(segmentLengths); % 将所有线段长度累加,作为路径几何长度的基础成本
weights = env.costWeight(validMask); % 将代价权重矩阵中可行节点部分转换为向量,与节点顺序对应
totalCost = baseCost + 0.1 * riskCost; % 组合几何长度和风险成本,得到路径综合代价
allPaths{ant} = path; % 将当前蚂蚁构造的路径节点序列保存到集合中
allCosts(ant) = totalCost; % 将当前路径的综合代价记录到代价向量中
if current ~= env.goalNode % 如果路径在构造结束时没有到达目标
allCosts(ant) = allCosts(ant) + 1e6; % 对未到达目标的路径施加巨大惩罚,使其在信息素更新中几乎不被选中
if minCost < bestCost % 如果当前代出现了优于历史最优的路径
bestCost = minCost; % 更新全局最优路径的代价值
bestPath = allPaths{bestIndex}; % 更新全局最优路径的节点序列
end
tau = (1 - rho) * tau; % 对信息素矩阵进行整体挥发操作,降低历史信息素浓度
for ant = 1:numAnts % 遍历每只蚂蚁,为其路径按照质量分配信息素增量
cost = allCosts(ant); % 读取当前路径的综合代价,用于决定信息素更新强度
if cost > 1e5 % 如果路径代价过大,意味着路径不可行或质量极差
continue; % 跳过这条路径,不对其进行信息素强化
end
deltaTau = Q / cost; % 根据信息素规则,将路径信息素增量与代价的倒数成正比
for k = 1:(numel(path)-1) % 遍历路径上的每一条边,更新信息素矩阵
i = path(k); j = path(k+1); % 获取路径上相邻节点对,表示一条有向边
tau(i,j) = tau(i,j) + deltaTau; % 在边i到j上增加信息素,使该路径在后续迭代中更易被选择
tau(j,i) = tau(j,i) + deltaTau; % 由于图为无向,反向边也同步增加信息素
end
bestPathPos = env.nodePos(bestPath,:); % 将最终全局最优路径的节点编号序列映射为空间坐标,用于可视化和后续优化
深度神经网络训练数据构建示例
numSamples = numAnts * maxIter; % 设置用于DNN训练的样本数量上限,采用蚁群历史路径构成样本集合
Y = zeros(numSamples, 1); % 初始化标签向量,用于存储各样本对应的路径代价
for ant = 1:numAnts % 遍历蚂蚁索引,构造训练样本
path = bestPath; % 使用最优路径作为样本路径之一,实际工程中应采集更多不同路径
posSeq = env.nodePos(path,:); % 获取路径上节点的空间坐标序列
startP = posSeq(1,:); % 取本样本路径的起点坐标特征
endP = posSeq(end,:); % 取本样本路径的终点坐标特征
feature = [startP - endP, endP]; % 筛选出起终点之间的位置差以及终点坐标作为特征
cost = bestCost; % 将路径的综合代价作为该样本的输出标签
sampleCount = sampleCount + 1; % 累加样本计数,为当前样本分配位置
if sampleCount > numSamples % 当样本数量达到预设上限时,终止样本构建
break; % 跳出样本构建循环,避免越界
end
X(sampleCount,:) = feature; % 将当前样本输入特征存入特征矩阵对应行
Y(sampleCount) = cost; % 将当前样本路径代价作为输出标签存入标签向量
end
X = X(1:sampleCount,:); % 截取有效样本范围内的特征矩阵,避免末尾未填充部分干扰训练
Y = Y(1:sampleCount); % 截取有效样本范围内的标签向量,保证与特征矩阵行数一致
X = X(idx,:); % 按随机索引重排特征矩阵,提升训练数据的随机性
Y = Y(idx); % 按相同随机索引重排标签向量,保持特征与标签匹配
深度神经网络结构设计与训练示例
inputSize = featureDim; % 将输入层神经元数设置为特征向量维度,使网络能接收完整特征
layers = [ ...
featureInputLayer(inputSize,"Name","input") ... % 定义特征输入层,用于接收数值特征向量
fullyConnectedLayer(32,"Name","fc1") ... % 第一隐藏层,包含32个神经元,用于初步提取特征
reluLayer("Name","relu1") ... % 在第一隐藏层后添加ReLU激活,提高非线性拟合能力
reluLayer("Name","relu2") ... % 在第二隐藏层后加入ReLU激活函数,保持网络的非线性表达能力
fullyConnectedLayer(1,"Name","fc_out") ... % 输出层为单个神经元,用于回归预测路径代价
regressionLayer("Name","regressionoutput")]; % 使用回归损失层,将网络输出与真实代价进行均方误差训练
options = trainingOptions("adam", ... % 采用Adam优化器进行权重更新,兼顾收敛速度与稳定性
"MaxEpochs", 50, ... % 设置最大训练轮数为50轮,平衡收敛程度与时间开销
"MiniBatchSize", 16, ... % 使用16个样本组成的mini-batch进行迭代,提升训练稳定性
"InitialLearnRate", 1e-3, ... % 将初始学习率设置为1e-3,避免训练过程过于震荡
"Shuffle","every-epoch", ... % 在每个训练轮结束后打乱训练样本顺序,减少局部模式偏差
"Verbose", false); % 关闭详细命令行输出,使训练过程在脚本中安静运行
dnnModel = trainNetwork(X, Y, layers, options); % 调用trainNetwork函数使用指定层结构与训练参数训练回归网络
DNN输出融入蚁群状态转移的示例
function desirability = computeDesirabilityWithDNN(env, dnnModel, tauRow, currentNode, neighborNodes) % 定义函数计算引入DNN后的状态转移吸引力
currentPos = env.nodePos(currentNode,:); % 获取当前节点的三维坐标,用于构造特征
goalPos = env.nodePos(env.goalNode,:); % 获取目标节点的三维坐标,为特征提供任务终点信息
numNei = numel(neighborNodes); % 统计当前节点的候选邻接节点数量
for idx = 1:numNei % 遍历每个候选邻接节点,构造输入特征并调用网络进行预测
neiPos = env.nodePos(neighborNodes(idx),:); % 读取当前候选邻接节点的坐标
feature = [currentPos - goalPos, neiPos - goalPos]; % 构造包含当前位置与候选节点相对目标的特征向量
dnnScores(idx) = predict(dnnModel, feature); % 使用训练好的DNN模型预测当前局部决策的代价估计
end
dnnScores = max(dnnScores); % 示例中简单使用评分最大值作归一尺度基础,实际可根据需要修改
heuristic = 1 ./ (dnnScores + 1e-3); % 将DNN的代价预测转换为启发信息,预测代价越小启发值越大
alpha = 1.0; % 设置信息素在综合吸引力中的权重,与蚁群主循环保持一致
beta = 2.0; % 设置DNN启发信息在综合吸引力中的权重,略低于信息素以平衡探索和利用
desirability = (tauVals .^ alpha) .* (heuristicVec .^ beta); % 结合信息素与DNN启发,计算各候选节点的综合吸引力
end
neighbors = env.adjList{current}; % 获取当前节点的邻接节点集合
if isempty(neighbors) % 若没有可行邻接节点则视为死路
break; % 终止当前蚂蚁路径构造
desirability = computeDesirabilityWithDNN(env, dnnModel, tau(current,:), current, neighbors); % 调用带DNN启发的函数计算综合吸引力
probs = desirability / sum(desirability); % 将综合吸引力归一化为转移概率
r = rand; % 生成随机数用于轮盘赌采样下一节点
cumulative = cumsum(probs); % 构建累积概率分布
nextIdx = neighbors(find(r <= cumulative,1,'first')); % 基于轮盘赌原则选择第一个满足条件的候选节点
visited(nextIdx) = true; % 标记新节点为已访问
current = nextIdx; % 更新当前节点,继续下一步路径扩展
三维路径与障碍物可视化示例
fig = figure; % 新建图窗,用于绘制三维环境和最终规划路径
hold on; grid on; % 开启图像保持与网格显示,使多对象绘制时不被覆盖且容易判断空间位置
obsIdx = find(env.obstacle); % 找出所有被障碍物占据的栅格索引,用于可视化障碍体
[ox,oy,oz] = ind2sub(size(env.obstacle), obsIdx); % 将障碍物栅格的线性索引转换为三维网格下标
三维环境与障碍物建模示例
clear; clc; close all; % 清空工作区、命令行和图窗,为环境建模提供干净起点
env.xRange = [0 100]; % 定义三维环境在x轴方向的范围,单位可视作米
env.yRange = [0 100]; % 定义三维环境在y轴方向的范围,形成正方形平面区域
env.zRange = [0 50]; % 定义三维环境在z轴方向的高度范围,对应飞行高度限制
env.resolution = 5; % 设定栅格分辨率,将空间按5米间距离散成体素网格
env.yRange(1):env.resolution:env.yRange(2), ... % 使用ndgrid生成三维网格y坐标
env.xGrid = xGrid; % 将三维网格的x坐标存入环境结构体,便于后续索引和可视化
env.zGrid = zGrid; % 将三维网格的z坐标存入环境结构体,描述各体素中心的高度位置
env.obstacle = false(size(xGrid)); % 初始化障碍物占据矩阵,默认所有体素均为空闲空间
obsCenter = [50 50 25]; % 设置一个立方体障碍物的几何中心点坐标
obsSize = [30 30 30]; % 定义障碍物在x、y、z三个方向上的边长尺寸
inObsX = abs(xGrid - obsCenter(1)) <= obsSize(1)/2; % 计算各栅格在x方向是否落入障碍物范围
inObsY = abs(yGrid - obsCenter(2)) <= obsSize(2)/2; % 计算各栅格在y方向是否落入障碍物范围
inObsZ = abs(zGrid - obsCenter(3)) <= obsSize(3)/2; % 计算各栅格在z方向是否落入障碍物范围
env.obstacle = inObsX & inObsY & inObsZ; % 将同时满足x、y、z范围条件的栅格标记为障碍物占据
env.costWeight = ones(size(xGrid)); % 初始化代价权重矩阵,默认每个可行栅格的基础代价为1
inflateDist = 10; % 定义障碍物膨胀距离,用于构建安全缓冲区,单位与栅格坐标一致
distToObs = bwdist(env.obstacle) * env.resolution; % 利用bwdist计算每个栅格到最近障碍物的距离并换算为实际距离
env.costWeight(nearObs) = 5; % 对靠近障碍物的栅格提高代价权重,使路径偏向更安全的区域
goalPos = [95 95 45]; % 设定无人机终点在三维空间中的笛卡尔坐标
[~,startIdx] = min((xGrid(:)-startPos(1)).^2 + (yGrid(:)-startPos(2)).^2 + (zGrid(:)-startPos(3)).^2); % 在栅格中心中寻找与起点几何距离最小的索引
[~,goalIdx] = min((xGrid(:)-goalPos(1)).^2 + (yGrid(:)-goalPos(2)).^2 + (zGrid(:)-goalPos(3)).^2); % 在栅格中心中寻找与终点几何距离最小的索引
env.startIdx = startIdx; % 在环境结构体中记录起点栅格索引,供蚁群算法初始化起始位置使用
env.goalIdx = goalIdx; % 在环境结构体中记录终点栅格索引,作为路径搜索的目标节点
邻接关系构建与可行节点筛选示例
gridSize = size(env.xGrid); % 获取三维栅格在x、y、z三个维度上的尺寸,用于索引与邻接计算
validMask = ~env.obstacle; % 创建可行栅格掩码矩阵,将非障碍物栅格标记为可用节点
numNodes = numel(validX); % 统计可行节点的数量,作为蚁群搜索图中节点总数
nodeIndexMap = zeros(gridSize); % 初始化从三维栅格下标映射到节点编号的索引映射矩阵
for k = 1:numNodes % 遍历每一个可行栅格点,为其分配一个连续节点编号
nodeIndexMap(validX(k),validY(k),validZ(k)) = k; % 在索引映射矩阵中记录栅格对应的节点编号
end
env.nodeIndexMap = nodeIndexMap; % 将栅格到节点编号的映射保存到环境结构体中,方便查询
env.nodePos = [env.xGrid(validMask), env.yGrid(validMask), env.zGrid(validMask)]; % 提取所有可行节点的空间坐标,形成节点坐标列表
adjList = cell(numNodes,1); % 使用元胞数组存储每个节点的邻接节点编号,实现稀疏图结构
ix = validX(k); iy = validY(k); iz = validZ(k); % 获取当前节点在三维栅格中的下标坐标
neighbors = []; % 初始化当前节点的邻接节点编号列表
for d = 1:size(neighborOffsets,1) % 遍历所有六个邻接方向,搜索可行邻接节点
nx = ix + neighborOffsets(d,1); % 在x方向偏移一个单位,得到候选邻接栅格的x坐标
nz = iz + neighborOffsets(d,3); % 在z方向偏移一个单位,得到候选邻接栅格的z坐标
if nx>=1 && nx<=gridSize(1) && ny>=1 && ny<=gridSize(2) && nz>=1 && nz<=gridSize(3) % 检查候选栅格是否仍在环境边界范围内
if validMask(nx,ny,nz) % 检查候选栅格是否为可行节点,即未被障碍物占据
nid = nodeIndexMap(nx,ny,nz); % 从映射矩阵中查找该可行栅格对应的节点编号
neighbors(end+1) = nid; %#ok<AGROW> % 将邻接节点编号加入当前节点的邻接列表
end
end
adjList{k} = neighbors; % 将当前节点的邻接节点集合存入邻接列表中
end
env.adjList = adjList; % 将整个图的邻接信息保存在环境结构体中,供蚁群构造路径时使用
startNode = nodeIndexMap(validX == validX(env.startIdx) & validY == validY(env.startIdx) & validZ == validZ(env.startIdx)); % 根据起始栅格索引推导对应的节点编号
goalNode = nodeIndexMap(validX == validX(env.goalIdx) & validY == validY(env.goalIdx) & validZ == validZ(env.goalIdx)); % 根据目标栅格索引推导对应的节点编号
env.startNode = startNode; % 在环境结构体中记录起始节点编号,使蚁群算法能从该节点出发
蚁群算法参数与核心路径搜索循环示例
numAnts = 30; % 设置蚂蚁数量,决定每一代构造的候选路径数目
maxIter = 80; % 设置最大迭代次数,控制蚁群搜索过程的整体迭代深度
alpha = 1.0; % 设置信息素重要性权重,值越大表示对历史信息素依赖越强
rho = 0.3; % 设置信息素挥发系数,控制每一代后信息素保留比例
Q = 100; % 设置信息素总量系数,用于根据路径质量分配信息素增量
numNodes = size(env.nodePos,1); % 根据节点坐标列表计算图中节点的总数
tau(logical(eye(numNodes))) = 0; % 将对角线信息素置零,避免从节点到自身的伪路径
eta = zeros(numNodes); % 初始化启发矩阵,用于存储节点间的启发性信息
for j = adjList{i} % 对每一个邻接节点计算到目标节点的启发性指标
dist = norm(env.nodePos(j,:) - env.nodePos(env.goalNode,:)); % 计算邻接节点到目标节点的欧氏距离
end
bestCost = inf; % 初始化全局最优路径代价为无穷大,为后续比较提供起点
for iter = 1:maxIter % 进行蚁群主循环,每次迭代构造一批路径并更新信息素
allCosts = zeros(numAnts,1); % 用向量记录每条路径的总成本值
path = env.startNode; % 初始化路径,将起点节点作为路径第一个元素
visited = false(numNodes,1); % 创建访问标记数组,避免节点重复访问导致无效循环
current = env.startNode; % 设置当前节点为起点,作为路径构造的起始位置
for step = 1:maxSteps % 逐步扩展路径,直到达到最大步数或抵达目标
break; % 退出步进循环,保留已构造的路径序列
end
neighbors = env.adjList{current}; % 获取当前节点的所有邻接节点集合
if isempty(neighbors) % 如果可用邻接节点为空,说明该路径在此处陷入死路
break; % 中止路径扩展,让该蚂蚁路径在当前节点结束
tauVals = tau(current, neighbors); % 读取当前节点到各候选邻接节点的边上信息素值
etaVals = eta(current, neighbors); % 读取当前节点到各候选邻接节点的启发因子值
desirability = (tauVals .^ alpha) .* (etaVals .^ beta); % 按蚁群公式计算候选节点的相对吸引力
probs = desirability / sum(desirability); % 将吸引力归一化为概率向量,作为状态转移概率
r = rand; % 生成0到1之间的均匀随机数,用于轮盘赌选择下一节点
nextIdx = neighbors(find(r <= cumulative,1,'first')); % 根据轮盘赌原则选择满足条件的第一个候选节点
path(end+1) = nextIdx; %#ok<AGROW> % 将选中的节点编号追加到路径节点序列中
visited(nextIdx) = true; % 将新加入的节点标记为已访问,防止后续重复
current = nextIdx; % 更新当前节点为刚刚选择的下一节点,继续路径扩展
pathPos = env.nodePos(path,:); % 根据节点编号序列提取各节点三维坐标,构成路径几何形状
segmentLengths = sqrt(sum(diff(pathPos,1,1).^2,2)); % 计算相邻节点间的欧氏距离,得到各线段长度
baseCost = sum(segmentLengths); % 将所有线段长度累加,作为路径几何长度的基础成本
weights = env.costWeight(validMask); % 将代价权重矩阵中可行节点部分转换为向量,与节点顺序对应
totalCost = baseCost + 0.1 * riskCost; % 组合几何长度和风险成本,得到路径综合代价
allPaths{ant} = path; % 将当前蚂蚁构造的路径节点序列保存到集合中
allCosts(ant) = totalCost; % 将当前路径的综合代价记录到代价向量中
if current ~= env.goalNode % 如果路径在构造结束时没有到达目标
allCosts(ant) = allCosts(ant) + 1e6; % 对未到达目标的路径施加巨大惩罚,使其在信息素更新中几乎不被选中
if minCost < bestCost % 如果当前代出现了优于历史最优的路径
bestCost = minCost; % 更新全局最优路径的代价值
bestPath = allPaths{bestIndex}; % 更新全局最优路径的节点序列
end
tau = (1 - rho) * tau; % 对信息素矩阵进行整体挥发操作,降低历史信息素浓度
for ant = 1:numAnts % 遍历每只蚂蚁,为其路径按照质量分配信息素增量
cost = allCosts(ant); % 读取当前路径的综合代价,用于决定信息素更新强度
if cost > 1e5 % 如果路径代价过大,意味着路径不可行或质量极差
continue; % 跳过这条路径,不对其进行信息素强化
end
deltaTau = Q / cost; % 根据信息素规则,将路径信息素增量与代价的倒数成正比
for k = 1:(numel(path)-1) % 遍历路径上的每一条边,更新信息素矩阵
i = path(k); j = path(k+1); % 获取路径上相邻节点对,表示一条有向边
tau(i,j) = tau(i,j) + deltaTau; % 在边i到j上增加信息素,使该路径在后续迭代中更易被选择
tau(j,i) = tau(j,i) + deltaTau; % 由于图为无向,反向边也同步增加信息素
end
bestPathPos = env.nodePos(bestPath,:); % 将最终全局最优路径的节点编号序列映射为空间坐标,用于可视化和后续优化
深度神经网络训练数据构建示例
numSamples = numAnts * maxIter; % 设置用于DNN训练的样本数量上限,采用蚁群历史路径构成样本集合
Y = zeros(numSamples, 1); % 初始化标签向量,用于存储各样本对应的路径代价
for ant = 1:numAnts % 遍历蚂蚁索引,构造训练样本
path = bestPath; % 使用最优路径作为样本路径之一,实际工程中应采集更多不同路径
posSeq = env.nodePos(path,:); % 获取路径上节点的空间坐标序列
startP = posSeq(1,:); % 取本样本路径的起点坐标特征
endP = posSeq(end,:); % 取本样本路径的终点坐标特征
feature = [startP - endP, endP]; % 筛选出起终点之间的位置差以及终点坐标作为特征
cost = bestCost; % 将路径的综合代价作为该样本的输出标签
sampleCount = sampleCount + 1; % 累加样本计数,为当前样本分配位置
if sampleCount > numSamples % 当样本数量达到预设上限时,终止样本构建
break; % 跳出样本构建循环,避免越界
end
X(sampleCount,:) = feature; % 将当前样本输入特征存入特征矩阵对应行
Y(sampleCount) = cost; % 将当前样本路径代价作为输出标签存入标签向量
end
X = X(1:sampleCount,:); % 截取有效样本范围内的特征矩阵,避免末尾未填充部分干扰训练
Y = Y(1:sampleCount); % 截取有效样本范围内的标签向量,保证与特征矩阵行数一致
X = X(idx,:); % 按随机索引重排特征矩阵,提升训练数据的随机性
Y = Y(idx); % 按相同随机索引重排标签向量,保持特征与标签匹配
深度神经网络结构设计与训练示例
inputSize = featureDim; % 将输入层神经元数设置为特征向量维度,使网络能接收完整特征
layers = [ ...
featureInputLayer(inputSize,"Name","input") ... % 定义特征输入层,用于接收数值特征向量
fullyConnectedLayer(32,"Name","fc1") ... % 第一隐藏层,包含32个神经元,用于初步提取特征
reluLayer("Name","relu1") ... % 在第一隐藏层后添加ReLU激活,提高非线性拟合能力
reluLayer("Name","relu2") ... % 在第二隐藏层后加入ReLU激活函数,保持网络的非线性表达能力
fullyConnectedLayer(1,"Name","fc_out") ... % 输出层为单个神经元,用于回归预测路径代价
regressionLayer("Name","regressionoutput")]; % 使用回归损失层,将网络输出与真实代价进行均方误差训练
options = trainingOptions("adam", ... % 采用Adam优化器进行权重更新,兼顾收敛速度与稳定性
"MaxEpochs", 50, ... % 设置最大训练轮数为50轮,平衡收敛程度与时间开销
"MiniBatchSize", 16, ... % 使用16个样本组成的mini-batch进行迭代,提升训练稳定性
"InitialLearnRate", 1e-3, ... % 将初始学习率设置为1e-3,避免训练过程过于震荡
"Shuffle","every-epoch", ... % 在每个训练轮结束后打乱训练样本顺序,减少局部模式偏差
"Verbose", false); % 关闭详细命令行输出,使训练过程在脚本中安静运行
dnnModel = trainNetwork(X, Y, layers, options); % 调用trainNetwork函数使用指定层结构与训练参数训练回归网络
DNN输出融入蚁群状态转移的示例
function desirability = computeDesirabilityWithDNN(env, dnnModel, tauRow, currentNode, neighborNodes) % 定义函数计算引入DNN后的状态转移吸引力
currentPos = env.nodePos(currentNode,:); % 获取当前节点的三维坐标,用于构造特征
goalPos = env.nodePos(env.goalNode,:); % 获取目标节点的三维坐标,为特征提供任务终点信息
numNei = numel(neighborNodes); % 统计当前节点的候选邻接节点数量
for idx = 1:numNei % 遍历每个候选邻接节点,构造输入特征并调用网络进行预测
neiPos = env.nodePos(neighborNodes(idx),:); % 读取当前候选邻接节点的坐标
feature = [currentPos - goalPos, neiPos - goalPos]; % 构造包含当前位置与候选节点相对目标的特征向量
dnnScores(idx) = predict(dnnModel, feature); % 使用训练好的DNN模型预测当前局部决策的代价估计
end
dnnScores = max(dnnScores); % 示例中简单使用评分最大值作归一尺度基础,实际可根据需要修改
heuristic = 1 ./ (dnnScores + 1e-3); % 将DNN的代价预测转换为启发信息,预测代价越小启发值越大
alpha = 1.0; % 设置信息素在综合吸引力中的权重,与蚁群主循环保持一致
beta = 2.0; % 设置DNN启发信息在综合吸引力中的权重,略低于信息素以平衡探索和利用
desirability = (tauVals .^ alpha) .* (heuristicVec .^ beta); % 结合信息素与DNN启发,计算各候选节点的综合吸引力
end
neighbors = env.adjList{current}; % 获取当前节点的邻接节点集合
if isempty(neighbors) % 若没有可行邻接节点则视为死路
break; % 终止当前蚂蚁路径构造
desirability = computeDesirabilityWithDNN(env, dnnModel, tau(current,:), current, neighbors); % 调用带DNN启发的函数计算综合吸引力
probs = desirability / sum(desirability); % 将综合吸引力归一化为转移概率
r = rand; % 生成随机数用于轮盘赌采样下一节点
cumulative = cumsum(probs); % 构建累积概率分布
nextIdx = neighbors(find(r <= cumulative,1,'first')); % 基于轮盘赌原则选择第一个满足条件的候选节点
visited(nextIdx) = true; % 标记新节点为已访问
current = nextIdx; % 更新当前节点,继续下一步路径扩展
三维路径与障碍物可视化示例
fig = figure; % 新建图窗,用于绘制三维环境和最终规划路径
hold on; grid on; % 开启图像保持与网格显示,使多对象绘制时不被覆盖且容易判断空间位置
obsIdx = find(env.obstacle); % 找出所有被障碍物占据的栅格索引,用于可视化障碍体
[ox,oy,oz] = ind2sub(size(env.obstacle), obsIdx); % 将障碍物栅格的线性索引转换为三维网格下标
obsPos = [env.xGrid(obsIdx), env.yGrid(obsIdx), env.zGrid(obsIdx)]; % 提取障碍物栅格中心点的三维坐标
scatter3(obsPos(:,1), obsPos(:,2), obsPos(:,3), 20, [0.5 0.5 0.5],'filled'); % 使用三维散点图以灰色点云形式表示障碍物区域
pathPos = env.nodePos(bestPath,:); % 获取全局最优路径的坐标序列
plot3(pathPos(:,1), pathPos(:,2), pathPos(:,3), 'r-','LineWidth',2); % 使用红色实线绘制最优路径轨迹,线宽为2增强可见性
scatter3(pathPos(1,1), pathPos(1,2), pathPos(1,3), 80,'g','filled'); % 使用绿色实心点标记路径起点所在坐标
scatter3(pathPos(end,1), pathPos(end,2), pathPos(end,3), 80,'b','filled'); % 使用蓝色实心点标记路径终点所在坐标
view(3); % 设置视角为三维视图,便于从空间角度观察路径与障碍物关系
规划结果代价分析与简单评价示例
segmentLengths = sqrt(sum(diff(bestPathPos,1,1).^2,2)); % 重新计算最优路径相邻节点间的三维距离
weights = env.costWeight(validMask); % 从环境结构中提取所有可行节点的代价权重向量
nodeWeights = weights(bestPath); % 按最优路径节点索引提取对应的环境代价权重
riskCost = sum(nodeWeights); % 将路径上所有节点的代价权重求和,作为整体风险成本
fprintf('最优路径几何长度: %.2f\n', totalLength); % 在命令行输出最优路径的几何长度,保留两位小数
fprintf('最优路径风险成本: %.2f\n', riskCost); % 在命令行输出最优路径的风险成本,显示路径对危险区域的亲近程度
fprintf('综合代价(与蚁群评价一致): %.2f\n', bestCost); % 输出蚁群算法记录的综合代价,便于与单独长度和风险比较




更多详细内容请访问
http://【无人机三维路径规划】MATLAB实现基于ACO-DNN蚁群算法(ACO)结合深度神经网络(DNN)进行无人机三维路径规划的详细项目实例(含完整的程序,GUI设计和代码详解)_MATLAB GUI设计深度学习模型资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90211129
https://download.csdn.net/download/xiaoxingkongyuxi/90211129
http:// https://download.csdn.net/download/xiaoxingkongyuxi/90211129
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)