资讯动态

改进蜣螂优化算法的无人机三维路径规划方法研究

发布时间:2026/10/20 14:46:30 来源:尧图企业网站定制
1. 为什么盯上蜣螂算法三维路径规划的痛点与DBO的契合点无人机避障路径规划这活儿说简单也简单——找个起点划一条线到终点绕开山体障碍就行。但一旦放进三维空间立刻就不是那么回事了。航线不能只看平面距离要考虑爬升率、转弯半径、地形贴地飞行高度、能耗甚至隐蔽性多目标叠加之后传统的图搜索类方法就有点力不从心了。我前两年在工程项目里做低空无人机巡检航线规划用过A*、RRT以及它们的各种变体。A*在栅格地图上其实很稳但栅格分辨率一高搜索空间爆炸内存和耗时都扛不住RRT随机性太强每次跑出来的航线形状都不太一样后续还得专门做平滑处理。后来转向群智能优化算法麻雀搜索算法、灰狼优化、粒子群都试过一圈才逐渐体会到这类元启发式算法的真正价值——它们不依赖地图的显式离散化直接把航线表示成一系列航迹点的坐标向量扔进适应度函数里迭代寻优就行。作为优化问题来解非常灵活。这期间就接触到了蜣螂优化算法Dung Beetle Optimizer简称DBO。它是2022年底提出的一种群智能优化算法模拟蜣螂的滚球、舞蹈、繁殖、觅食和偷窃等行为。第一次读到原论文的时候我的第一反应是这算法分四种位置更新策略结构比PSO和GWO复杂但能不能在实际的无人机三维路径规划里跑出效果心里是没底的。不过做完一轮基准函数测试之后我发现它在部分多峰函数上的收敛速度确实有亮点于是决定把它移植到路径规划上做一轮系统验证顺便做针对性改进。需要说明的是本文的做法针对的是一个比较典型的静态三维环境地图大小设定为2km×2km×0.5km起点和终点固定中间用数学函数模拟了若干山峰作为禁飞障碍。下面所有关于改进策略、代码结构和实验结论的讨论都基于这一设定展开。如果你要处理动态障碍或者更复杂的地形整体框架仍然适用但代价函数和约束项需要另行调整。1.1 三维路径规划到底难在哪三维路径规划的“难”很多人以为难在地图建模其实难在优化模型的构造上。地图炸山体模型用几个高斯函数叠加就能做得挺像回事真正麻烦的是如何把“飞得安全、飞得短、飞得平稳、飞得省油”这些互相矛盾的目标统一到一个可计算的数值上。先说规划空间的尺度问题。2km×2km×0.5km的地图如果按1m分辨率划分栅格就是20亿个格子任何基于状态空间搜索的算法都跑不动。所以实际工程里几乎不直接搜栅格而是把路径抽象成“若干关键航迹点点间插值”的形式。比如设定每两个相邻航迹点之间等分10段用三次样条或线性插值求出中间点再评估整条路径的代价。这样优化变量只有航迹点的三维坐标维度就是3×NN为航迹点数搜索规模完全可控。其次是约束条件的处理。无人机不是质点它有最大爬升角、最小转弯半径、最低离地高度、最大飞行速度等物理限制。这些限制如果全部当作硬约束写进优化模型可行域会变得非常破碎启发式算法很容易陷入找不到可行解的尴尬局面。工程上常用的做法是把约束变成惩罚项乘进适应度函数比如某一段航线爬升角超过阈值就给适应度加一个很大的惩罚值算法在迭代过程中会自然把航线往满足约束的方向推。第三是“安全”和“经济性”之间的矛盾。最短路径往往贴着山峰走危险绕飞路径很安全但能耗上升。这两者的权重怎么配比不同任务需求下的答案完全不一样。我见过不少论文直接给一组固定权重就跑实验结果现实场景里根本没法飞。所以代价函数里的各分项权值最好在实验阶段做成可调的甚至用分层序列法处理主目标定航程安全作为硬约束这样更符合实际应用逻辑。1.2 DBO凭什么能上场以及它的问题DBO之所以值得一试核心在于它的四种行为模式天然覆盖了“全局探索”和“局部开发”两种需求。滚球行为模拟蜣螂在没有障碍时沿直线推粪球对应大步长全局搜索舞蹈行为模拟蜣螂遇到障碍后爬上去观察重新定向对应跳出局部最优繁殖行为模拟蜣螂在粪球内产卵对应小区域精细搜索偷窃行为模拟一些蜣螂去抢同伴的粪球对应向最优个体聚集。前两种行为保证了算法早期能比较快地在搜索空间里铺开后两种行为保证了后期能收敛到局部较优区域进行精细打磨。这个结构设计是合理的也是它在一众2022年之后的新算法里还能被持续引用的原因。但原版DBO有个比较要命的问题它的四种行为切换依赖当前个体在种群中的排序位置。排序靠前的个体偏向开发和繁殖排序靠后的偏向全局探索这种硬划分在迭代后期会导致早熟。种群一旦在某个局部区域聚集排序机制会让几乎所有个体都倾向于在小范围内精细搜索全局探索能力基本失效。我在多峰基准函数上测试时发现原版DBO在部分函数上会出现收敛曲线早早变平的“假收敛”现象——看起来收敛了代价函数值也降得很低但实际航迹并没有绕开某些障碍因为适应度函数里障碍惩罚项把地形信息“磨平”了。另外原版DBO的步长控制参数比较粗糙滚球阶段使用固定系数导致迭代前期步长偏保守全局搜索速度不如PSO初期的线性递减惯性权重迭代后期又不够精细局部开发能力跟GWO的包围机制比也有差距。这些缺陷正是“改进”的切入点。2. 把“改进”落在实处四种算子级修改的设计思路这一轮改进我没有动算法整体架构而是选择了“最小侵入式”策略保持DBO的四行为框架不变针对初始化、滚球、繁殖/偷窃三个关键环节做算子替换或参数自适应化。这样做的最大好处是——不会因为改了太多东西导致算法收敛性崩掉能清楚分辨出每一步改动带来的收益。下面把这四方面的改动逐一展开。2.1 初始化反向学习把种群底子打好群智能算法的初始种群分布直接影响收敛速度和最终解质量。原版DBO用均匀随机初始化在2km×2km×0.5km这种大尺度地图上初始种群多半会散落在远离可行通道的区域算法要花好几代才能摸索到障碍物之间的缝隙。我的做法是引入反向学习机制对每个随机生成的初始个体同时生成一个关于搜索空间中心对称的反向个体然后计算两者的适应度留下较优的进入初始种群。反向位置的坐标公式很简单——如果某维搜索上下界是[lb, ub]随机位置的坐标是x那么对应的反向位置坐标就是lbub-x。这个策略计算开销很小但显著提升了初始种群的“质量下限”。实测效果相当直观原版DBO迭代到第50代左右才找到一条勉强可飞的路径而反向学习初始化之后的改进版在第20代左右就已经规划出一条绕障完整的可行航线。代价就是初始阶段多算了一次适应度对整体运行时间的影响可以忽略——因为路径规划的适应度函数计算本身并不重瓶颈通常在迭代次数上。还有个细节要注意反向学习不只是在算法一开始做一轮部分改进策略会在迭代中每隔一定的代数重新生成部分种群我试过这种动态反向学习发现在这种相对平滑的地形模型上收益不太明显反而增加了参数调优的负担。所以最终版本选择了“只启动一次”的静态反向学习省心又有效。2.2 滚球阶段融合螺旋搜索和自适应惯性权重原版DBO滚球阶段的位置更新本质上就是朝全局最优方向移动同时叠加一个随机扰动。这个“跟着头虫走”的机制在单峰函数上很好用但在地形复杂的路径规划问题里容易让种群一堆一堆地挤向同一条路径多样性下降得很快。改进方案的第一个组件是引入螺旋搜索项效仿鲸鱼优化算法WOA中螺旋气泡网捕食的思想。具体来说滚球个体的位置更新不只是线性朝向全局最优而是叠加一个螺旋运动分量 X_new X_best |X_best - X_i| * exp(b * l) * cos(2πl) 步长项其中b是螺旋形状常数l是[-1,1]之间的随机数。这个螺旋项的直观效果是个体在朝最优方向推进的同时还会绕着一个收缩的螺旋路径扫描周围区域。这样既保持了向最优方向的收敛性又不会让个体笔直冲进最优区域丢掉探索机会。改进的第二个组件是自适应惯性权重w。迭代早期w取值较大比如0.9个体受自身速度惯性影响强搜索步长大倾向于全局探索迭代后期w线性或非线性衰减到0.4左右个体步长变小集中在优势区域精细搜索。这个思路在PSO里已经被反复验证过搬进DBO的滚球阶段同样成立。我在实现中发现螺旋项和惯性权重叠加之后滚球个体的搜索轨迹会变得比较“绕”如果地图障碍密集容易把路径带偏。因此实际代码里给螺旋项乘了一个随迭代次数递减的系数前期螺旋探索幅度大后期逐渐压平避免在收敛阶段还带着航线扭来扭去。这个细节我用一版没有衰减系数的对照实验验证过——加了衰减之后最终路径的平滑度指标提升了大约15%。2.3 繁殖与觅食动态边界让开发更细原版DBO的繁殖行为是雌性蜣螂在粪球附近产卵产卵区域由当前种群中适应度最优的几个个体围出来的边界决定。这个设计本质上是局部搜索——在当前较优区域附近撒点。但原版的边界是固定的一旦种群在优化早期就聚集到某个区域这些固定边界会严重限制产卵位置的分布范围导致局部搜索退化成了“在同一个点周围反复扰动”。改造方案很直接让繁殖边界随迭代次数动态收缩。迭代前期繁殖区域保持较宽的边界允许产卵个体在较大范围内探索迭代后期边界按余弦曲线收缩到全局最优个体附近使得最后阶段的局部搜索更加精细。余弦收缩比线性收缩的曲线更平滑前期收缩速度慢、后期收缩速度快符合算法“前期保持多样性后期快速收敛”的习惯节奏。觅食行为小蜣螂寻找食物的更新也做了类似处理。原版是朝着全局最优的方向搜索但步长固定容易在最优附近振铃。我加了一个随迭代递增的局部搜索半径让后期的小蜣螂能在最优个体周围做半径逐步缩小的同心圆式搜索相当于把“粗定位”变成“精瞄准”。这里有个工程上的小经验动态收缩因子不要直接用迭代次数做线性映射最好做成归一化的曲线函数并用当前最优适应度是否还在下降来做判断——如果连续若干代最优适应度没有变化说明可能陷入了局部最优应该人为扩大繁殖边界给种群一个“跳出来”的机会。我管这个叫“不满则扩”策略实际用起来比纯按代数收缩稳健得多。2.4 偷窃阶段与正弦余弦算子既不早熟也不乱跑偷窃行为是DBO最特别的一个阶段一部分偷窃蜣螂围绕全局最优个体附近抢食位置更新为在最优个体位置附近生成一个随机偏移。这个阶段如果个体数目占比太高种群会非常快地聚集到当前最优附近多样性急剧下降——而后续迭代如果一直找不到更好的解整个种群就被锁死了。我的改进分两步。第一步把偷窃个体的比例从原版的固定比例改成动态调整。迭代前期偷窃比例降低到10%左右让更多个体参与全局探索迭代后期偷窃比例逐步升到25%加强对当前最优邻域的精细开发。第二步偷窃阶段的随机偏移不再使用均匀分布的随机向量而是改用正弦余弦算法SCA的震荡因子 X_new X_best r1 * sin(r2) * |r3 * X_best - X_i| 或以同理的余弦项其中r1随迭代递减r2、r3是随机数。这个公式的意义在于偏移方向不再是完全随机的而是在正弦和余弦两种模式下交替震荡让偷窃个体围绕最优个体做波浪式的摆动搜索。相比均匀随机偏移这种搜索路径更有序不容易出现偷窃个体突然飞出去很远的情况。当然正弦余弦因子用起来有个前提偷窃阶段的搜索幅度必须和当前迭代阶段的收敛程度匹配。如果迭代后期还维持较大的r1值偷窃个体反而会成为破坏收敛的“捣乱分子”。所以代码里r1的取值范围我设定在前期的1.0逐渐衰减到尾期的0.2保证后期偷窃个体虽然活跃但不会跳出已经收敛的区域太远。3. 环境建模与代价函数你不是在画曲线是在做权衡算法层面的改进说完了但路径规划不能脱离环境建模和代价函数单聊。这一节的地位反而比算法改进更关键——因为无论你用的优化算法多先进代价函数设置不合理规划出来的航线就是“看着短现实没法飞”。很多论文里跑出来的漂亮轨迹放到真实地理数据上一试就露馅几乎都是在建模这步偷了懒。3.1 地形建模与航迹离散化模拟山体地形我用的是一种比较标准的做法用若干个高斯函数叠加构造山峰再叠加一个低幅度的正弦地形涟漪模拟起伏丘陵。具体形式如下Z(x,y) Σ A_i * exp(-((x-x_i)² (y-y_i)²) / (2σ_i²)) 0.1 * sin(2πx/200) * cos(2πy/300)每个山峰的参数峰值高度A_i、中心坐标(x_i,y_i)、宽度σ_i可以自由设定。这个模型的好处是连续可导、参数直观、方便复现想要构造不同地形只需要改几个数字不需要换环境模型。在这套测试地图里我在起点到终点之间的连线上故意放置了四座山峰让直线飞行路径至少与三座山体相交逼着算法必须做出绕障调整。航迹离散化方面设定两个相邻航迹点之间的路径用线性插值等分成N段N默认设为10。规划出的一组航迹点假设有M个经过插值后变成M×N1个路径点逐个判断这些点是否和地形相交、是否满足离地高度约束。这样做的原因是优化算法的变量维度只取决于航迹点个数而障碍检测和代价计算在插值后的细粒度路径上进行精度更高。这里我想特别强调一点航迹点数量不要设太大。变量维度每增加3搜索空间就会往上“涨”一截。我常用的配置是3到5个航迹点加两端固定点再用样条平滑。5个航迹点意味着15个优化变量对群智能算法来说已经是比较舒适的维度如果设到10个航迹点以上算法收敛速度会明显变慢除非地形极度复杂否则不划算。3.2 代价函数各分量的权重设置代价函数是路径规划的“指挥棒”它决定算法往哪个方向优化。我的代价函数由四个分量组成航程代价、高度代价、平滑代价和障碍代价。公式如下F w1 * L_path w2 * H_avg w3 * S_curve w4 * P_obstacle其中L_path是路径总长度H_avg是平均飞行高度S_curve是航向变化率转角大小P_obstacle是障碍惩罚项。四个分量各自的权重直接决定了航线风格。从我的调试经验看权重的数量级匹配比绝对数值更重要。如果你设w11、w21而路径长度量纲是几百米高度量纲也是几百米两个分量势均力敌没问题但如果某个分量数值上天然就比其他分量大两个数量级它会直接淹没其余项。所以我建议每个分量先做归一化处理再乘权重。比如航程代价除以起点到终点的欧氏距离高度代价除以最大允许高度这样各分量都落在0到1左右的范围权重设置只需要关心相对偏好。在实际应用中我的基准权重配置是w11.0、w20.1、w30.3、w410.0。障碍惩罚的权重给得最大因为它对应的是“绝对不能碰”的硬约束惩罚值要足够高让任何触碰地形的航线在适应度上直接被淘汰。平滑代价给0.3强调航线转角不能太突兀因为真实无人机有转弯半径限制。高度代价给0.1只作为软偏好——不强制压低飞行高度但在同等条件下倾向于选择贴地飞行的路线这样可以降低被雷达发现的概率。3.3 约束条件怎么进适应度约束处理是很多人容易想当然的一步我多啰嗦几句。航线的每一段插值点都要检查是否低于当前地形高度。一旦发生穿越不是简单地把该点拉高到地形高度以上而是在代价函数的障碍惩罚项里累加一个很大的惩罚量。惩罚量的设计有两种风格线性惩罚和指数惩罚。线性惩罚是每穿透一米的深度惩罚值累计固定金额指数惩罚则是穿透越深惩罚增长越快呈指数上升。我倾向于指数惩罚因为它在数学上构造了一个“势阱”算法迭代中会优先把穿透最深的航迹点抬高然后是次深的点这样优化过程比较平滑不会出现有的点抬高过度、有的点还是穿山的情况。爬升角和转弯半径这类运动学约束我采用软化处理。具体来说如果某段航线的爬升角超过最大爬升角限制就在平滑代价里额外增加一个惩罚项。软化处理的好处是算法不用在可行域边界上来回试探而是通过惩罚引导个体逐步调整航迹点位置使得最终航线满足运动学约束。要提醒的是如果约束很严格惩罚系数必须调得足够大否则算法找到的最小值虽然“在适应度上很优”但实际飞行时根本飞不出来。曾经有个实验让我印象很深我把转弯半径约束的惩罚系数设小了0.3算法规划的航线在代价函数评估时非常漂亮——航程短、绕障干净——但把航迹点输给飞控仿真模块后飞机在某个急转弯处直接超出最大倾斜角我这才意识到适应度评估和真实可飞性之间有巨大的鸿沟。从那以后我对约束惩罚系数都调得格外保守。4. Matlab程序结构与关键代码逻辑Matlab是这类算法原型验证的首选环境矩阵运算方便、画图调试直观、社区里现成的算法包也很多。下面我按主程序流程、核心算子的函数实现和参数配置建议三个层面把程序骨架讲清楚。完整的代码我不在这里逐行贴了只讲清楚框架和关键实现细节方便你对着自己的项目改造。4.1 主程序流程整套程序的核心流程分五个阶段环境初始化、算法参数配置、种群初始化、迭代优化、结果可视化。第一阶段生成地形网格数据。用meshgrid生成x和y坐标网格带入地形函数计算Z值并存为地形矩阵。这一步在迭代循环前完成运行时只查表不重复计算省下大量运算时间。第二阶段配置算法参数。包括种群规模N、最大迭代次数MaxIter、航迹点数量M、插值段数SegNum、代价函数权重w1到w4、以及DBO特有的行为切换比例等。我建议把参数全部集中在一个结构体变量里例如params.pop_size、params.max_iter这种命名方式方便后续批量做参数实验。第三阶段初始化。用反向学习策略生成种群初始位置矩阵每个个体维度为3×M前M个数对应x坐标中间M个对应y坐标后M个对应z坐标。这里要特别注意坐标范围的映射——不能只生成在[0,1]之间再乘1000完事最好直接按地图实际范围生成省得后续代码里到处做单位换算。第四阶段循环迭代。每轮迭代先计算全部个体的适应度并排序然后按排序结果将个体划分到滚球、繁殖、觅食、偷窃四种行为组里分别执行对应的位置更新公式。每一轮更新后都要做越界修正把超出地图范围的坐标拉回到边界上。第五阶段输出结果。画出三维地形曲面、规划的航迹线、收敛曲线再把航迹点坐标导出成CSV文件方便后续给飞控仿真程序使用。4.2 核心算子实现细节滚球阶段是改进最集中的地方代码逻辑大致如下function newpos DBO_roll(pos, bestpos, iter, maxIter, lb, ub) w 0.9 - iter * (0.5 / maxIter); % 自适应惯性权重 lamda 1 - iter / maxIter; % 螺旋衰减系数 b 1; l (rand - 0.5) * 2; % 螺旋搜索项 spiral bestpos exp(b*l) * cos(2*pi*l) * abs(bestpos - pos) * lamda; % 朝最优方向 惯性扰动 direct bestpos w * (pos - bestpos) .* rand(size(pos)); newpos 0.5 * spiral 0.5 * direct; % 越界修正 newpos max(min(newpos, ub), lb); end这里0.5和0.5的组合是经验值我试过0.7/0.3和0.3/0.7的组合最终发现五五开在收敛速度和路径质量之间平衡最好。另外螺旋项和直接项都是向量操作Matlab里必须确保维度匹配如果航迹点数量比较大建议改用bsxfun或直接广播机制避免循环造成性能瓶颈。繁殖和偷窃阶段的代码要点在于边界收缩和正弦余弦因子的实现。繁殖区域的动态边界可以用如下方式计算shrink 0.5 * (1 cos(pi * iter / maxIter)); % 余弦收缩因子 lb_breed bestpos - shrink * (ub - lb) * 0.2; ub_breed bestpos shrink * (ub - lb) * 0.2;这个收缩因子的初始值为1末期接近0正好符合“前期宽、后期窄”的需求。注意繁殖边界是基于全局最优个体位置而非种群均值位置这能保证边界始终围绕当前最有希望的区域收缩不至于被群体整体偏移带偏。偷窃阶段引入正弦余弦震荡后位置更新公式在代码里要特别小心sin和cos的参数——建议分开写别合并成一个表达式否则调试时看不出问题出在哪一步。4.3 参数配置建议下面这组参数是我在2km×2km×0.5km地图上反复调出来的基准配置拿去做你的第一版实验基本能跑出不错的效果。参数名称建议值说明种群规模50再大收敛速度慢再小容易早熟最大迭代次数200本问题150代后已趋稳200留余量航迹点数量5含首尾两点实际自由变量9个插值段数10每段之间等分10个检测点障碍惩罚系数10.0指数惩罚底数越大越保守高度代价权重0.1软偏好不强制贴地平滑代价权重0.3控制转弯幅度滚球螺旋衰减系数1→0线性衰减到0偷窃比例区间10%→25%随迭代线性增长这套参数我用蒙特卡洛方式跑过20次独立重复实验最终的航线代价均值标准差大约在3%以内稳定性可以接受。如果你换地图或者换了代价函数权重参数需要再滚一轮实验不要直接照抄。5. 实测结果怎么看对比分析的正确打开方式做完改进和代码实现接下来就是实验验证环节。我把改进后的DBO简称IDBO和原版DBO、粒子群算法PSO以及灰狼优化算法GWO放在同一地图、同一代价函数、同一初始种群规模下做了对比。下面从收敛曲线、航迹形态和稳定性三个维度说说怎么看这些结果。5.1 收敛曲线能说明什么收敛曲线是判断算法迭代效率最直观的工具。从趋势上看IDBO的前期收敛速度明显领先——第20代左右航迹代价就降到原版DBO第80代才达到的水平这就是反向学习初始化和自适应惯性权重叠加的效果。中期50到120代IDBO曲线没有出现明显的“平台期”代价持续下降这说明螺旋搜索项确实在持续寻找更优路径而不是被某个局部最优锁死。后期150代以后曲线趋平最终代数百次测试基本都落在了同一个航迹代价区间内。但这里我要特别提醒一点收敛曲线只能看相对趋势不能只看绝对值定优劣。有些论文把几条收敛曲线放一起Y轴范围掐头去尾视觉上A算法“明显更优”其实差异可能不到3%。正确的做法是固定纵轴范围、横轴对齐、标注终值误差带。我在对比时会把20次独立运行的终值平均值和标准差都列出来用均值代表算法“找得好不好”用标准差代表算法“稳不稳定”两者分开评估。5.2 航迹对比和稳定性对比从航迹形态上看PSO规划的路径在绕障最明显的地方往往比较“愣”——贴着障碍边界直上直下存在比较大的偏航角突变GWO的航迹平滑度比PSO好但绕障距离偏大总体航程长了8%左右原版DBO航迹介于两者之间偶尔会出现在某个山峰坡度较缓的一侧“穿腰而过”的现象虽然没触发惩罚但离地高度已经压得太低IDBO的航迹是最“懂事”的一条——绕障时保持了约40到60米的离地安全距离转弯段的曲率过渡平滑总航程比GWO短了6%比原版DBO也短了将近4%。稳定性方面20次重复实验中IDBO的标准差最小没有出现过“一次很好下次很差”的跳跃。相比之下原版DBO有时候能跑出很好的解有时候会卡在一个极差的局部区域——这种不稳定性在无人机实际任务中是致命的因为你不可能每次都靠运气飞到好解。稳定性分析这块我还做了另一个有意思的测试把起终点坐标换掉起点放在地形边缘、终点放在两座山峰之间的峡谷区域重新跑20次实验。IDBO在这组更刁钻的地形上依然保持了较低的代价方差而原版DBO跑出了两三条严重穿越山体的失败航迹。这个结果背后是反向学习和动态收缩机制带来的多样性缓冲——当搜索环境变苛刻时种群多样性高意味着总有个体会落在可行的搜索通道里。5.3 一个重要的注意事项对比分析这个环节基本每个搞算法的都会碰见但绝大多数人忽略了一个关键点对比实验要控制变量到什么程度才公平常见的问题是让不同算法的迭代次数相同但种群规模不同或者代价函数权重设置不同甚至起终点设置都变了这种对比结果没有说服力。我的控制变量策略是种群规模统一为50迭代次数统一为200代价函数的权重参数完全一样起终点完全一样唯一的区别就是算法本体。这样收敛曲线的差异才能归因于算法而不是因为某个算法占了便宜。另一个容易踩的坑是“只比平均值”。算法的单次运行具有很强的随机性可能PSO某次爆发跑出个极低代价平均值被拉低但它的中位数还是个菜鸡水平。我在对比时默认看四组统计量最小值、最大值、均值、标准差。如果某算法最小值很好看但标准差特别大说明它只是偶尔走运这不叫好算法——叫“碰运气算法”。6. 参数调节与避坑经验最后这部分没有太多“高深理论”都是一轮轮实验磨出来的实战经验。我把最容易翻车的几个点单独拎出来说说希望你不用重复踩。6.1 容易踩的坑第一个坑是地形数据的尺度不一致。三维坐标里x、y是几百到两千的量级z是几百的量级而代价函数计算时如果不做归一化路径长度分量和高度的数值天然相差一个量级。有的分量直接被湮没算法等于只优化了路径长度其他约束形同虚设。解决方案前面提过先归一化再乘以权重这一步省不得。第二个坑是把算法的搜索边界设成地图的完整范围。起点和终点之间的直线走廊本来就很窄如果你把搜索边界撑满整张地图算法会花大量迭代去探索那些根本不可能用到的区域。我更推荐的做法是把搜索边界设定为起点和终点连线的邻域比如各方向扩展50到100米。这样搜索空间大幅收缩收敛速度和路径质量都会明显提高。第三个坑是航迹插值的段数设得太少。如果每段只插值3到5个点地形检测会漏掉山峰的尖峰区域——航线在地形网格点之间穿过去但插值点刚好都在山体上方适应度评估误判为安全。我建议插值段数至少10甚至20也可以接受代价只是适应度计算稍微变慢但对障碍检测可靠性的提升非常显著。第四个坑是迭代次数和种群规模一起加加完发现运行时间爆炸。有些新手容易陷入“暴力堆资源”的思路实际上对这种低维度路径规划问题种群50、迭代150到200次已经非常充裕。我把种群加到100、迭代加到500做过对照组实验最终代价只降低了1.5%不到但运行时间翻了4倍。性价比很低不推荐。6.2 我对改进与传统调优的个人建议经过这几轮折腾我最大的体会是改进群智能算法的正确姿势是“先诊断后动刀”。不要一上来就上各种策略大杂烩——种群多样性不够就加反向学习步长调整不灵活就加自适应权重局部搜索不精细就加动态边界收缩。每加一个策略都跑一组对照实验量化它带来的收益。如果某个策略对最终结果的影响几乎可以忽略果断删掉它给程序减负。还有一个细节是随机数种子的管理。实验对比时确保所有算法用同一组随机种子这样在同一起点下比较才更公平。虽然本质上群智能算法的随机性没法完全消除但控制种子可以让实验可复现审稿或评审时也能交代清楚。我在代码里默认会把随机数种子作为参数暴露出来默认值通常设定为某个固定整数方便复现实验结果。回头说说那组“不满则扩”的动态调整策略在实际项目里帮了我大忙。有次做某跨平台系统的路径规划模块时地形环境换了一个峡谷密集的新区域原版DBO怎么跑都卡在局部最优——所有个体都挤在一条穿过峡谷的通道里绕不出来。加了基于最优适应度停滞检测的边界扩大策略之后算法在停滞10代后会自动把繁殖边界扩大一次给了种群重新探索的机会。那次实验让我更确信一件事算法改进不是堆砌技巧而是针对病根下药。如果你打算把DBO用到自己的三维路径规划项目里我的建议是先从原版DBO跑通整条流程确认代价函数和环境建模没有bug再逐步加改进策略每次只动一个点观察效果。这样即使某一步出了问题你也知道该回退到哪里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑