1. 多机路径规划的本质高维、非凸、还有协同约束1.1 传统规划方法在三维集群场景里为什么不够用做多无人机协同集群避障路径规划最折腾的部分往往不是飞控而是给每一架飞机找一条“绕开威胁、贴着合理高度、拐弯别太猛、总航程还短”的路径。当我把问题限定在100米乘100米乘50米的仿真区域里让3架无人机同时规划各自路径时传统的A*、RRT、人工势场这些方法会很快暴露出各自的短板。A*算法需要在三维栅格上做搜索栅格分辨率一旦提高状态数量会呈三次方爆炸。分辨率降低确实能跑动但输出路径是锯齿状的后续要做大量平滑操作而且道路通道宽度会随分辨率变化规划结果不具备稳定性。RRT系列算法在高维空间采样很快但名声长期是“能满足约束却不保证最优”在目标函数里有四项成本需要同时最小化的情况下RRT生成的路径很可能绕远路或者频繁出现急转弯。人工势场法在障碍物稀疏时很优雅但在威胁源较多、存在多个禁飞区的场景中很容易陷入局部极小值无人机悬在威胁区旁边不走了。多机协同这个问题就更麻烦单机的最优路径拿出来叠在一起不代表集群整体可行。两架飞机可能在同一时刻飞到同一个经纬度附近机间距离小于安全间距这在工程上是不可接受的。因此多机路径规划必须把每架飞机的路径放在同一个优化问题里去搜索优化变量维度会随着无人机数量线性上升而且因为安全间距约束各机路径在目标函数里是相互耦合的不是一个简单的“多机各自独立求最优再拼接”的问题。偏偏目标函数里还同时压着路径、高度、威胁、转角四块成本整个可行域是非凸的。没有梯度信息可用栅格化又会丢失精度这时候用元启发式算法在连续坐标空间里搜索就成了很自然的选择。我最终选定哈里斯鹰算法HHO作为基座再引入瞬态三角机制得到TTHHO原因是HHO结构简单、参数少、收敛速度快而且它模拟鹰群捕猎的过程天然适合“全局探索-局部开发”交替平衡。接下来我把整个建模和求解链路完整展开。1.2 四项成本对应到实际任务里到底意味着什么标题里“最低成本路径、高度、威胁、转角”这十个字展开说就是无人机执行侦察、巡检、物资投送等任务时最关心的四类约束。路径成本对应飞行里程直接换算成任务时间、电量消耗和出勤效率。高度成本对应飞行安全和隐蔽性飞太低容易撞地形飞太高容易被探测到也增加空气阻力所以在任务规划里通常会给一个最低安全高度和一个最优巡航高度区间。威胁成本对应禁飞区、雷达探测源、障碍物、天气危险区等无法直接飞越的区域路径必须绕开或者以最小暴露时间通过。转角成本对应无人机机动能力巡检载荷和固定翼平台对转弯半径很敏感急转弯会带来额外能耗和姿态不稳定有时还会导致云台画面失效。把四个目标通过权重合并成一个加权总成本既能让优化算法有明确标量可以比较也能通过调整权重表达不同任务的偏好。比如紧急侦查任务会把路径成本权重拉高隐蔽任务会把威胁成本权重大幅提高大载荷平台则更重视转角成本。这就是后文要写的适应度函数设计的出发点。2. 标准HHO的短板与瞬态三角改进的数学思路2.1 标准哈里斯鹰算法能量衰减驱动的软硬围攻在把TTHHO讲清楚之前必须先回顾标准HHO。哈里斯鹰优化算法的核心思想是模拟哈里斯鹰群体捕猎兔子的过程鹰群先在天空中随机游走发现猎物后根据猎物逃跑能量决定采取软围攻、硬围攻还是渐进式俯冲捕捉。每次迭代时算法用一个逃逸能量因子E控制阶段切换。设当前迭代次数为t最大迭代次数为T初始随机能量E0在[-1,1]区间内均匀随机生成E的定义为E 2 * E0 * (1 - t / T)当|E|≥1时算法执行探索阶段鹰群个体在全局范围内随机搜索猎物。探索阶段有两种策略以50%概率选择。第一种策略基于随机个体X(t1) X_rand(t) - r1 * |X_rand(t) - 2*r2*X(t)|第二种策略基于种群平均位置X(t1) X_rabbit(t) - X_mean(t) - r3*(lb r4*(ub - lb))其中r1到r4都是[0,1]均匀随机数X_rabbit是最优个体X_mean是种群质心lb和ub是变量边界。当|E|1时进入开发阶段算法根据随机数r和|E|的大小分成四种策略r≥0.5且|E|≥0.5时采用软围攻r≥0.5且|E|0.5时采用硬围攻r0.5且|E|≥0.5时采用渐进式快速俯冲软围攻r0.5且|E|0.5时采用渐进式快速俯冲硬围攻。软围攻的更新公式是delta X_rabbit(t) - X(t) J 2 * (1 - r5) X(t1) delta - E * |J * X_rabbit(t) - X(t)|J模拟兔子跳跃强度r5是[0,1]随机数。硬围攻则直接把当前位置向猎物方向压缩X(t1) X_rabbit(t) - E * |delta|渐进式俯冲版本会在上述位置基础上判断是否接受不满足时再叠加Levy飞行随机步长继续搜索。用生活化类比说就是鹰群先在高空四处飞寻找目标发现兔子之后评估兔子还剩多少跑跳力气力气还大就采取比较温和的包围消耗力气明显不足就扑上去收紧包围圈。整个搜索过程由能量E统一调度前中期偏全局后期偏局部。2.2 瞬态三角因子怎么改变搜索行为标准HHO在低维基准函数上表现很好但在三维路径规划这种高维问题上有一个明显问题E是随迭代单调递减的一旦算法在某个局部最优附近进入了开发阶段后面很难再跳出去最终结果是早熟收敛、路径不是全局最优。瞬态三角的改进思路就是给能量衰减曲线施加周期性扰动让“开发-探索”的分界不再是一条单向下坡线而是带有波动回弹。我采用的实现方式定义瞬态三角因子TTFTTF(t) 0.6 0.4 * sin(pi * t / T)然后把TTHHO的能量改成E 2 * E0 * (1 - t / T) * TTF(t)这个改动的作用可以从迭代进程来理解。t较小时sin值接近0TTF约等于0.6能量整体缩小算法会比标准HHO更早进入开发阶段对前期已找到的较优区域加大挖掘力度。t进入中后期时sin值开始周期性波动TTF会在0.2到1.0之间起伏使得能量可能从开发区间重新弹回探索区间让一部分个体暂时离开局部最优区域去更远处搜索。这种“回火”效果在标准HHO里是做不到的因为标准HHO的能量只会逐步衰减到零。除了能量整形TTHHO还会在位置更新公式中加入三角扰动项。例如软围攻更新改为X(t1) delta - E * |J * X_rabbit(t) - X(t)| * (1 0.2 * cos(2 * pi * t / T))探索阶段随机个体策略也改为X(t1) X_rand(t) - r1 * |X_rand(t) - 2*r2*X(t)| * (1 0.2 * cos(pi * t / T))这里的0.2是三角扰动幅值gamma实际调试中可以取0.1到0.3。扰动项的存在会让粒子在局部收敛路径上产生小幅的周期性摆动相当于给停滞的个体一个脉动推力避免后期因步长单调缩小而完全丧失多样新搜索能力。2.3 TTHHO整体流程探索、开发、俯冲如何串起来TTHHO的主流程和标准HHO保持一致只是每一步的位置更新中融入了瞬态三角因子和三角函数扰动。整体骨架是初始化种群规模pop、最大迭代次数T、变量维度dim、边界lb和ub随机生成初始种群计算每个个体的适应度找出当前最优个体X_rabbit进入主循环对每个个体计算当前迭代对应的E值判断|E|与0.5、随机数r的关系分别执行探索、软围攻、硬围攻、渐进式俯冲等更新策略对所有越界坐标做边界修复重新计算适应度贪心保留更优个体更新全局最优X_rabbit与收敛曲线循环结束后输出最优路径和最优成本。实际编码里我个人会把能量计算单独抽成一个函数因为瞬态三角策略如果后续还要加余弦分量或者指数缩放只改这一个函数就够了主逻辑不用动。后文Matlab代码实现章节会给出完整可运行的骨架。3. 四项成本的目标函数设计每一分权重都对应飞行代价3.1 路径成本与转角成本的计算公式路径成本的物理含义很直观把所有航迹点按顺序连起来累加每一段的欧氏距离。如果一架无人机规划出M个航迹点其中第1个是起点、第M个是终点路径成本可以写成J_path sum_{i1}^{M-1} ||P(i1) - P(i)||其中P(i) (x_i, y_i, z_i)。这段计算代码很简单但要注意的是起点和终点不参与优化它们只是路径的首尾锚点算法只优化中间M-2个航迹点的三维坐标。转角成本衡量的是航迹方向变化的剧烈程度。先计算每一段路径的方向向量v(i) P(i1) - P(i)相邻两个方向向量的夹角通过点积计算余弦值cos(theta_i) (v(i) · v(i1)) / (||v(i)|| * ||v(i1)||) theta_i arccos(cos(theta_i))转角成本就是所有中间转角之和J_turn sum_{i1}^{M-2} theta_i我这里没有对转角做平方放大因为平方会过度惩罚中等角度的转弯让算法宁可绕大圈也不转小弯。更合理的做法是设定一个最大允许转角阈值比如45度超过阈值的部分按平方惩罚正常范围内按线性累计。3.2 高度成本与威胁成本区间惩罚和信息素衰减高度成本的设计比路径成本稍微讲究。不同任务对高度要求不一样我常用的方案是设定最优巡航高度区间[z_low, z_high]在这个区间内高度成本为零超出区间开始惩罚J_height sum_{i1}^{M} max(0, z_i - z_high)^2 max(0, z_low - z_i)^2这个方案的优点是允许无人机在一定高度带内自由浮动不会把航迹压成一条僵硬的等高线同时又禁止贴地飞行和过高飞行。对于需要保持恒高飞行的任务也可以改成高度方差指标但大多数避障规划场景用区间惩罚更实用。威胁成本是目标函数里最关键的一项。我习惯把威胁源建模成带半径的球形区域每个威胁源有中心坐标c_k和威胁半径R_k。路径点P(i)到第k个威胁源的距离记为d(i,k)威胁惩罚定义为J_threat sum_{i1}^{M} sum_{k1}^{K} max(0, R_k margin - d(i,k))^2只有当路径点进入威胁半径外加一个安全裕量margin的范围内时才会产生惩罚并且离威胁中心越近惩罚增长越快。这种做法比简单的“进入禁飞区就固定罚分”更好因为它能给算法提供一个渐变的梯度信息算法能判断“往左挪一点比往右挪一点代价更低”的趋势搜索效率显著提高。3.3 多机协同安全间距用约束惩罚而不是改目标函数标题强调“协同集群避障”所以在目标函数之外还必须处理机间碰撞。我的处理方式是把它作为约束惩罚项加入总成本而不是把机间距离作为第五个目标成本。原因是安全间距是一个硬性安全要求不应当和路径长度做权重取舍一旦进入惩罚区就应迅速把方案压到不可接受的高成本。具体做法是把所有无人机的路径按航迹点索引对齐在每个索引点位置计算任意两架无人机之间的三维距离。如果距离小于最小安全间距d_safe则累加惩罚J_inter sum_{uv} sum_{i1}^{M} max(0, d_safe - ||P_u(i) - P_v(i)||)^2 * penaltyCoefpenaltyCoef一般取一个很大的数比如10000确保出现机间碰撞时总成本迅速飙升。总适应度函数最终写成TotalCost w1*J_path w2*J_height w3*J_threat w4*J_turn J_inter其中w1到w4是四项目标的权重需要归一化到合适的量级。下面表格是我在模拟项目X里经常使用的参考权重和成本量级成本项典型公式参考权重设置说明路径成本相邻航迹点欧氏距离之和0.35量级大权重不宜过高高度成本偏离高度区间平方惩罚0.15区间内零成本威胁成本进入威胁区半径内平方惩罚0.35优先级最高转角成本相邻段夹角之和0.15量级较小易被忽略机间安全惩罚距离小于安全间距的平方惩罚作为约束加入系数取10000各个成本量纲不同直接加权会导致某项主导。建议在前处理阶段将各成本除以一个基准值做归一化比如路径成本除以起终点直线距离威胁成本除以最大可能威胁暴露系数。否则你调出来的w1到w4换一个场景后可能完全不适用。4. Matlab代码实现路径编码、适应度函数与TTHHO主循环4.1 路径编码一份个体装下所有无人机的航迹多机协同规划最核心的工程决策是编码方式。我采用的做法是把所有无人机的中间航迹点坐标拼接成一个一维向量作为TTHHO的一个个体。如果无人机数量是U每架无人机中间航迹点数量是M_node那么优化变量维度就是U * M_node * 3其中3对应x、y、z三个坐标。numUav 3; % 无人机数量 midNode 6; % 每架无人机中间航迹点数量 dim numUav * midNode * 3; % 优化变量维度 % 种群初始化每个个体都按 [UAV1_x, UAV1_y, UAV1_z, UAV2_x, ...] 排列 lb zeros(1, dim); ub zeros(1, dim); % 假设仿真区域 x:[0,100], y:[0,100], z:[5,30] for d 1:dim if mod(d-1, 3) 2 lb(d) 5; % z 轴下界 ub(d) 30; % z 轴上界 else lb(d) 0; ub(d) 100; end end popMat repmat(lb, popSize, 1) rand(popSize, dim) .* (repmat(ub - lb, popSize, 1));在解码时需要把一维向量还原成每架无人机按顺序排列的三维坐标。先reshape成UmidNode3再用循环或者permute提取每架飞机的航迹矩阵function paths DecodePath(individual, numUav, midNode) % individual 是行向量长度 numUav * midNode * 3 mat3 reshape(individual, numUav, midNode, 3); for u 1:numUav % 每架飞机路径矩阵是 midNode x 3 path_u squeeze(mat3(u, :, :)); paths{u} [startPoint(u, 1:3); path_u; targetPoint(u, 1:3)]; end end起点和终点各自单独存储不进优化变量这样能保证所有个体生成的路径首尾固定避免算法在优化过程中把起点或终点改走样。4.2 适应度函数把四项成本和机间约束全部算进去适应度函数是整个代码的地基。我写的版本会接收单个个体、起点终点矩阵、威胁源信息、权重向量以及安全间距返回一个标量总成本。为了提升可读性各个成本分别用小函数计算。function totalCost CalCost(ind, params) % 参数解析 paths DecodePath(ind, params.numUav, params.midNode); w params.weight; % [w1, w2, w3, w4] threats params.threats; % 每行: x, y, z, radius dSafe params.dSafe; J_path 0; J_height 0; J_threat 0; J_turn 0; J_inter 0; for u 1:params.numUav p paths{u}; % 路径成本 segLen sqrt(sum(diff(p, 1, 1).^2, 2)); J_path J_path sum(segLen); % 高度成本目标区间 [zLow, zHigh] z p(:, 3); heightPen sum(max(0, z - params.zHigh).^2) sum(max(0, params.zLow - z).^2); J_height J_height heightPen; % 威胁成本 for i 1:size(p, 1) for k 1:size(threats, 1) d norm(p(i, :) - threats(k, 1:3)); r threats(k, 4); if d r params.margin J_threat J_threat (r params.margin - d)^2; end end end % 转角成本 v diff(p, 1, 1); for i 1:size(v, 1) - 1 cosTheta dot(v(i, :), v(i1, :)) / (norm(v(i, :)) * norm(v(i1, :)) eps); cosTheta min(1, max(-1, cosTheta)); J_turn J_turn acos(cosTheta); end end % 机间安全间距约束惩罚 for u1 1:params.numUav for u2 u1 1:params.numUav p1 paths{u1}; p2 paths{u2}; distMat sqrt(sum((p1 - p2).^2, 2)); J_inter J_inter sum(max(0, dSafe - distMat).^2) * params.penaltyCoef; end end % 归一化按场景设定这里直接按权重合成 totalCost w(1)*J_path w(2)*J_height w(3)*J_threat w(4)*J_turn J_inter; end这里有一点必须说明威胁成本只按航迹点计算会漏掉“线段穿过威胁区而航迹点都在威胁区外”的情况。更稳妥的做法是对每段路径做三等分采样用采样点去判断威胁成本后文踩坑部分会专门展开。4.3 TTHHO主循环探索与开发的切换逻辑TTHHO主循环和标准HHO的差别集中在E的计算和扰动项。我把瞬态三角因子单独提取出来方便以后调整幅值gamma和频率。% TTHHO主循环 for t 1:maxIter E0 2 * rand - 1; ttFactor 0.6 0.4 * sin(pi * t / maxIter); % 瞬态三角因子 randDisturb1 1 0.2 * cos(pi * t / maxIter); randDisturb2 1 0.2 * cos(2 * pi * t / maxIter); for i 1:popSize E 2 * E0 * (1 - t / maxIter) * ttFactor; if abs(E) 1 % 探索阶段 if rand 0.5 rIdx randi(popSize); newInd X(rIdx, :) - rand(1, dim) .* abs(X(rIdx, :) - 2 * rand(1, dim) .* X(i, :)) .* randDisturb1; else meanX mean(X, 1); newInd bestX - meanX - rand(1, dim) .* (lb rand(1, dim) .* (ub - lb)); end else delta bestX - X(i, :); J 2 * (1 - rand); if rand 0.5 abs(E) 0.5 % 软围攻 newInd delta - E .* abs(J * bestX - X(i, :)) .* randDisturb2; elseif rand 0.5 abs(E) 0.5 % 硬围攻 newInd bestX - E .* abs(delta); elseif rand 0.5 abs(E) 0.5 % 渐进式俯冲软围攻 Y bestX - E .* abs(J * bestX - X(i, :)); yCost CalCost(Y, params); if yCost CalCost(X(i, :), params) newInd Y; else Z Y levyStep(dim); if CalCost(Z, params) yCost newInd Z; else newInd Y; end end else % 渐进式俯冲硬围攻 Y bestX - E .* abs(J * bestX - mean(X, 1)); yCost CalCost(Y, params); if yCost CalCost(X(i, :), params) newInd Y; else Z Y levyStep(dim); if CalCost(Z, params) yCost newInd Z; else newInd Y; end end end end % 边界修复 newInd BoundaryRepair(newInd, lb, ub); if CalCost(newInd, params) CalCost(X(i, :), params) X(i, :) newInd; end end [bestCost, bestIdx] min(CostList); bestX X(bestIdx, :); convergence(t) bestCost; endLevy飞行的具体实现如下function newLevy levyStep(dim) beta 1.5; sigma (gamma(1 beta) * sin(pi * beta / 2) / (gamma((1 beta) / 2) * beta * 2^((beta - 1) / 2)))^(1 / beta); u randn(1, dim) * sigma; v randn(1, dim); step u ./ (abs(v).^(1 / beta) 1e-10); newLevy 0.01 * step; end边界修复我这里推荐用反射式而不是截断式。截断式会把坐标直接拉回边界容易让大量个体堆积在边界上导致路径贴边反射式则把越界分量按边界做镜像折回能保留更多搜索信息function newInd BoundaryRepair(ind, lb, ub) newInd ind; overHigh newInd ub; overLow newInd lb; newInd(overHigh) 2 * ub(overHigh) - newInd(overHigh); newInd(overLow) 2 * lb(overLow) - newInd(overLow); % 反射后仍可能越界二次钳位 newInd min(max(newInd, lb), ub); end5. 仿真实验TTHHO相对标准HHO和PSO到底强在哪里5.1 实验场景与参数配置我在模拟项目X里搭了一个标准测试场景。仿真区域为100米乘100米乘50米3架无人机分别从不同起点飞往不同目标点。4个威胁源分布在航路周围每个威胁半径6到10米。无人机期望高度区间设为10到18米最小安全间距5米。参数设置值无人机数量3每架中间航迹点6种群规模40最大迭代次数200威胁源数量4最低安全高度5米最高安全高度30米最优高度区间10到18米最小机间距离5米权重w1:w2:w3:w40.35 : 0.15 : 0.35 : 0.15对比算法包括标准HHO、经典PSO和TTHHO每个算法各跑30次统计最优成本的均值、最小值和标准差。这是一个典型的三维空间多约束多峰优化问题适合检验算法跳出局部最优的能力。5.2 收敛曲线与三维路径的典型结果从收敛曲线的行为看TTHHO在前期50代内的收敛速度和标准HHO差别不大因为此时瞬态三角因子还没进入到明显的波动区。但50代之后标准HHO的能量几乎衰减到接近零大部分个体只在最优解附近小范围修订收敛曲线开始持平TTHHO的瞬态三角因子进入周期性回升区间每隔一定代次就会有一批个体被重新推回探索阶段因此收敛曲线会出现阶段性的小幅跳变然后继续下降。一次典型运行中TTHHO搜索到的最优总成本比标准HHO低了大约14%比PSO低了约22%。这个差距主要来自两部分一是威胁成本TTHHO规划出的路径能够以更大的安全裕量绕过威胁源不会紧贴威胁半径边缘走二是转角成本瞬态三角的扰动使路径更平滑相邻航迹段夹角明显小于标准HHO的路径。三维路径图上TTHHO给出的三架无人机航迹整体呈平滑弧线绕开威胁区机间最近距离约6.2米满足5米安全间距约束标准HHO的路径则在两个威胁源之间出现了明显的折线绕行且其中一段机间距离低至4.3米属于违反约束的情况。把三条路径用Matlab的plot3画出来再叠加威胁源的透明球面能非常直观地看到算法差异。绘制威胁源的核心代码是调用sphere生成球面坐标再平移到威胁中心设置FaceAlpha为0.2就可以做出半透明效果这在论文插图里也很常用。5.3 权重敏感性四项成本的权重到底怎么拍权重配置决定了最终路径的“性格”。我做过一组简单的敏感性实验把威胁成本权重从0.35提高到0.5路径成本权重从0.35降到0.2。结果是路径总里程增加了约11%但路径到最近威胁源的最小距离从3.8米提升到了5.7米安全性明显改善。这说明威胁权重对路径规避行为的灵敏度很高。转角成本权重的灵敏度相对较低因为单次平均转角本身量级很小除非把转角代价改成超过阈值后的平方惩罚并压低阈值否则它很难主导优化方向。但它的存在能有效避免航迹点出现“来回折返”的情况所以不能彻底删掉。高度成本权重不建议设置得太高因为它只在高度越界时才有非零值设太高会导致算法过度追求平贴参考高度反而让路径在水平面上绕更远损害路径成本。如果读者不想每次调权重我建议做一个简单的参数扫描脚本把w3从0.25到0.5按0.05步进扫一遍输出各权重下的最优路径成本和最小威胁距离再根据任务需求选一组接受方案。这类扫描在Matlab里用parfor并行几分钟就能跑完比拍脑袋定权重靠谱得多。6. 调试过程中踩过的坑四个让结果看起来没问题却不可用的细节6.1 威胁判断只看航迹点漏掉线段穿越威胁区最初版本的威胁成本计算只遍历航迹点也就是检查每个路径点是否进入威胁半径。结果TTHHO跑出来的路径在三维图上非常“完美”每个航迹点都绕开了威胁区但我把路径数据拉出来逐段检查时发现有一段长达20米的直线航迹从威胁区内部直接穿过去了而这段线段的两端恰好都在威胁区外面。原因很简单优化变量只约束了离散的航迹点线段是线性插值出来的威胁区可能正好卡在两点之间。解决方法是在威胁成本计算时对每段路径做加密采样比如把每段路径分成5等份用这5个采样点去判断威胁代价。虽然计算量会增加但在无人机数量不多、航迹点 不到10个的场景下完全可接受。修改之后路径的真实安全性明显提升不再出现线段穿威胁区的情况。6.2 边界截断修复导致路径点堆叠在边界上早期版本处理越界个体用的是最直接的截断方法坐标小于lb就置为lb大于ub就置为ub。这个操作简单但副作用很快显现出来。适应度函数里有转角成本和高度成本截断会把大量航迹点压到区域边界上尤其是z轴上下边界导致路径出现一段段的贴地或贴顶直线飞行转角在边界处出现突变算法还很难通过后续迭代把这些点推离边界。改成反射式边界修复之后越界坐标会以边界为镜面回到可行区域内种群多样性保住了。我在代码里还加了一个二次钳位作为兜底防止反射后再次越界。这个修改属于典型的“看起来小事一桩实际影响巨大”的调试项。6.3 转角成本权重过大造成末端抖动某一版参数里我把转角的权重提高了想提升路径平顺度。结果三维图上出现了非常奇怪的现象路径在接近目标点前突然开始小幅抖动像蛇一样扭动总成本反而比原来更高。原因是我把进入目标点的末端角也计算进了转角成本而无人机为了正对目标方向进入经常需要在最后一个航迹点附近做一次急转这一项被平方放大后优化器就决策出“用多个小幅转角替代一个大幅转角”的反向策略也就是末端抖动。解决方案是把转角成本分成两部分中途航迹点之间的转角按正常方式累计进入目标点的末端转角单独计算并乘以一个较小的权重或者干脆不纳入目标函数。调整之后末端抖动消失路径也更符合固定翼无人机的实际转弯特性。6.4 机间安全距离检查用错对齐方式导致误判碰撞多无人机协同避障里机间距离检查不是简单的“路径点索引相同就比一次距离”。不同无人机路径长度不同起点到终点的累计里程也不同如果直接按航迹点索引对齐去比较距离会出现两架飞机实际上在时间上根本没碰到一起却被误判为互相碰撞的情况导致算法优化出过度保守的绕行路线。我的做法是把每架无人机的路径按累计航迹里程归一化到0到1然后在同一归一化里程位置处比较三维距离。比如取0.1、0.2、直到1.0共10个归一化位置在每个位置用插值求出各机坐标再计算距离是否小于安全间距。这样对齐的是“飞行进度”而不是“航迹点编号”更符合实际飞行中时间对齐的逻辑。多机速度不一致的场景这一步尤其重要。我在把TTHHO从单机扩展到三机的过程中遇到最多的问题就是维度对齐。单机代码跑通后多机版本经常出现结果很差但完全不报错的情况基本都出在reshape顺序或者路径解码索引上。建议在解码函数之后加一段尺寸断言检查每个路径矩阵的行数和列数是否符合预期这种防御性检查能省下大量的排查时间。三维路径规划加上瞬态三角改进之后TTHHO在高维搜索上的表现确实比标准HHO稳不少但真正让一套代码能落地运行的往往不是算法本身而是这些隐藏在成本和约束角落里的细节处理。如果把仿真区域扩大、无人机数量增加到10架以上还可以考虑把威胁采样和目标函数评估部分做并行化让TTHHO的种群评估速度跟得上问题规模的扩张。