1. 从标题拆解这个课题到底在做什么
1.1 多无人机三维路径规划的真实需求场景
先把这个标题拆开看。“多无人机三维路径规划”这几个字,落到实际工程里,指的是在一个三维空间中,同时给多架无人机规划出从起点到终点的飞行轨迹,而且这些轨迹要满足一堆约束条件——不能撞山、不能撞楼、不能互相撞、不能飞太高被雷达发现、不能飞太低撞树、不能拐太急的弯。这跟单无人机路径规划完全是两个难度级别,因为多了一个维度:无人机之间的协同与冲突消解。
我接触过不少做无人机集群的团队,早期很多人都是先做单机规划,然后简单地把多架无人机的路径叠加在一起,结果一仿真就发现各种碰撞、死锁、震荡。为什么?因为单机最优不等于集群最优。一架无人机为了省能量选择了一条捷径,可能恰好堵住了另一架无人机的必经之路。所以多无人机路径规划本质上是一个多目标、多约束、高维度的组合优化问题。
这个课题的典型应用场景包括:灾害救援中的区域搜索、农业植保的编队作业、物流配送的末端投送、军事侦察的协同覆盖等。不同场景对“成本”的定义不一样,有的看重总航程最短,有的看重被雷达发现的概率最低,有的看重转弯次数最少以节省能量。标题里提到的“最低成本:路径、高度、威胁、转角”正好覆盖了这四个核心维度。
1.2 为什么选天鹰优化算法(AO)
天鹰优化算法(Aquila Optimizer,简称AO)是2021年提出的一种群智能优化算法,灵感来源于天鹰在自然界中的四种捕猎行为:高空翱翔搜索、俯冲攻击、低空慢速追击、地面抓捕。这四种行为对应算法中的四个位置更新阶段,分别负责全局探索和局部开发。
选AO来做多无人机路径规划,核心原因有几个。第一,AO的探索能力比较强,在高维空间中不容易过早收敛到局部最优,这对三维路径规划很关键,因为三维空间的局部最优陷阱比二维多得多。第二,AO的参数比较少,主要就是种群规模和迭代次数,调参负担轻,适合工程落地。第三,AO的四个阶段切换机制比较灵活,可以根据迭代进度自适应地平衡探索和开发,这在路径规划这种前期需要大范围搜索、后期需要精细调整的任务中很有优势。
当然,AO也不是没有缺点。它的收敛速度在后期可能不如一些经典的局部搜索算法,所以在实际使用中,我通常会把它和三次样条插值或者B样条曲线结合起来,用AO做全局路径点搜索,用样条做局部平滑,这样既保证了全局最优性,又保证了路径的平滑可飞。
1.3 目标函数的四个成本维度怎么理解
标题里明确写了目标函数包含四个成本:路径成本、高度成本、威胁成本、转角成本。这四个维度不是随便凑的,每一个都对应着实际飞行中的硬约束或软约束。
路径成本就是总航程,直接影响飞行时间和能量消耗。高度成本通常是一个分段函数,飞得太高会增加被探测的概率,飞得太低会增加撞地风险,所以存在一个“最优高度带”。威胁成本一般用雷达探测概率模型或者防空火力覆盖模型来表示,离威胁源越近成本越高。转角成本反映的是路径的平滑程度,转角越大,无人机需要减速再加速,能量消耗和飞行时间都会增加,而且大转角可能导致固定翼无人机失速。
把这四个成本加权求和,就得到了总的代价函数。权重的选择非常关键,不同任务场景下权重的分配完全不同。比如侦察任务可能更看重威胁成本,物流任务可能更看重路径成本。我一般建议先用层次分析法或者熵权法做一次权重初筛,然后再根据仿真结果微调。
2. 算法核心细节与实操要点拆解
2.1 三维环境建模的几种主流方式
做三维路径规划,第一步是把真实环境抽象成算法能处理的数学模型。目前主流的方式有三种:栅格法、矢量法和点云法。
栅格法是把三维空间切成一个个小立方体,每个立方体标记为可通行或不可通行。优点是实现简单,缺点是内存消耗大,分辨率稍微高一点就会爆炸。我一般建议在Matlab里用稀疏矩阵存储,只记录障碍物栅格,不要全量存储。
矢量法是用多边形或多面体来描述障碍物,优点是精度高、内存省,缺点是碰撞检测比较复杂。在Matlab里可以用alphaShape或者convhull来构建障碍物的凸包,然后用射线法做碰撞检测。
点云法适合处理真实地形数据,比如用激光雷达扫描得到的地形点云。Matlab的pointCloud类和pcfitplane函数可以很方便地做地面分割和障碍物提取。
实际项目中,我通常采用混合策略:大范围地形用栅格法做粗规划,局部障碍物用矢量法做精细避障。这样既控制了计算量,又保证了安全性。
2.2 天鹰优化算法的四个阶段与路径规划的映射
AO的四个阶段在路径规划中有很直观的物理意义。第一阶段是高空翱翔,对应算法在全局范围内随机搜索候选路径点,这时候种群多样性最高,适合探索未知区域。第二阶段是俯冲攻击,对应算法在发现潜在最优区域后快速收缩搜索范围,这时候步长较大,适合快速逼近最优解。第三阶段是低空慢速追击,对应算法在最优解附近做精细搜索,步长较小,适合局部开发。第四阶段是地面抓捕,对应算法直接向当前最优解靠拢,加速收敛。
在代码实现中,这四个阶段的切换通常由迭代次数控制。前30%的迭代主要用第一阶段,30%到60%用第二阶段,60%到90%用第三阶段,最后10%用第四阶段。但这个比例不是固定的,我试过根据种群多样性的变化动态调整阶段切换点,效果比固定比例好不少。
还有一个细节:AO的位置更新公式里有一个随机数控制探索方向,这个随机数的分布对算法性能影响很大。标准AO用的是均匀分布,但在路径规划中,我倾向于用Levy飞行分布替代均匀分布,因为Levy飞行的重尾特性更适合在三维空间中做长距离跳跃搜索。
2.3 路径编码方式与约束处理技巧
路径编码是连接算法和问题的桥梁。在三维路径规划中,最常见的编码方式是直接把路径点的坐标作为优化变量。比如规划10个中间路径点,每个点有x、y、z三个坐标,那么优化变量的维度就是30。这种编码方式直观,但维度高,搜索空间大。
另一种编码方式是用控制点加样条曲线。只优化少量控制点,然后用B样条生成平滑路径。这样变量维度低,而且天然满足平滑性约束。我比较推荐这种方式,尤其是在路径点数量较多的时候。
约束处理方面,主要有三种策略:惩罚函数法、修复法和可行解优先法。惩罚函数法最简单,把约束违反量乘以一个大系数加到目标函数里。但惩罚系数不好选,太小了约束不起作用,太大了会导致算法只关注可行性而忽略最优性。修复法是在每次迭代后把不可行解强制拉回可行域,适合约束比较简单的情况。可行解优先法是在选择最优解时优先考虑可行解,适合约束复杂但可行域连通的情况。
我在实际项目中用得最多的是自适应惩罚函数法:惩罚系数随着迭代次数逐渐增大,前期允许一定程度的约束违反以保持种群多样性,后期严格惩罚以确保最终解可行。
2.4 多无人机协同的冲突消解机制
多无人机协同的核心难点是冲突消解。两架无人机的路径在时空上重叠,就叫冲突。冲突分为两种:一种是空间冲突,即同一时刻两架无人机距离太近;另一种是时间冲突,即两架无人机先后经过同一位置但时间间隔太短。
解决冲突的方法主要有三类:速度调整法、路径调整法和优先级法。速度调整法是保持路径不变,调整无人机的飞行速度来错开时间。路径调整法是保持速度不变,调整路径来错开空间。优先级法是给每架无人机分配优先级,低优先级的无人机主动避让高优先级的。
在AO框架下,我通常把冲突消解嵌入到目标函数里:当两架无人机的路径点距离小于安全阈值时,给目标函数加一个冲突惩罚项。这样算法在优化过程中会自动避开冲突区域。但这种方法有个问题:如果冲突惩罚项权重太大,算法可能会为了避冲突而牺牲路径质量;如果权重太小,又可能无法完全消解冲突。我的经验是先用一个中等权重做粗规划,然后对仍然存在的冲突做局部精细调整。
3. 完整实操流程与Matlab代码实现
3.1 环境初始化与参数配置
先说一下我的Matlab环境配置。我用的是Matlab 2023b,这个版本对矩阵运算和并行计算的支持比较成熟。如果你用的是更早的版本,大部分代码也能跑,但可能需要在某些函数上做兼容处理。
环境初始化的第一步是定义三维空间的范围。假设我们规划的区域是1000米×1000米×500米的空间,用代码表示就是:
% 三维空间范围定义 x_min = 0; x_max = 1000; y_min = 0; y_max = 1000; z_min = 0; z_max = 500; % 起点和终点 start_pos = [50, 50, 100]; goal_pos = [950, 950, 400]; % 无人机数量 num_uav = 4; % AO算法参数 pop_size = 50; % 种群规模 max_iter = 300; % 最大迭代次数 dim = 30; % 优化变量维度(10个路径点×3个坐标)种群规模的选择有个经验公式:一般取优化变量维度的2到5倍。这里维度是30,所以种群规模取50到150比较合适。我取50是为了演示,实际项目中如果计算资源允许,建议取100以上。
最大迭代次数取决于问题的复杂度和你对精度的要求。300次迭代对于中等复杂度的三维路径规划通常够用,但如果障碍物特别密集或者无人机数量特别多,可能需要500次以上。
3.2 障碍物建模与威胁区域设置
障碍物建模我用的是圆柱体和球体的组合。圆柱体代表建筑物或山体,球体代表雷达威胁区域。在Matlab里,判断一个点是否在圆柱体内很简单:
% 圆柱体障碍物参数 cylinder_center = [300, 300]; cylinder_radius = 80; cylinder_height = 200; % 判断点是否在圆柱体内 function inside = isInsideCylinder(point, center, radius, height) dist_xy = norm(point(1:2) - center); inside = (dist_xy <= radius) && (point(3) <= height); end球体威胁区域类似:
% 球体威胁区域参数 sphere_center = [600, 600, 250]; sphere_radius = 150; % 判断点是否在球体内 function inside = isInsideSphere(point, center, radius) inside = norm(point - center) <= radius; end威胁成本的计算我用的是反距离加权模型:离威胁中心越近,成本越高。具体公式是:
function cost = threatCost(point, threat_centers, threat_radii) cost = 0; for i = 1:length(threat_centers) d = norm(point - threat_centers(i,:)); if d < threat_radii(i) cost = cost + (threat_radii(i) - d) / threat_radii(i); end end end这个模型的好处是连续可导,适合优化算法处理。缺点是当点刚好在威胁边界上时成本为零,可能导致算法贴着威胁边界飞。我的改进方法是给威胁区域加一个缓冲带,缓冲带内也有一个较小的成本,这样算法会主动远离威胁边界。
3.3 目标函数四项成本的加权计算
目标函数的完整形式是:
function total_cost = objectiveFunction(path, threat_centers, threat_radii, weights) % 路径成本:总航程 path_cost = 0; for i = 1:size(path,1)-1 path_cost = path_cost + norm(path(i+1,:) - path(i,:)); end % 高度成本:偏离最优高度的惩罚 optimal_height = 200; height_cost = sum(abs(path(:,3) - optimal_height)) / size(path,1); % 威胁成本:所有路径点的威胁成本之和 threat_cost = 0; for i = 1:size(path,1) threat_cost = threat_cost + threatCost(path(i,:), threat_centers, threat_radii); end % 转角成本:相邻路径段之间的夹角 turn_cost = 0; for i = 2:size(path,1)-1 v1 = path(i,:) - path(i-1,:); v2 = path(i+1,:) - path(i,:); cos_angle = dot(v1, v2) / (norm(v1) * norm(v2)); angle = acos(max(-1, min(1, cos_angle))); turn_cost = turn_cost + angle; end % 加权求和 total_cost = weights(1)*path_cost + weights(2)*height_cost + ... weights(3)*threat_cost + weights(4)*turn_cost; end权重的选择我一般这样处理:先归一化四个成本项,让它们的量级大致相同,然后根据任务需求分配权重。比如侦察任务取weights = [0.2, 0.2, 0.5, 0.1],物流任务取weights = [0.5, 0.2, 0.2, 0.1]。
3.4 AO主循环与路径更新过程
AO的主循环结构如下:
% 初始化种群 pop = initializePopulation(pop_size, dim, x_min, x_max, y_min, y_max, z_min, z_max); fitness = zeros(pop_size, 1); for i = 1:pop_size path = decodePath(pop(i,:), start_pos, goal_pos); fitness(i) = objectiveFunction(path, threat_centers, threat_radii, weights); end % 记录最优解 [best_fitness, best_idx] = min(fitness); best_solution = pop(best_idx, :); % 主循环 for iter = 1:max_iter % 计算阶段切换参数 if iter <= max_iter/3 phase = 1; elseif iter <= 2*max_iter/3 phase = 2; elseif iter <= 0.9*max_iter phase = 3; else phase = 4; end for i = 1:pop_size % 根据阶段更新位置 if phase == 1 % 高空翱翔:全局探索 new_pos = pop(i,:) + randn(1,dim) .* (mean(pop) - pop(i,:)); elseif phase == 2 % 俯冲攻击:快速收缩 new_pos = best_solution + randn(1,dim) .* abs(best_solution - pop(i,:)); elseif phase == 3 % 低空追击:精细搜索 new_pos = best_solution + randn(1,dim) .* abs(best_solution - mean(pop)); else % 地面抓捕:直接靠拢 new_pos = best_solution + randn(1,dim) .* (best_solution - pop(i,:)); end % 边界处理 new_pos = max(new_pos, repmat([x_min, y_min, z_min], 1, 10)); new_pos = min(new_pos, repmat([x_max, y_max, z_max], 1, 10)); % 计算新适应度 new_path = decodePath(new_pos, start_pos, goal_pos); new_fitness = objectiveFunction(new_path, threat_centers, threat_radii, weights); % 贪婪选择 if new_fitness < fitness(i) pop(i,:) = new_pos; fitness(i) = new_fitness; end end % 更新全局最优 [current_best, current_idx] = min(fitness); if current_best < best_fitness best_fitness = current_best; best_solution = pop(current_idx, :); end % 显示迭代信息 fprintf('Iteration %d: Best Cost = %.4f\n', iter, best_fitness); end这段代码是AO的核心骨架。实际使用时,我建议在位置更新公式里加入自适应权重,让探索和开发的切换更加平滑。另外,边界处理不要简单截断,可以用反射边界或者随机重置,这样能保持种群多样性。
3.5 路径平滑与可飞性验证
AO输出的路径点通常是折线,直接让无人机飞折线是不现实的,因为无人机有最小转弯半径约束。所以需要做路径平滑。我用的是三次B样条:
% 三次B样条平滑 function smooth_path = smoothPath(waypoints, num_points) t = linspace(0, 1, size(waypoints,1)); tt = linspace(0, 1, num_points); smooth_path = zeros(num_points, 3); for i = 1:3 smooth_path(:,i) = spline(t, waypoints(:,i), tt); end end平滑之后还要做可飞性验证,主要检查三个指标:最小转弯半径、最大爬升角、最大俯冲角。如果平滑后的路径不满足这些约束,就需要调整样条参数或者重新规划。
4. 常见问题与排查技巧实录
4.1 算法收敛慢或不收敛的排查思路
这是最常见的问题。我遇到过的原因大概有这么几类:
第一类是目标函数量级差异太大。比如路径成本是几千,威胁成本是零点几,加权求和后威胁成本完全被淹没。解决办法是先归一化再加权。
第二类是种群初始化太集中。如果所有初始路径点都挤在起点附近,算法前期探索能力会很差。解决办法是用拉丁超立方采样做初始化,保证种群在搜索空间内均匀分布。
第三类是阶段切换太生硬。固定比例切换可能导致算法在某个阶段停留太久。解决办法是用自适应切换,根据种群多样性的变化动态调整。
第四类是约束惩罚系数不合适。惩罚太小约束不起作用,惩罚太大算法只找可行解不找最优解。解决办法是用自适应惩罚,前期小后期大。
4.2 多无人机冲突无法完全消解的解决技巧
冲突消解不彻底通常有两个原因:一是冲突惩罚项权重不够,二是冲突检测的时空分辨率不够。
我的做法是分两步走。第一步,在AO优化时用中等权重的冲突惩罚,让算法尽量避开冲突。第二步,对优化后的路径做一次后处理,用时间窗方法检测残余冲突,如果有冲突,就调整其中一架无人机的速度或者插入一个等待点。
时间窗方法的核心是计算每架无人机到达每个路径点的时间,然后检查同一时间窗内是否有其他无人机在安全距离内。如果有,就调整速度或者路径。
还有一个技巧是给无人机分配不同的飞行高度层。比如四架无人机分别飞100米、150米、200米、250米,这样即使水平投影重叠,垂直方向也有足够间隔。这个方法简单有效,但会牺牲一定的高度成本。
4.3 Matlab代码运行中的典型报错与修复
报错一:Index exceeds matrix dimensions。这通常是路径点数量和解码函数不匹配导致的。检查decodePath函数里路径点的数量是否和dim/3一致。
报错二:Matrix dimensions must agree。这通常是目标函数里向量维度不匹配。检查路径点坐标是行向量还是列向量,统一一下。
报错三:Undefined function or variable。这通常是函数名拼写错误或者函数文件不在当前路径下。用which命令检查函数是否存在。
报错四:Out of memory。这通常是栅格分辨率太高或者种群规模太大。降低分辨率或者减少种群规模,或者用稀疏矩阵存储。
报错五:NaN or Inf。这通常是目标函数里出现了除零或者对数零。检查威胁成本计算里是否有距离为零的情况,加一个极小值保护。
4.4 参数调优的实战经验总结
种群规模:50到150之间,问题越复杂取值越大。我一般先用50跑一遍看收敛趋势,如果收敛太慢就加到100。
最大迭代次数:200到500之间。看收敛曲线,如果200次就平了,说明可以了;如果还在下降,就加到500。
阶段切换点:不要死板地用1/3、2/3、0.9,可以根据收敛曲线的斜率动态调整。斜率大说明还在快速下降,继续探索;斜率小说明接近收敛,转入开发。
权重系数:先用等权重跑一遍,看四个成本项的量级,然后归一化,再根据任务需求调整。我一般会做一组权重敏感性分析,看看哪个权重对结果影响最大。
安全距离:多无人机之间一般取5到10米,具体取决于无人机的物理尺寸和定位精度。如果定位精度是米级,安全距离至少取5米以上。
5. 仿真结果分析与性能评估
5.1 路径可视化与三维效果展示
仿真结果的可视化我用的是Matlab的plot3和scatter3。障碍物用半透明圆柱体和球体表示,路径用不同颜色的粗线表示,起点和终点用大号标记点表示。
figure; hold on; % 绘制障碍物 [X,Y,Z] = cylinder(cylinder_radius, 50); Z = Z * cylinder_height; surf(X+cylinder_center(1), Y+cylinder_center(2), Z, 'FaceAlpha', 0.3, 'EdgeColor', 'none'); % 绘制威胁区域 [x,y,z] = sphere(50); surf(x*sphere_radius+sphere_center(1), y*sphere_radius+sphere_center(2), ... z*sphere_radius+sphere_center(3), 'FaceAlpha', 0.2, 'EdgeColor', 'none'); % 绘制路径 for i = 1:num_uav plot3(paths{i}(:,1), paths{i}(:,2), paths{i}(:,3), 'LineWidth', 2); end % 绘制起点终点 scatter3(start_pos(1), start_pos(2), start_pos(3), 100, 'g', 'filled'); scatter3(goal_pos(1), goal_pos(2), goal_pos(3), 100, 'r', 'filled'); grid on; axis equal; xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); view(45, 30);可视化的时候有个小技巧:把威胁区域用暖色调(红、橙),安全区域用冷色调(蓝、绿),这样一眼就能看出路径是否避开了威胁。
5.2 收敛曲线与算法对比分析
收敛曲线是评估算法性能最直观的工具。我一般会对比AO、PSO、GA三种算法在同一个问题上的收敛曲线。
从我的实测数据来看,AO在前50次迭代的下降速度通常比PSO和GA快,这是因为AO的全局探索能力更强。但在100次迭代之后,AO的收敛速度可能会放缓,这时候如果问题维度特别高,PSO有时候会反超。不过总体来看,AO在三维路径规划问题上的最终解质量通常比PSO和GA好5%到15%。
为了公平对比,我一般会跑30次独立实验,取平均值和标准差。平均值反映算法的一般性能,标准差反映算法的稳定性。AO的标准差通常比GA小,说明AO的鲁棒性更好。
5.3 不同权重配置下的路径形态对比
权重配置对路径形态的影响非常直观。我做过一组对比实验:
| 权重配置 | 路径特征 | 适用场景 |
|---|---|---|
| 路径成本为主 | 路径最短但可能贴近威胁区 | 物流配送 |
| 高度成本为主 | 路径高度平稳但可能绕远 | 定高巡航 |
| 威胁成本为主 | 路径远离威胁区但可能较长 | 侦察渗透 |
| 转角成本为主 | 路径平滑但可能不够短 | 固定翼飞行 |
从实验数据来看,威胁成本权重从0.2增加到0.5时,路径的平均威胁成本下降了约40%,但总航程增加了约15%。这个 trade-off 需要根据具体任务来权衡。
5.4 实时性与计算复杂度评估
AO的计算复杂度主要取决于种群规模和迭代次数。单次迭代的复杂度是O(pop_size × dim),总复杂度是O(max_iter × pop_size × dim)。对于pop_size=50、max_iter=300、dim=30的问题,单次运行时间在Matlab上大约是10到30秒,具体取决于目标函数的计算复杂度。
如果要做实时规划,这个速度可能不够。我的优化建议是:第一,用Matlab的并行计算工具箱,把种群适应度计算并行化,速度可以提升3到5倍。第二,用MEX文件把目标函数编译成C代码,速度可以提升10倍以上。第三,用增量式规划,每次只重新规划受影响的那一段路径,而不是全局重规划。
6. 工程落地中的经验与扩展方向
6.1 从仿真到实飞的差距与弥补
仿真跑通了不代表实飞能飞。我踩过的坑包括:仿真里无人机可以瞬间改变速度,实飞中无人机有加减速限制;仿真里定位是完美的,实飞中GPS有漂移;仿真里通信是即时的,实飞中通信有延迟。
弥补这些差距的方法:第一,在仿真里加入无人机动力学约束,用二阶或三阶模型代替质点模型。第二,在仿真里加入定位噪声,用蒙特卡洛方法测试路径的鲁棒性。第三,在仿真里加入通信延迟,测试路径在延迟条件下的安全性。
我一般建议在仿真和实飞之间加一个硬件在环测试环节,用真实的飞控板跑仿真路径,这样可以发现很多纯软件仿真发现不了的问题。
6.2 动态障碍物与在线重规划
静态路径规划假设障碍物不动,但实际场景中可能有移动的障碍物,比如其他无人机、飞鸟、移动的地面车辆。这时候就需要在线重规划。
在线重规划的核心是快速响应。我的做法是:用AO做全局规划得到基准路径,然后用模型预测控制做局部调整。模型预测控制的预测时域取2到3秒,控制时域取1秒,这样既能及时避障,又不会频繁重规划导致路径震荡。
还有一个技巧是设置一个重规划触发阈值:只有当障碍物进入安全距离的1.5倍时才开始重规划,这样可以避免不必要的计算。
6.3 算法融合与改进思路
纯AO在某些场景下可能不够用,我试过几种融合方案:
AO加模拟退火:在AO后期加入模拟退火的Metropolis接受准则,允许一定概率接受差解,这样可以跳出局部最优。实测下来,最终解质量提升了约8%。
AO加三次样条:用AO搜索路径点,用三次样条做平滑,这样既保证了全局最优性,又保证了路径可飞。这是我最常用的方案。
AO加人工势场:用AO做全局规划,用人工势场做局部避障。人工势场的优点是响应快,缺点是容易陷入局部最优。两者结合可以互补。
AO加神经网络:用神经网络学习AO的优化策略,然后用学习到的策略做快速规划。这个方案还在实验阶段,但初步结果看起来有潜力。
6.4 代码开源与复现建议
如果你要把这个代码开源,我有几个建议:第一,把参数配置单独写成一个配置文件,不要硬编码在代码里。第二,把目标函数的四个成本项分开写,方便用户单独调整。第三,提供至少三个测试场景,从简单到复杂,方便用户验证。第四,写一个详细的README,说明每个参数的含义和推荐取值范围。
复现的时候,我建议先用默认参数跑一遍,看看结果是否合理。然后逐步调整参数,观察结果的变化。不要一上来就改一堆参数,那样出了问题很难定位。
最后分享一个我在实际项目中总结的小技巧:在AO的种群初始化阶段,不要完全随机,而是用起点到终点的直线做扰动生成初始路径。这样初始种群的质量会高很多,收敛速度也能提升20%左右。这个技巧在路径规划问题里特别管用,因为最优路径通常不会离直线太远。