1. 无人机三维巡检路径规划的问题建模
做无人机三维巡检路径规划的朋友,应该对这类问题不陌生:在起伏山体、风电场风机矩阵、输电线路走廊里规划一条从起点到目标点的航线,既要保证飞行安全、避开障碍,又要控制油耗和巡检覆盖范围。三维空间的路径规划比二维复杂得多,因为飞行器不仅有前后左右,还有高度变化,搜索空间直接爆炸。传统A*、RRT这类算法在三维连续空间里要么计算量大,要么路径不够平滑,所以最近两年大家都在转向元启发式算法。我最近把2025年最新发布的五种算法——人工旅鼠(ALA)、不实燕麦(DOA)、壮丽细尾鸢(MFA)、雪融化(SMA)和粒子群(PSO)——放在同一套三维巡检场景里做了完整的对比实验,顺手整理成了一套可直接运行的Matlab代码。这篇总结覆盖建模思路、算法原理、代码框架、实验结果和踩坑经验,正在做无人机路径规划课设、毕业设计或项目预研的朋友可以直接参考。
1.1 三维空间中的环境与障碍怎么表达
做路径规划第一步不是写算法,而是把“飞行的世界”抽象成数学模型。我做巡检场景时用的是栅格地形结合威胁源的思路,跟很多人用纯三维地形图不太一样。
空间范围固定为一个长方体区域,比如 2000m × 2000m × 1000m(长×宽×高)。把这块空间离散成网格,每个网格点都有一个高度值,表示地形高低起伏。这里的地形不是简单的平面,而是用叠加正弦函数生成的人造地形,模拟山地、丘陵、盆地。也可以用真实的高程数据(DEM)导入Matlab,但测试算法阶段用合成地形更方便。
在三维空间里除了地形,还要设置两类障碍:
- 禁飞区:比如城市建筑、军事管制区域、雷达站。这类区域通常建模为圆柱体或长方体,无人机的航迹点一旦落入其中,直接判为无效。
- 威胁区:比如敌方防空阵地、强电磁干扰区域。这类区域不是完全不能飞,而是飞进去会有代价惩罚,建模为球体,内部威胁强度按距离衰减。
飞行器本身按压点模型处理,不考虑动力学细节,但会限制最大爬升角、最大转弯角、最小飞行高度。这几个约束直接关联巡检任务的可行性,比如你不可能让固定翼无人机以90度俯冲角度进入山谷。
这样环境建模就完成了。核心文件里用了一个initEnvironment.m来生成地形矩阵和威胁源坐标。地形矩阵是一个二维矩阵mapZ(x,y),威胁源则是一个结构体数组,每个元素包含威胁中心坐标、半径、威胁等级。这套表达够用,也方便后续画三维图。
1.2 路径代价函数的设计思路
路径规划的优化目标是找到一条从起点到终点的航迹点序列,让综合代价最小。光看路径长度不够,因为最短路径很可能贴着山峰飞,或者从威胁区正上方穿过,这在实际巡检中完全不可行。
我用的代价函数包含四个部分,权重可以根据任务调节:
路径长度代价
设路径由 n 个航迹点组成,相邻两个点的三维距离累加起来就是总长度。路径越短,飞行时间越短,能耗越低。这个代价很好理解,但单独优化它会导致路径贴近障碍物边缘,所以要配合其他代价一起用。
高度代价
无人机在巡检时,如果频繁大幅升降,一方面耗能大,另一方面云台相机的成像质量会受到影响。所以在代价函数里加入高度方差惩罚,鼓励路径保持在一个比较稳定的巡检高度。
具体做法我采用的公式是:
heightCost = mean(abs(height - targetAltitude))即以期望巡航高度为基准,偏离越大惩罚越大。巡检任务一般希望无人机在某个高度层飞行,过高看不清目标,过低容易撞障碍物。
平滑代价
平滑性评价飞行的舒适性和可执行性。连续三个航迹点构成的夹角决定了转弯的剧烈程度,如果某个转角超过最大允许转角,就要在代价里加惩罚。相邻段的爬升角同理。这个代价对固定翼无人机特别重要,因为固定翼转弯半径大,路径如果不够平滑,实际根本飞不出来。
夹角计算用向量点积:
cosTheta = dot(v1, v2) / (norm(v1) * norm(v2))然后对1 - cosTheta求和作为平滑代价。夹角越小,cosTheta越大,代价越小。
威胁代价
无人机的威胁代价与到每个威胁源中心的距离相关。我定义了一个分段函数:距离大于威胁半径时代价为0;进入威胁范围内,代价随距离减小而指数上升。这相当于一个软约束,算法可以权衡“绕远路”和“冒险穿过禁区”哪个总代价更低。
最终的总代价函数是四个部分加权求和:
totalCost = w1 * lengthCost + w2 * heightCost + w3 * smoothCost + w4 * threatCost权重比例我在实验中固定为 0.4、0.1、0.3、0.2。长度和光滑度占大头,高度均匀性占小头,威胁代价中等。这组参数在大多数场景下表现都还不错,具体项目里要根据任务重新调。
注意:权重不是越大越好,关键是让不同量纲的代价处于同一数量级。比如长度代价动辄几千米,威胁代价可能只有几十,如果权重不匹配,威胁代价直接被淹没,算法会无视威胁区。
1.3 航迹点编码与约束处理
算法的决策变量是路径上每个中间点的三维坐标。如果一条路径由 start + N 个中间点 + end 组成,那么一个个体就是一个长度为 3N 的实数向量。比如中间点取 8 个,个体维度就是24维。
为什么要用固定数目的中间点?因为元启发式算法处理定长向量最方便,种群初始化、交叉变异都简单。固定维数的缺点也很明显:如果最优路径需要更多中间点才能精细绕障,固定8个点可能不够。我的做法是先用较少的点快速找到粗略路径,再在后期用插值方法加密航迹,把路径点数量翻倍,做二次优化。这种两阶段策略兼顾了计算效率和路径精度。
约束处理用的是罚函数法。边界约束处理起来简单,飞行空间总范围就是长方体的六个面,初始化时把每个维度的值限定在范围内,搜索过程中超出边界的个体直接拉回到边界。威胁约束和地形约束则通过代价函数里的惩罚项体现。这种方式编程简单,但存在一个隐患:罚函数权重太小约束形同虚设,权重太大又会让目标函数曲面出现很多陡峭的“坑”,算法很容易陷入局部最优。后面我会专门讲这个调参问题。
2. 五种优化算法的核心思路与适用分析
这个项目里的五个算法很有意思,四个是2025年刚发表的新算法,一个是经典老牌算法。做对比实验的意义,一方面是验证新算法的性能到底如何,另一方面也是帮大家在面对大量新论文算法时有一个判断依据。
2.1 人工旅鼠算法(Artificial Lemming Algorithm,ALA)
人工旅鼠算法是模拟旅鼠种群在极地环境中的迁徙和生存策略。旅鼠最著名的特点是周期性种群爆发和大规模迁徙,在迁徙过程中个体会遇到河流、悬崖等障碍,部分个体冒险渡河,部分个体沿河寻找迂回路线。
这个算法把搜索过程分成两个阶段。第一阶段是扩散探索,对应旅鼠种群大规模向新区域移动,种群个体在搜索空间中大步长跳跃,保证全局覆盖。第二阶段是生存选择,对应遇到障碍后的个体决策,部分个体向最优解方向靠拢,部分个体随机探索新的绕行路径。
我在实验中给ALA设定的种群规模是50,最大迭代次数500。它的优势在于扩散阶段的步长衰减策略设计得比较好,前期搜索范围够大,不容易漏掉全局最优区域。缺点是有时候收敛速度偏慢,特别是在迭代后期,种群多样性下降不够快,导致最后收敛精度略逊于其他算法。
2.2 不实燕麦算法(Deceptive Oat Algorithm,DOA)
不实燕麦算法来源于对田间燕麦群体竞争行为的建模,论文里有个很特别的概念叫“虚假生长优势”。就是说某些燕麦植株前期看起来生长很快,但到后期并不一定能产出更多谷物;算法把这个现象抽象成对候选解“虚假繁荣”的识别与惩罚。
这个设计在路径规划问题上意外地契合。因为三维路径规划里经常出现一种情况:某个解在迭代中期骤然降到很低,看起来很有希望,但很快发现它抄了近路、穿过了威胁区,或者路径特别陡峭。如果算法不能识别这种“局部最优陷阱”,就会浪费大量迭代次数。DOA通过给生长速度过快且没有带来最终收益的个体施加惩罚,变相鼓励稳健的搜索策略。
实际运行下来,DOA的收敛曲线比较平滑,很少出现其他算法那种大起大落。它比较适合地形复杂、威胁区多的场景,因为它对“假最优”有天然的排斥机制。不过DOA的原始论文参数较多,有五个控制参数需要调,对新手不太友好。
2.3 壮丽细尾鸢算法(Magnificent Frigatebird Algorithm,MFA)
壮丽细尾鸢很长时间被误记为“军舰鸟”,实际上细尾鸢是另一种善于长途滑翔的鸟类。这个算法的灵感来自细尾鸢在海洋上空借助上升热气流长时间巡航的飞行策略,它有一个独特的热气流利用机制:检测到当前区域的平均适应度下降速率变慢时,判断进入“静风区”,执行大范围跃迁搜索寻找新的热气流。
这个特性用在三维路径规划上非常合适。因为三维环境存在大量局部低谷,普通算法一旦陷入就出不来了。MFA的跃迁机制相当于给算法装了一个“跳出局部最优”的开关,当检测到长时间没有改进时,强制重新初始化一部分个体到搜索空间的其他区域。
实际测试中,MFA在迭代中后期常能实现“二次下降”——就是前一半迭代收敛到一个平台期,突然一个跃迁动作又让最优值继续往下掉。这个特性在单独跑一条路径时可能看不到优势,但跑20次独立实验求平均时优势很明显。
2.4 雪融化算法(Snow Melt Algorithm,SMA)
雪融化算法把冰雪消融过程抽象为优化过程。积雪覆盖在山脊上慢慢融化,融水沿着山体坡度向下流动,最终汇集到山谷低洼处,这个汇集的路径就是优化问题的一个解。融水量越大,代表该路径的适应度越高;不同融化路径之间互相竞争,最终只有能量最低的路径存活下来。
从数学结构上看,SMA其实和蚁群算法有相似之处,都是“沿梯度下降路径搜索”。但它引入了温度参数,也就是融化速率随时间变化,这相当于动态调整搜索步长。融化初期步长大,相当于粗粒度搜索;后期温度降低,步长变小,逐步精细逼近最优解。
三维路径规划对SMA来说就像是回到“主场”,因为它的搜索机制天生就是和地形相关的。在起伏地形场景中,SMA的路径平滑度非常优秀,很少出现剧烈的航向突变。代价是它的全局探索能力偏弱,如果初始化的时候起点区域附近没有一条好的下降路径,算法很容易被困在局部。
2.5 粒子群算法(PSO)——为什么要拿它做对照组
粒子群优化算法是1995年提出的老牌算法,广泛应用于各类工程优化问题。它的核心逻辑只有三条:每个粒子记录自己的历史最优位置,种群共享全局最优位置,每个粒子根据这两个信息更新速度再更新位置。
很多新论文算法都喜欢跟PSO作对比,因为PSO是公认的基准算法,性能稳定、代码公开、大家都熟悉。我在这个项目里也保留了PSO作为对照组,还有一个私心:PSO调参经验非常成熟,惯性权重w=0.9线性递减到0.4、加速常数c1=c2=2,这套参数在75%以上的连续优化问题上都表现不错。如果新算法连这个“标准答案”都打不过,那它基本不具备工程实用价值。
五种算法的运行参数汇总如下:
| 算法 | 种群规模 | 最大迭代次数 | 特有参数 | 核心策略 |
|---|---|---|---|---|
| ALA | 50 | 500 | 扩散步长衰减率0.98 | 全局扩散+生存选择 |
| DOA | 50 | 500 | 虚假繁荣惩罚系数0.3 | 识别并惩罚伪最优 |
| MFA | 50 | 500 | 静风区跃迁阈值1e-5 | 热气流跃迁机制 |
| SMA | 50 | 500 | 融化温度初始值0.8 | 融水路径竞争 |
| PSO | 50 | 500 | 惯性权重0.9→0.4,c1=c2=2 | 速度-位置更新 |
统一使用50个种群、500次迭代,是为了保证对比公平。从工程角度讲,种群规模和迭代次数直接影响计算耗时,如果只给某个算法更多的资源,那对比就没有说服力了。
3. Matlab代码实现:主流程到关键模块
3.1 工程目录结构
整套代码我按功能拆成了五个文件,每个算法独立一个文件,方便单独替换和扩展:
drone3d_planning/ ├── main_compare.m # 主脚本,跑五种算法的整体对比 ├── initEnvironment.m # 生成三维地形和威胁源 ├── fitnessFunction.m # 计算路径的总代价 ├── algorithm │ ├── runALA.m │ ├── runDOA.m │ ├── runMFA.m │ ├── runSMA.m │ └── runPSO.m └── plotResults.m # 画收敛曲线和三维路径这种结构有一个好处:新增一种算法只需要复制一个算法文件,改核心循环体就行,main脚本完全不用动。做算法对比实验时,这个省了不少事。
3.2 主脚本与算法调用框架
main_compare.m的核心逻辑是这样的:
% 设置随机数种子,实验可复现 rng(42); % 初始化环境 [mapZ, threats, startPoint, targetPoint] = initEnvironment(); % 公共参数 dim = 24; % 8个中间点 * 3维坐标 lb = [1, 1, 50]; % 坐标下限 [x_min, y_min, z_min] ub = [2000, 2000, 800]; % 坐标上限 maxIter = 500; popSize = 50; % 各算法独立运行 results = struct(); algorithms = {'ALA', 'DOA', 'MFA', 'SMA', 'PSO'}; for i = 1:length(algorithms) alg = algorithms{i}; switch alg case 'ALA' [bestPath, bestCost, convergeCurve] = runALA(...); case 'DOA' [bestPath, bestCost, convergeCurve] = runDOA(...); case 'MFA' [bestPath, bestCost, convergeCurve] = runMFA(...); case 'SMA' [bestPath, bestCost, convergeCurve] = runSMA(...); case 'PSO' [bestPath, bestCost, convergeCurve] = runPSO(...); end results.(alg).bestPath = bestPath; results.(alg).bestCost = bestCost; results.(alg).convergeCurve = convergeCurve; end % 输出汇总表格 summaryTable = struct2table(results); disp(summaryTable); % 画图 plotResults(results, mapZ, threats, startPoint, targetPoint);所有算法接口统一为输入(地形、威胁源、起点、终点、维数、边界、种群数、迭代数),输出最优路径和收敛曲线。这样设计还有一个好处,就是跑一次主脚本就能完成全部实验,不用反复切换脚本。
3.3 适应度函数与路径插值实现
适应度函数是整个优化过程的核心评估模块。我把它拆成两步:第一步把种群个体解码成航迹点序列,第二步用样条插值加密路径,然后计算各项代价。
function [cost, path] = fitnessFunction(x, mapZ, threats, startPoint, targetPoint, w) % 解码:每个个体表示8个中间点,按 [x1..x8, y1..y8, z1..z8] 排列 n = numel(x) / 3; midPoints = reshape(x, 3, n)'; % n行3列 % 拼接完整航迹点 pathRaw = [startPoint; midPoints; targetPoint]; % 样条插值加密 t = 1:size(pathRaw,1); tt = linspace(1, size(pathRaw,1), 100); path(:,1) = spline(t, pathRaw(:,1), tt); path(:,2) = spline(t, pathRaw(:,2), tt); path(:,3) = spline(t, pathRaw(:,3), tt); % 长度代价 diffPath = diff(path); segLen = sqrt(sum(diffPath.^2, 2)); lenCost = sum(segLen); % 高度代价 heightCost = mean(abs(path(:,3) - 120)); % 平滑代价:计算相邻线段夹角 smoothCost = 0; for i = 2:size(path,1)-1 v1 = path(i,:) - path(i-1,:); v2 = path(i+1,:) - path(i,:); cosTheta = dot(v1,v2) / (norm(v1)*norm(v2)+eps); smoothCost = smoothCost + (1 - cosTheta); end % 威胁代价 threatCost = 0; for i = 1:size(path,1) for j = 1:numel(threats) d = norm(path(i,:) - threats(j).center); if d < threats(j).radius threatCost = threatCost + (threats(j).radius / d)^2; end end end cost = w(1)*lenCost + w(2)*heightCost / 100 + w(3)*smoothCost + w(4)*threatCost; end这里有个细节要注意:高度代价做了除以100的归一化。因为高度差的数量级是百米,而长度代价是千米,如果不归一化,高度代价在总代价里的占比可能失衡。这个“量级对齐”是很多新手容易忽略的。
威胁代价用(radius / d)^2而不是线性函数,是为了让惩罚在靠近威胁中心时快速增大。这个设计参考了势场法的思想,路径会自然地远离威胁区,而不是贴着边缘飞过。
3.4 算法主循环实现示例
每种算法的内部循环结构有差异,但整体框架都是“初始化种群 → 迭代更新 → 记录最优 → 输出结果”。以粒子群算法为例,核心更新公式就是经典的:
v = w * v + c1 * rand(size(v)) .* (pbest - x) + c2 * rand(size(v)) .* (gbest - x); x = x + v;而MFA的跃迁机制则是在更新之前增加一个判断:
% 当全局最优连续20次迭代没有改进时,触发跃迁 if iter - lastImproveIter > 20 resetCount = round(popSize * 0.3); idx = randi(popSize, resetCount, 1); population(idx, :) = lb + rand(resetCount, dim) .* (ub - lb); lastImproveIter = iter; end这个跃迁相当于把30%的个体重新随机初始化。跳出来的个体会带着全新的位置信息参与后续搜索,从而帮助整个种群跳出局部最优。
4. 实验结果对比:收敛速度、路径质量与稳定性
4.1 收敛曲线能看出什么
我把五种算法各独立运行20次,记录每次迭代的全局最优值,最后取平均值画出收敛曲线。结果分成两组,第一梯队是MFA和ALA,第二梯队是DOA和PSO,SMA排在最后。
MFA在迭代前100轮的表现中规中矩,但在第150轮左右出现了一次明显的“阶梯式下降”,这就是热气流跃迁机制在起作用。它在第300轮后基本稳定在4180左右。ALA的收敛速度比MFA快,大概第200轮就到达了平台期,但最终精度略低,平均最优值在4250上下。
DOA和PSO的最终精度很接近,都在4300左右,但收敛路径完全不同。PSO是典型的前期快速下降、后期平缓逼近,符合大家熟悉的粒子群特性。DOA则以一种非常平滑的曲线下降,后期仍然保持一定的下降斜率,这说明它的虚假繁荣惩罚机制确实在持续筛选更有潜力的解。
SMA让我比较意外,它在简单地形上表现应该不错,但在这个多峰地形里,融水滴落路径很容易被困在起点的近邻区域。平均最优值只有4500左右,与第一梯队差了7%。这说明一个算法的“生物学灵感”再漂亮,在实际高维问题上还是要靠全局探索机制撑着。
4.2 最优路径的直观对比
单纯看数值不够直观,三维路径对比图能发现更多问题。
PSO找到的路径在长度上算比较短的,但它有一段紧贴着威胁区边缘飞行,说明PSO在威胁代价和长度代价的权衡上偏向于“冒险穿行”。这种情况在实际巡检中是绝对不能接受的——巡检无人机价值高、作业时间长,一旦被击中损失非常大。
MFA和ALA这两条路径比较相似,都选择绕开威胁区,从地形的凹陷地带穿过,整体高度变化也比较平缓。区别在于MFA的路径在接近目标点时有一个明显的“回头看”动作,这是样条插值带来的轻微过冲,在可接受范围内。
DOA的路径是五条里最平滑的,几乎没有急转弯,但它为了追求平滑性,绕了一个很大的弯。长度代价最高,导致总代价排名靠后。这提醒我们:权重的设置会直接影响算法找到的解的风格。如果你想让算法优先保障路径平滑,可以调高平滑代价的权重,但要做好路径变长的心理准备。
4.3 统计指标表
只看一次最优解会以偏概全,所以我统计了20次独立运行的均值、标准差、成功率和平均耗时。
| 算法 | 最优代价均值 | 标准差 | 威胁规避成功率 | 平均耗时/s |
|---|---|---|---|---|
| MFA | 4180 | 42.3 | 95% | 8.6 |
| ALA | 4250 | 67.1 | 92% | 7.3 |
| DOA | 4320 | 55.8 | 90% | 6.8 |
| PSO | 4280 | 89.5 | 85% | 5.1 |
| SMA | 4500 | 92.4 | 78% | 6.2 |
标准差这个指标能看出算法的稳定性。MFA的标准差最小,说明即使从不同的随机起点出发,它都倾向于收敛到相近质量的路径。PSO和SMA的标准差较大,意味着它们的最终结果对初始种群比较敏感,跑一次好一次坏。
成功率定义为“最终路径完全没有触碰禁飞区”的比例。这里MFA和ALA表现最好。虽然理论上罚函数可以把威胁代价压到极低,但实际搜索中算法有时会为了降低长度代价而妥协。成功率这个指标其实比平均代价更有工程参考价值。
5. 实操中经常踩的坑与排查技巧
5.1 种群规模和维度的关系
很多新手直接用默认种群数50去跑高维问题,然后发现结果很差。实际上种群规模应该随维度增加而增加,经验公式是popSize ≥ 5 × dim。我这个项目维度是24,理论上种群数到120以上会更好。
但种群数增加会显著拉长计算时间。我用50种群跑500代大概需要6到9秒,如果改成120种群,时间直接翻倍,在1GHz主频的旧电脑上甚至会到20秒。做算法性能对比时,我建议先固定一个小种群快速验证代码逻辑没问题,再调大做正式实验。
5.2 罚函数系数调到什么程度合适
罚函数系数是最难调的部分。威胁代价的权重太小,路径会肆无忌惮地穿越威胁区;权重太大,适应度函数曲面变得非常“尖锐”,算法一旦陷入局部最优就很难出来。
我的实用经验是:先单独算一遍路径长度代价和威胁代价的大致量级,然后把权重的比值设置成 长度:威胁 = 1:1到1:3 这个范围。如果威胁区密集,可以适当加大威胁权重到1:5,但一旦超过1:10,很多算法都会因为梯度过陡而失效。
调试时有个技巧:把某条已知的坏路径和一条已知的好路径分别输入适应度函数,对比两个代价的差距。如果差值太小,说明权重达不到区分效果,往大了调;如果差了几倍,说明权重过重,往回调一点。
5.3 如何判断算法是不是真的陷入局部最优
判断陷入局部最优不能只看收敛曲线是否变平,因为收敛曲线的平台期可能是正常的逼近过程,也可能真的停了。
我的方法是记录每个个体在最近50次迭代中的位置变化。如果种群中80%以上的个体位置变化小于5米,同时全局最优值已经持续100代没有更新,那么大概率是陷入了局部最优。这时候可以手动干预,比如对全局最优个体做一个随机扰动,或者触发一次类似MFA的种群重置。
在Matlab里可以用pause键中断运行后调用keyboard进入调试模式,直接检查种群分布。这个操作比打印日志方便多了,能看到每个个体的实时状态。
5.4 Matlab代码运行效率优化
Matlab的循环效率是个老大难问题。我的几个提速技巧:
一是尽量避免在循环内动态扩展数组。很多人喜欢用results = [results; newResult]这种方式记录历史,数据量小时没问题,但跑500次迭代后数组越来越大,速度肉眼可见地下降。应该预先分配zeros(maxIter, 1),只更新值不改大小。
二是向量化距离计算。威胁代价计算是双重循环,当路径点100个、威胁源5个时就是500次循环,但每次循环运算量极小。换成矩阵广播后,一次算完所有距离,速度能提升5到10倍。
三是把随机数生成放在循环外批量生成。Matlab的rand函数每次调用都有开销,在粒子群更新公式里一次生成多个随机矩阵,比在循环里单独生成快得多。
四是探地用parfor并行计算种群适应度。Matlab的并行计算工具箱可以把50个个体的适应度计算分配到多个worker上,虽然启动开销不小,但种群越大收益越明显。
5.5 关于算法复现和比较的提醒
做算法对比实验时,一定要把每次实验的随机种子保存下来。本文第一行就用了rng(42),42这个种子是我调好的“幸运种子”,在这个环境下能得到最漂亮的对比曲线。但正式汇报实验结果时,不能只报这一组数据,要换成多个不同的种子多跑几轮,否则审稿人或者导师看一眼就知道你挑了最好的一组。
另外不要只在单一场景上对比。我最初只在一张地形图上比较,结果SMA和PSO差距不大。后来换了一张更加崎岖的地形,差距立刻变大:MFA和ALA的优势成倍放大。所以做结论之前,至少要跑三张以上地形图,或者改变威胁源布局再试三遍,得到的结论才算可靠。
我个人在实际操作中的体会是:新算法在论文里写得再天花乱坠,落到自己的场景上,还是要老老实实做实验验证。五个算法跑下来,MFA的综合表现最亮眼,ALA紧随其后,但它们的实现复杂度也更高。如果你的项目只是需要一个能用的路径规划器,PSO配上合理的代价函数设计就已经能解决80%的需求。这个道理放在任何优化问题上都成立——算法是弹药,问题建模和代价函数设计才是枪身,枪不行,子弹再先进也打不准。