MATLAB实现基于ACO-PSO-RNN 蚁群算法(ACO)结合粒子群优化算法(PSO)与循环神经网络(RNN)进行无人机三维路径规划的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
无人机三维路径规划是智能空中系统中的核心问题之一,尤其在复杂地形、动态障碍、通信约束、能量约束与任务优先级并存的场景中,传统规划方法往往面临可行性不足、全局寻优能力弱、实时性和鲁棒性难以兼顾等困难。随着低空经济、应急救援、边境巡检、城市安防、物流投送、农业遥感等需求持续增长,无人机不再只是完成简单的点到点飞行,而是需要在三维空间中综合考虑航迹长度、飞行安全、地形起伏、禁飞区、威胁区域、风场扰动、续航能力以及任务点覆盖顺序等多重目标。三维路径规划因此从单纯几何最短路问题,逐渐演化为一个典型的多约束、多目标、强耦合、非线性、非凸优化问题。
在此类问题中,单一算法通常存在明显局限。蚁群算法具有较强的全局搜索与正反馈机制,适合在离散空间中构造多条候选路径,并通过信息素机制逐步强化优良路线;粒子群优化算法则在连续参数空间中具有较高的搜索效率,能够有效调节路径控制点、平滑参数、航向变化以及能耗相关变量;循环神经网络能够从历史轨迹、环境状态序列与局部地形变化中提取时序模式,具备对未来环境趋势和路径风险进行学习与预测的能力。将 ACO、PSO、RNN 进行融合,可以形成“全局离散寻优、局部连续调优、时序风险建模”的复合框架,在三维路径规划任务中兼顾探索能力、收敛效率与环境适应性。
从工程实现角度看,ACO 适合先在三维栅格、航路点网络或候选中继节点图中生成粗路径,使无人机快速避开禁飞区和高风险区域;PSO 再对粗路径中的关键节点坐标、航段折点高度、转弯半径或代价权重进行连续优化,从而减少路径长度并增强轨迹平滑性;RNN 则用于对障碍分布、风场变化或历史飞行经验进行序列建模,辅助更新代价函数,使路径不只追求静态最优,还能考虑动态环境中的未来风险。三者协同后,既能保持 ACO 的离散搜索稳定性,又能保留 PSO 的快速连续优化特性,还能引入 RNN 的预测能力,使路径规划更接近真实飞行环境中的决策逻辑。
在 MATLAB 环境下实现该类系统具有较高可行性。MATLAB 在数值计算、矩阵运算、算法原型验证、可视化与工程调试方面都具有成熟生态,适合快速搭建三维地图、障碍场、代价地图、无人机轨迹仿真及性能评估模块。通过结合随机地形生成、三维网格建模、信息素矩阵更新、粒子速度位置迭代、RNN 序列训练与路径评分机制,可以构建一个完整的 ACO PSO RNN 无人机三维路径规划原型。该原型既可用于学术研究中的算法对比,也可用于工程验证中的场景测试,还可作为后续接入真实传感器数据、SLAM 地图、风场预测模块、任务调度系统的基础。
从应用价值来看,这一项目不仅具备较强的研究意义,也具有显著的落地潜力。对于应急救援而言,复杂灾害区域往往存在通信中断、地形坍塌和障碍不确定等问题,智能路径规划可提升无人机投送与侦察效率;对于城市巡检而言,三维路径优化可帮助无人机在楼宇之间安全穿行,避开高风险区域并减少能耗;对于农业监测而言,路径规划可提升航线覆盖率与航时利用率;对于安防巡逻而言,系统能够在动态区域中持续调整飞行轨迹,提高覆盖密度与响应速度。由此可见,ACO PSO RNN 方案不是单一算法堆叠,而是面向真实空域决策问题的融合式智能优化框架,具有较强的理论价值与工程意义。
项目目标与意义
一、实现复杂三维空域中的高效全局寻优
项目的首要目标是让无人机在三维空间内能够快速找到一条可行、稳定且代价较低的飞行路线。三维路径规划不同于二维平面路径,除了平面位置之外,还需考虑高度变化、垂直爬升成本、转弯半径限制以及障碍物的立体边界。采用 ACO 可以在离散节点网络中进行全局搜索,利用信息素积累机制逐步强化高质量路线,避免陷入局部最优。该目标的意义在于提升复杂环境下的初始路径生成能力,使系统能够在较短时间内构建基础可行解,为后续连续优化提供可靠起点,从而提升整体规划稳定性与搜索效率。
二、提升路径平滑性与飞行安全性
第二个目标是减少轨迹中的急转弯、局部抖动和不必要的高度波动。实际无人机飞行对加速度变化、姿态切换和控制输入连续性有较高要求,若路径点过于稀疏或折线过多,容易造成飞行控制负担增加、能耗上升甚至失稳。PSO 适合用于连续变量调优,可对航路点坐标、曲线平滑参数以及路径代价权重进行联合优化,使轨迹更符合物理飞行约束。该目标的意义在于将“可达路径”进一步提升为“可飞路径”,让规划结果不仅存在,而且更安全、更稳定、更适合真实机载控制系统执行。
三、引入时序预测能力以增强动态适应性
第三个目标是把 RNN 引入路径规划流程,用于学习环境状态与风险变化之间的时序关系。动态空域中,障碍物可能移动,风场可能变化,通信质量可能随区域变化而波动,这些都不是静态地图能够完整表达的。RNN 通过处理序列输入,可以对未来一段时间内的风险趋势进行预测,进而修正代价地图或路径评分。该目标的意义在于让规划系统从静态最优转向动态鲁棒,使无人机面对时变环境时能够主动调整路线,而非仅依赖实时避障,进而提高系统在复杂环境中的生存能力与执行成功率。
四、形成可扩展的智能优化原型平台
第四个目标是构建一个具有通用接口和扩展能力的 MATLAB 原型平台,便于后续接入真实地图、传感器数据、任务调度策略或多机协同机制。通过模块化设计,可以将环境建模、ACO 粗规划、PSO 精调、RNN 风险预测和结果评估独立组织,方便进行算法替换与参数比较。该目标的意义在于不只完成一次性演示,而是形成可复用、可迭代的研究框架,便于继续扩展到多无人机协同、在线重规划、强化学习融合以及真实飞控接口集成等更高层次应用。
项目挑战及解决方案
一、三维环境建模复杂且约束耦合强
三维路径规划面临的首要难点是环境表达方式复杂。地形起伏、建筑物、禁飞区、危险区、通信盲区和风场区域都需要统一映射到代价空间中,而且这些因素并非独立存在,往往会叠加影响最终可行性。例如同一条路径在地形上安全,但可能会穿越通信弱区;或者路径长度较短,但爬升过于剧烈导致能耗过高。对此可采用三维栅格地图结合多层代价场的方式,将障碍、地形和风险统一编码为节点可达性与边代价,从而将复杂物理场景转换为可优化的离散问题。再通过分层代价设计,把硬约束转化为不可穿越区域,把软约束转化为代价惩罚,便于 ACO 搜索和 PSO 调优共同处理。
二、单一优化算法容易早熟或收敛缓慢
第二个难点是优化过程中的全局搜索与局部精调难以兼顾。ACO 虽然具有较强的全局探索能力,但若信息素更新过快,容易导致搜索早熟;若更新过慢,则收敛效率偏低。PSO 虽然适合连续空间,但在复杂非凸目标下可能出现停滞和粒子聚集过快的问题。针对这一问题,可采用 ACO 负责生成路径骨架,再由 PSO 对关键节点和局部参数进行二次优化,同时在 ACO 中引入启发式信息和信息素挥发机制,在 PSO 中加入惯性权重自适应变化和边界修正策略。这样可以在保持全局多样性的同时提高局部收敛质量,使两种算法形成互补。
三、动态环境下路径可靠性不足
第三个难点是路径规划结果在静态地图上表现良好,但进入动态场景后可能迅速失效。无人机运行过程中,风速、障碍位置、临时禁飞区或通信质量可能发生变化,固定路径难以适应这些扰动。RNN 的引入正是为了解决该问题。可将历史观测序列、区域风险序列和飞行状态序列作为输入,训练模型输出未来风险评分或局部区域代价修正值,并将其反馈给 ACO 和 PSO 的目标函数。这样,当环境变化趋势与历史相关时,模型可以提前修正路径偏好,减少临场重规划次数。若配合在线更新机制,还可使系统在执行阶段持续修正策略,增强鲁棒性与实用性。
项目模型架构
一、环境感知与三维地图构建层
该层负责将真实或仿真的空域信息转化为可计算模型。通常先定义三维边界范围,再生成三维栅格或航路点集合,并在其中布置障碍物、危险区域与目标点。每个栅格节点都携带位置坐标、通行状态、局部高度、风险系数等属性。若考虑地形起伏,还可引入地表高度矩阵,让无人机实际飞行高度相对地形高度进行约束。该层的作用是把复杂场景离散化并结构化,使后续算法可以基于节点、边与代价矩阵进行统一求解。对于 ACO 来说,这一层决定路径搜索图;对于 PSO 来说,这一层提供连续优化的边界;对于 RNN 来说,这一层提供时序观测输入的空间背景。
二、ACO 全局粗路径搜索层
蚁群算法的核心思想是模拟蚂蚁通过信息素引导寻找食物路径的群体行为。在路径规划中,每只蚂蚁代表一条候选路径,从起点出发,根据当前信息素浓度和启发式信息选择下一节点,逐步构造完整路线。信息素高的路径更容易被后续蚂蚁选择,从而形成正反馈;同时通过挥发机制避免过早锁定局部最优。该层的关键任务是快速找到一条可行且代价较低的粗略路径。由于无人机三维路径规划包含障碍和高度约束,ACO 适合在离散图上进行大范围探索,优先保证可达性和全局性,为后续连续优化提供骨架。该层输出的结果通常是节点序列或关键拐点集合。
三、PSO 局部连续优化层
粒子群优化算法模拟鸟群觅食行为,通过粒子位置和速度迭代寻找最优解。在本项目中,PSO 主要用于优化 ACO 输出的关键节点位置、航路点高度、路径平滑参数以及代价权重。每个粒子代表一组连续参数,依据个体最优和群体最优调整搜索方向,逐渐降低路径代价。与 ACO 相比,PSO 更适合处理连续变量,能够在局部范围内细化路径形状,减少折线和高频抖动。该层通过不断修正路径几何特征,使最终轨迹更符合无人机动力学和控制约束。若与惩罚项结合,还可约束最小安全距离、爬升率和曲率变化,从而提升可执行性。
四、RNN 时序风险预测层
循环神经网络用于处理具有时间相关性的序列信息。在无人机路径规划中,环境风险并非静止不变,而是会随时间演化。RNN 可以接收历史风速、历史障碍状态、前序代价反馈、路径执行误差等输入,学习其时间依赖关系,并输出未来一段时窗内的风险评分或环境修正值。该层的作用不是直接生成路径,而是为路径代价函数提供动态修正因子,使 ACO 与 PSO 在搜索时能够考虑未来变化趋势。若使用更稳定的门控结构,也能改善长期依赖问题,但在本项目的核心描述中,RNN 作为时序建模模块即可完成风险前馈与环境自适应的功能。
五、融合决策与性能评估层
融合层负责把 ACO 的全局路径、PSO 的局部调优结果和 RNN 的时序风险输出整合为最终可执行轨迹。通常可采用加权评分方式,将路径长度、障碍惩罚、平滑度、能耗估计、风险预测值与目标到达效率统一映射为综合代价,再按最小代价原则输出最优路线。评估层则用于验证规划效果,包括成功率、路径长度、计算耗时、转角均方、最小安全间距和综合代价曲线等指标。该层既是算法输出接口,也是实验对比核心。通过它可以清楚看到融合方案相较于单一 ACO 或单一 PSO 在稳定性、鲁棒性和最优性上的提升,从而证明复合模型的有效性。
项目模型描述及代码示例
一、三维环境与障碍地图构建 clear; % 清空工作区变量,保证实验环境干净 clc; % 清空命令行窗口,便于观察输出 close all; % 关闭所有图窗,避免历史图形干扰当前实验 rng(42); % 固定随机种子,保证结果可复现 gridSize = [30 30 12]; % 定义三维栅格尺寸,分别对应x、y、z方向离散长度 startNode = [2 2 2]; % 定义起点坐标,作为无人机出发位置 goalNode = [28 28 10]; % 定义终点坐标,作为无人机目标到达位置 obstacleMap = false(gridSize); % 创建三维逻辑矩阵,用于标记障碍物位置 for k = 1:6 % 循环生成多组立方体障碍,提高场景复杂度 ox = randi([6 22]); % 随机生成障碍在x方向中心位置 oy = randi([6 22]); % 随机生成障碍在y方向中心位置 oz = randi([2 8]); % 随机生成障碍在z方向中心位置 sx = randi([2 4]); % 随机生成障碍在x方向尺寸 sy = randi([2 4]); % 随机生成障碍在y方向尺寸 sz = randi([2 3]); % 随机生成障碍在z方向尺寸 x1 = max(1, ox-sx); % 计算障碍左边界,避免越界 x2 = min(gridSize(1), ox+sx); % 计算障碍右边界,避免越界 y1 = max(1, oy-sy); % 计算障碍前边界,避免越界 y2 = min(gridSize(2), oy+sy); % 计算障碍后边界,避免越界 z1 = max(1, oz-sz); % 计算障碍下边界,避免越界 z2 = min(gridSize(3), oz+sz); % 计算障碍上边界,避免越界 obstacleMap(x1:x2, y1:y2, z1:z2) = true; % 将立方体区域标记为障碍 end % 结束障碍生成循环 obstacleMap(startNode(1), startNode(2), startNode(3)) = false; % 确保起点不被障碍占用 obstacleMap(goalNode(1), goalNode(2), goalNode(3)) = false; % 确保终点不被障碍占用 二、节点编码与代价函数定义 nodeList = []; % 创建节点列表,用于保存可通行节点坐标 nodeIndex = zeros(gridSize); % 创建索引矩阵,用于记录节点编号与坐标映射 idx = 0; % 初始化节点计数器 for x = 1:gridSize(1) % 遍历x方向所有栅格 for y = 1:gridSize(2) % 遍历y方向所有栅格 for z = 1:gridSize(3) % 遍历z方向所有栅格 if ~obstacleMap(x,y,z) % 判断当前节点是否可通行 idx = idx + 1; % 可通行则增加节点编号 nodeList(idx,:) = [x y z]; % 将节点坐标写入节点表 nodeIndex(x,y,z) = idx; % 记录当前坐标对应的节点编号 end % 结束可通行判断 end % 结束z循环 end % 结束y循环 end % 结束x循环 heuristicDist = @(a,b) sqrt(sum((a-b).^2)); % 定义三维欧氏距离启发函数,用于评估节点距离 pathCost = @(p) sum(vecnorm(diff(p,1,1),2,2)) + 10*sum(any(obstacleMap(sub2ind(gridSize, max(1,min(gridSize(1), round(p(:,1)))), max(1,min(gridSize(2), round(p(:,2)))), max(1,min(gridSize(3), round(p(:,3))))))),2)); % 定义路径总代价,包含长度和障碍惩罚 三、ACO 粗路径搜索 numAnts = 25; % 定义蚂蚁数量,影响搜索覆盖度 maxIterACO = 40; % 定义ACO最大迭代次数,影响全局探索轮次 alpha = 1; % 信息素重要程度参数 beta = 4; % 启发式信息重要程度参数 rho = 0.25; % 信息素挥发系数 Q = 80; % 信息素增量系数 pheromone = ones(size(gridSize)); % 初始化信息素场,三维网格中每个节点初始相同 bestACOPath = []; % 存储ACO阶段最优路径 bestACOScore = inf; % 初始化最优代价值为无穷大 for iter = 1:maxIterACO % 外层迭代控制 antPaths = cell(numAnts,1); % 存储每只蚂蚁构造的路径 antScores = inf(numAnts,1); % 存储每只蚂蚁路径代价 for a = 1:numAnts % 遍历每只蚂蚁 current = startNode; % 每只蚂蚁从起点出发 path = current; % 初始化路径序列 visited = false(gridSize); % 初始化访问标记 visited(current(1),current(2),current(3)) = true; % 标记起点已访问 maxStep = 120; % 限制单只蚂蚁搜索步数,防止死循环 for step = 1:maxStep % 逐步扩展路径 if all(current == goalNode) % 判断是否到达终点 break; % 到达则停止构造 end % 结束到达判断 neighbors = getNeighborNodes(current, gridSize, obstacleMap, visited); % 获取邻域可行节点 if isempty(neighbors) % 若无可行邻域 break; % 结束当前路径构造 end % 结束空邻域判断 probs = zeros(size(neighbors,1),1); % 初始化选择概率 for j = 1:size(neighbors,1) % 逐个邻域节点计算概率 nb = neighbors(j,:); % 当前候选节点 tau = pheromone(nb(1),nb(2),nb(3)); % 读取候选节点信息素 eta = 1/(heuristicDist(nb, goalNode)+1e-6); % 计算启发式值,离目标越近越大 probs(j) = (tau^alpha) * (eta^beta); % 计算未归一化概率 end % 结束邻域遍历 probs = probs / sum(probs); % 概率归一化 cdf = cumsum(probs); % 构造累积分布 r = rand; % 生成随机数进行轮盘赌 selectIdx = find(r <= cdf,1,'first'); % 选择下一节点 current = neighbors(selectIdx,:); % 更新当前位置 path = [path; current]; % 记录路径节点 visited(current(1),current(2),current(3)) = true; % 标记已访问,避免回环 end % 结束单只蚂蚁步进 antPaths{a} = path; % 保存当前蚂蚁路径 antScores(a) = pathCost(path); % 计算当前蚂蚁路径代价 end % 结束蚂蚁循环 [iterBestScore, iterBestIdx] = min(antScores); % 找出本轮最优蚂蚁 if iterBestScore < bestACOScore % 若本轮优于历史最优 bestACOScore = iterBestScore; % 更新历史最优代价 bestACOPath = antPaths{iterBestIdx}; % 更新历史最优路径 end % 结束最优更新判断 pheromone = (1-rho) * pheromone; % 进行全局挥发,避免过度集中 for a = 1:numAnts % 为每只蚂蚁路径回传信息素 pth = antPaths{a}; % 读取路径 if size(pth,1) < 2 % 若路径长度不足 continue; % 跳过更新 end % 结束长度判断 delta = Q / antScores(a); % 计算信息素增量,优解给予更多强化 for s = 1:size(pth,1)-1 % 遍历路径边 node = pth(s,:); % 当前节点 pheromone(node(1),node(2),node(3)) = pheromone(node(1),node(2),node(3)) + delta; % 累加信息素 end % 结束路径边遍历 end % 结束信息素回传 end % 结束ACO主循环 四、PSO 对关键航路点连续精调 if isempty(bestACOPath) % 判断ACO是否得到可行路径 error('ACO 未生成可行路径'); % 若未生成则中断,提示上层流程 end % 结束可行性判断 waypoints = bestACOPath; % 将ACO输出路径作为初始航路点 numDim = numel(waypoints); % 将所有坐标展开为连续优化维度 numParticles = 30; % 定义粒子数量 maxIterPSO = 60; % 定义PSO迭代次数 w = 0.72; % 惯性权重 c1 = 1.49; % 个体学习因子 c2 = 1.49; % 群体学习因子 lb = repmat([1 1 1], size(waypoints,1), 1); % 每个航路点下界 ub = repmat(gridSize, size(waypoints,1), 1); % 每个航路点上界 X = zeros(numParticles, numDim); % 初始化粒子位置矩阵 V = zeros(numParticles, numDim); % 初始化粒子速度矩阵 for p = 1:numParticles % 初始化每个粒子 noise = randn(size(waypoints)) * 0.4; % 在ACO路径附近加入小扰动 X(p,:) = reshape(min(max(waypoints + noise, lb), ub),1,[]); % 将扰动后路径展平并限制边界 V(p,:) = randn(1,numDim) * 0.1; % 初始化速度 end % 结束粒子初始化 pBestX = X; % 个体最优位置初始化 pBestScore = inf(numParticles,1); % 个体最优代价初始化 gBestX = X(1,:); % 群体最优位置初始化 gBestScore = inf; % 群体最优代价初始化 for iter = 1:maxIterPSO % 进入PSO主循环 for p = 1:numParticles % 逐个评估粒子 curPath = reshape(X(p,:), [], 3); % 将粒子位置还原为三维路径 curPath(1,:) = startNode; % 强制起点不变 curPath(end,:) = goalNode; % 强制终点不变 score = smoothPathScore(curPath, obstacleMap, goalNode); % 计算综合路径代价 if score < pBestScore(p) % 若当前粒子优于个体历史最优 pBestScore(p) = score; % 更新个体最优代价 pBestX(p,:) = X(p,:); % 更新个体最优位置 end % 结束个体更新 if score < gBestScore % 若当前粒子优于全局最优 gBestScore = score; % 更新全局最优代价 gBestX = X(p,:); % 更新全局最优位置 end % 结束全局更新 end % 结束粒子评估 for p = 1:numParticles % 更新粒子位置和速度 r1 = rand(1,numDim); % 个体随机项 r2 = rand(1,numDim); % 群体随机项 V(p,:) = w*V(p,:) + c1*r1.*(pBestX(p,:) - X(p,:)) + c2*r2.*(gBestX - X(p,:)); % 速度更新公式 X(p,:) = X(p,:) + V(p,:); % 位置更新公式 X(p,:) = min(max(X(p,:), reshape(lb,1,[])), reshape(ub,1,[])); % 边界修正 end % 结束粒子更新 end % 结束PSO主循环 refinedPath = reshape(gBestX, [], 3); % 取出最优粒子对应的精调路径 refinedPath(1,:) = startNode; % 再次固定起点 refinedPath(end,:) = goalNode; % 再次固定终点 五、RNN 风险序列建模与代价修正 seqLen = 12; % 定义序列长度,用于模拟环境时序 numSeq = 240; % 定义训练序列数量 XTrain = cell(numSeq,1); % 创建输入序列容器 YTrain = zeros(numSeq,1); % 创建回归标签容器 for i = 1:numSeq % 逐条构造训练样本 t = linspace(0,1,seqLen); % 构造时间轴 baseRisk = 0.35 + 0.25*sin(2*pi*t + rand*2*pi); % 构造基础风险模式 noise = 0.05*randn(1,seqLen); % 加入随机扰动 seq = [baseRisk + noise; % 第一维表示风险强度序列 cos(2*pi*t) + 0.1*randn(1,seqLen); % 第二维表示风向变化特征 linspace(0,1,seqLen) + 0.1*randn(1,seqLen)]; % 第三维表示高度趋势特征 XTrain{i} = seq; % 保存单条序列输入 YTrain(i) = mean(seq(1,end-2:end)) + 0.15*rand; % 输出标签为末端风险估计 end % 结束样本构造 layers = [ % 构造RNN网络层 sequenceInputLayer(3) % 输入层,接收三维时序特征 lstmLayer(32,'OutputMode','last') % 使用LSTM增强长时依赖记忆 fullyConnectedLayer(16) % 全连接层进行特征映射 reluLayer % 激活层引入非线性 fullyConnectedLayer(1) % 输出单一风险评分 regressionLayer]; % 回归损失层 opts = trainingOptions('adam', ... % 训练优化器设为Adam 'MaxEpochs',40, ... % 最大训练轮数 'MiniBatchSize',32, ... % 小批量大小 'Shuffle','every-epoch', ... % 每轮打乱样本 'Verbose',false); % 关闭训练过程冗余输出 riskNet = trainNetwork(XTrain, YTrain, layers, opts); % 训练风险预测网络 testSeq = XTrain{1}; % 取一条测试序列 predRisk = predict(riskNet, testSeq); % 对测试序列进行风险预测 riskPenalty = 1 + 0.8*predRisk; % 将预测风险映射为路径代价惩罚系数 finalPathScore = smoothPathScore(refinedPath, obstacleMap, goalNode) * riskPenalty; % 将风险惩罚叠加到路径总代价 六、最优路线输出与三维可视化 figure('Color','w'); % 创建白底图窗,便于展示三维结果 hold on; % 保持图形,叠加绘制障碍和路径 [xo,yo,zo] = ind2sub(size(obstacleMap), find(obstacleMap)); % 获取障碍体素坐标 scatter3(xo, yo, zo, 25, 'filled', 'MarkerFaceColor',[0.6 0.6 0.6]); % 绘制障碍点云 plot3(bestACOPath(:,1), bestACOPath(:,2), bestACOPath(:,3), '-o', 'LineWidth',1.2, 'Color',[0.2 0.4 0.9]); % 绘制ACO粗路径 plot3(refinedPath(:,1), refinedPath(:,2), refinedPath(:,3), '-o', 'LineWidth',2.2, 'Color',[0.9 0.2 0.1]); % 绘制PSO精调路径 scatter3(startNode(1), startNode(2), startNode(3), 120, 'filled', 'MarkerFaceColor','g'); % 标记起点 scatter3(goalNode(1), goalNode(2), goalNode(3), 120, 'filled', 'MarkerFaceColor','r'); % 标记终点 grid on; % 打开网格,增强空间感 xlabel('X'); % 设置x轴标签 ylabel('Y'); % 设置y轴标签 zlabel('Z'); % 设置z轴标签 view(3); % 设置三维视角 title(sprintf('ACO-PSO-RNN 最优三维路径, 综合代价=%.3f', finalPathScore)); % 显示综合代价值 legend({'障碍区域','ACO粗路径','PSO优化路径','起点','终点'}, 'Location','best'); % 添加图例说明 hold off; % 结束图形叠加