拓冰建站拓冰建站
首页 / 资讯中心 / 正文

狼群算法在无人机对抗推演中的Matlab实现与参数调优

简介面向无人机集群对抗仿真场景的MATLAB源码以狼群算法为核心实现多无人机协同对抗策略。狼群算法模拟头狼召唤、探狼游走、猛狼围攻等协作机制可映射无人机的搜索、追踪与进攻决策资源定位于需要学习群体智能算法在无人机攻防领域应用的研究者、竞赛队伍或高年级本科生。压缩包大小约9KB轻量紧凑核心实现以MATLAB脚本为主适合直接运行与二次修改。目前已有523人浏览学习代码结构清晰包含算法主流程、参数初始化及对抗效果可视化等模块有助于快速复现实验并在此基础上调整参数或扩展对抗规则。通过简单参数调整即可观察不同围捕策略的对抗效果便于教学演示与二次开发。整体上是一份小而精的算法演示资源便于在短时间内掌握狼群算法应用于无人机对抗的基本思路。1. 狼群算法与无人机对抗为什么这个标题值得看无人机对抗仿真比普通路径规划难在双方都在动态决策你预测的航线下一秒就可能被对方打断。传统粒子群算法在静态寻优时表现稳定但进入对抗场景后收敛过快、种群多样性快速衰减容易被对手抓住运动规律。狼群算法Wolf Pack Algorithm, WPA把搜索过程切成语义鲜明的游猎、召唤、围攻三个阶段正好对应对抗推演里的广域搜索、集中集结、末端围捕配合Matlab代码可以在分钟级得到一组可复现的红蓝攻防轨迹。这篇文章从数学模型讲起落到可直接运行的Matlab代码适合正在做无人机集群课题的研究生也适合想从路径规划切入无人机博弈仿真、又不想从零编写优化器的工程师。标题里提到的代码压缩包我会按工程惯例给出文件划分方式不依赖于特定版本。2. 狼群算法原理与无人机对抗建模2.1 狼群捕猎行为到无人机攻防策略的映射狼群算法模拟的是灰狼群体在捕猎中的协作行为核心包括三个语义明确的阶段游猎阶段探路狼分散在多个方向搜索猎物踪迹召唤阶段头狼发现目标后发出远距离信号召唤附近狼向目标方向靠拢围攻阶段狼群收缩包围圈从多个方向同时靠近猎物完成围捕。三个阶段在无人机对抗中能一一映射。狼群行为算法阶段无人机对抗对应策略探路狼搜索游猎多无人机分区巡逻覆盖未知空域头狼召唤召唤发现目标后引导编队向威胁方向集结狼群围攻围攻多机协同从不同方位围捕目标这个映射关系决定了参数设计思路游猎阶段需要较大的随机步长和较低的方向一致性保证搜索覆盖度召唤阶段需要向当前最优个体收敛方向一致性增强围攻阶段步长逐步减小最后由距离目标最近的个体发起末端攻击。论文里常把这三种运动模式叫做“分布式搜索 — 集中式引导 — 末端围捕”无人机集群对抗课题里可以直接套这套逻辑。2.2 对抗推演的数学模型2.2.1 位置更新与目标函数以二维空域为例每头狼代表一架无人机的投影位置决策变量是坐标。无人机对抗场景中目标函数的设计需要考虑两个部分一是与目标之间的距离二是保持编队协同的代价。基础的目标函数可以写成score w1 * norm(pos - target_pos) w2 * formation_cost(pos, pack_pos)w1和w2是权重系数前者控制追踪优先级后者控制队形保持程度。实际对抗推演中formation_cost通常取当前无人机与编队几何中心的距离标准差。位置更新公式采用最简形式pos_new pos_old step * direction levy_jumpdirection由阶段决定游猎阶段随机生成召唤阶段指向头狼位置围攻阶段指向目标当前位置levy_jump是莱维飞行的随机扰动项用来防止算法陷入局部最优。step是步长控制量随迭代线性衰减衰减方式可以写为step step_max * (1 - iter/max_iter);这里的iter是当前迭代次数max_iter是最大迭代。衰减率固定保证前期搜索范围大、后期精细收敛。2.2.2 头狼选举与角色更替机制头狼不是固定的。每次迭代结束后会计算全部狼的目标函数值把当前最优个体设为新头狼。角色更替的逻辑是如果新头狼连续多代没有更新说明种群可能陷入局部最优此时重置部分探路狼的位置扩大搜索范围。这个机制叫“头狼退化重置”是与粒子群最显著的差异点。if stagnation_count stale_limit scout_idx randperm(pack_size, ceil(pack_size * 0.3)); pack_pos(scout_idx, :) lb (ub - lb) .* rand(length(scout_idx), dim); stagnation_count 0; end重置比例取种群规模的 30% 是常用区间比例过小无法打破聚集状态比例过大会让收敛变慢甚至发散。stagnation_limit一般设 510 代取决于地形复杂度。2.3 狼群算法 vs 粒子群/遗传算法的选型对比在无人机对抗课题里选型不应该只看论文标题要看清研究对象是静态寻优还是动态博弈。对比项狼群算法 WPA粒子群 PSO遗传算法 GA阶段划分游猎、召唤、围攻三阶段无阶段划分选择、交叉、变异局部最优逃逸头狼重置机制速度重置但缺乏语义变异率控制对抗场景适配三阶段对应攻防节奏收敛快易被预判变异算子难以解释参数数量6~8 个4~5 个4 个实际工程中如果只需要一次快速寻优粒子群足够但如果要模拟多次对抗回合狼群算法的三阶段语义让每次迭代的输出都可以对应到战术行为便于分析哪一步出了问题。遗传算法的问题在于交叉变异算子缺乏物理意义生成的新位置可能落在禁区调试起来费劲。我一般会保留狼群算法作为主框架后面在改进环节引入粒子群的速度项来加速收敛。3. Matlab代码实现从狼群算法到无人机对抗推演3.1 代码文件结构与数据流标题里的“附matlab代码.zip”在实际工程中通常对应三个文件wpa_base.m存放狼群算法主体函数uav_conflict_scene.m负责初始化战场环境、目标和无人机编队run_demo.m是入口脚本串起整个推演流程。下面给出标准的文件划分方式├── run_demo.m # 入口脚本配置参数并调用推演 ├── wpa_base.m # 狼群算法主函数 ├── uav_conflict_scene.m # 对抗场景初始化与目标函数 ├── plot_tracks.m # 轨迹可视化 └── evaluate_metrics.m # 结算评估指标run_demo.m只做三件事设置随机种子、加载参数、循环调用wpa_base。wpa_base不关心对抗规则只接受目标函数句柄和边界条件。数据流向是run_demo把uav_conflict_scene返回的函数句柄传给wpa_basewpa_base在每次迭代里调用该句柄计算适应度最后把全局最优个体输出给plot_tracks。% run_demo.m 入口脚本核心逻辑 rng(42); % 固定随机种子保证可复现 scene_params struct(width, 100, height, 100, target_pos, [80, 20]); [fitness_func, init_pack] uav_conflict_scene(scene_params); [best_pos, best_score, history] wpa_base(fitness_func, init_pack, ... struct(pack_size, 30, max_iter, 200, step_max, 8));代码说明rng(42)固定随机种子是复现实验的基础很多调试问题来源于随机性不可控跑十次结果完全不一样加上这一行后每次运行轨迹一致。scene_params用结构体传参比逐参数传更清晰后续加障碍物、风速直接扩展字段即可。3.2 核心函数wpa_base.m 实现wpa_base是狼群算法的核心需要实现游猎、召唤、围攻三个阶段的切换和对应的位置更新。这里给出一个能在Matlab R2021a 及以上版本直接运行的精简实现逻辑完整没有使用工具箱function [best_pos, best_score, history] wpa_base(fitness_func, init_pack, opt) % wpa_base: 狼群算法主函数 % 输入: % fitness_func - 目标函数句柄输入Nx2位置矩阵输出Nx1分数 % init_pack - 初始狼群位置pack_size x dim % opt - 参数结构体包含 pack_size, max_iter, step_max % 输出: % best_pos - 全局最优位置 % best_score - 全局最优分数 % history - 每代最优分数用于收敛曲线 pack_size opt.pack_size; max_iter opt.max_iter; step_max opt.step_max; dim size(init_pack, 2); lb opt.lb; ub opt.ub; % 初始化狼群位置和分数 pack_pos init_pack; score fitness_func(pack_pos); [best_score, best_idx] min(score); best_pos pack_pos(best_idx, :); history zeros(max_iter, 1); stagnation_count 0; for iter 1:max_iter step step_max * (1 - iter/max_iter); % 步长线性衰减 % 阶段一: 游猎 - 按概率探索 scout_idx rand(pack_size, 1) 0.3; if any(scout_idx) direction randn(sum(scout_idx), dim); direction direction ./ vecnorm(direction, 2, 2); % 归一化方向 pack_pos(scout_idx, :) pack_pos(scout_idx, :) step * direction ... levy_flight(sum(scout_idx), dim); end % 阶段二: 召唤 - 向头狼靠拢 approach_idx ~scout_idx; if any(approach_idx) direction best_pos - pack_pos(approach_idx, :); direction direction ./ vecnorm(direction, 2, 2); pack_pos(approach_idx, :) pack_pos(approach_idx, :) step * direction; end % 阶段三: 围攻 - 向目标位置线性收缩 siege_dist vecnorm(pack_pos - best_pos, 2, 2); siege_idx siege_dist step * 2; if any(siege_idx) pack_pos(siege_idx, :) best_pos 0.5 * (pack_pos(siege_idx, :) - best_pos); end % 边界约束 pack_pos min(max(pack_pos, lb), ub); % 更新分数与头狼 score fitness_func(pack_pos); [iter_best, iter_idx] min(score); if iter_best best_score best_score iter_best; best_pos pack_pos(iter_idx, :); stagnation_count 0; else stagnation_count stagnation_count 1; end % 头狼退化重置 if stagnation_count opt.stale_limit reset_num ceil(pack_size * 0.3); reset_idx randperm(pack_size, reset_num); pack_pos(reset_idx, :) lb (ub - lb) .* rand(reset_num, dim); stagnation_count 0; end history(iter) best_score; end end function L levy_flight(n, dim) % 莱维飞行随机跳跃防止陷入局部最优 beta 1.5; sigma (gamma(1beta) * sin(pi*beta/2) / ... (gamma((1beta)/2) * beta * 2^((beta-1)/2)))^(1/beta); u randn(n, dim) * sigma; v randn(n, dim); L u ./ (abs(v).^(1/beta)) * 0.01; end代码说明游猎阶段使用随机方向加莱维飞行其中vecnorm(direction, 2, 2)是逐行归一化确保每个方向向量模长为 1避免方向向量的长度不一致导致步长失真。召唤阶段直接向头狼位置靠近这里没有加入噪声项实际对抗场景中如果发现收敛过快可以在方向后加上小幅随机扰动。围攻阶段的判定条件是“距离头狼小于当前步长的两倍”在这个范围内进行减半收缩模拟狼群收紧包围圈。整个循环中的随机数每代都会重新生成配合外部固定的随机种子保证每次运行轨迹一致。3.3 参数初始化表与命令调用方式狼群算法在无人机对抗推演中的参数需要拆成两类来看一类是算法参数控制搜索行为另一类是场景参数控制对抗条件。两者要分开配置不要混在同一个结构体里。下面的表格整理了常用范围和典型值参数含义典型值调试范围pack_size狼群规模3020~50max_iter最大迭代次数200100~500step_max初始最大步长84~15stale_limit头狼停滞代数阈值85~15scout_ratio游猎狼比例0.30.15~0.45reset_ratio重置比例0.30.2~0.4w1追踪目标权重0.70.5~0.9w2编队保持权重0.30.1~0.5在run_demo.m中调用wpa_base后还需要把历史最优分数画出来判断算法是否收敛。收敛曲线的绘制方法是figure; plot(history, LineWidth, 1.5); xlabel(迭代次数); ylabel(最优目标函数值); title(狼群算法收敛曲线); grid on;这里history是wpa_base返回的每代最优分数向量保存它的意义在于定位算法是否在迭代后期还在大幅下降如果曲线在最后几十代还在明显下降说明max_iter不够需要增大迭代次数。如果曲线前 20 代就已经平了说明种群多样性不足要检查scout_ratio是否太低或step_max是否太大导致过早收敛。4. 无人机对抗仿真场景搭建与参数调整4.1 红蓝对抗场景初始化狼群算法在无人机对抗推演中的典型用法是让蓝方无人机集群使用狼群算法追踪红方目标同时红方目标带有简单的规避策略。目标函数里的target_pos不是固定值每个推演步长结束后红方会做一次机动比如改变方向或加速。建立对抗场景时需要定义三维数组第一个维度是推演回合数第二个维度是无人机架数第三个维度是位置分量。初始化脚本如下function [fitness_func, init_pack] uav_conflict_scene(scene_params) % 初始化对抗场景 width scene_params.width; height scene_params.height; target_pos scene_params.target_pos; % 蓝方无人机初始位置随机分布在左半区域 init_pack [rand(30, 1) * width/2, rand(30, 1) * height]; % 红方目标位置固定为场景右上角附近的随机偏移 target_state target_pos randn(1, 2) * 5; % 返回目标函数句柄 fitness_func (pos) evaluate_score(pos, target_state); end function score evaluate_score(pos, target_state) % 目标函数: 距离惩罚 编队代价 distance_penalty vecnorm(pos - target_state, 2, 2); centroid mean(pos, 1); formation_penalty vecnorm(pos - centroid, 2, 2); score 0.7 * distance_penalty 0.3 * formation_penalty; end代码说明evaluate_score里对每一架无人机分别计算距离惩罚和编队惩罚距离惩罚让无人机向目标靠近编队惩罚让它们不挤在一起。centroid是当前狼群的几何中心formation_penalty是每架无人机到中心的距离。这里的target_pos是初始目标位置实际推演中红方会移动需要在主循环里动态更新在wpa_base中每次迭代前调用一次fitness_func时重新计算当前目标状态。4.2 执行推演与结果可视化推演主体不是单次调用wpa_base而是在时间轴上循环调用。每个推演步长内蓝方使用狼群算法优化一次位置红方做一次规避机动然后进入下一个步长。实际工程中我一般把推演步长设置为 0.5 秒对应一个控制周期算法迭代 30 次作为该步长内的寻优预算。主循环如下% 推演主循环 total_time 10; % 总推演时长 10 秒 dt 0.5; % 步长 0.5 秒 num_steps total_time / dt; track_blue zeros(num_steps1, 30, 2); % 保存蓝方轨迹 track_red zeros(num_steps1, 1, 2); % 保存红方轨迹 for t 1:num_steps % 蓝方调用狼群算法更新位置 opt.max_iter 30; % 步长内迭代次数 [blue_pos, ~, ~] wpa_base(fitness_func, blue_pos, opt); % 红方做简单规避: 远离蓝方质心 centroid_b mean(blue_pos, 1); evade_dir (blue_pos(1, :) - centroid_b) / norm(blue_pos(1, :) - centroid_b); red_pos red_pos 3 * dt * evade_dir; % 保存轨迹 track_blue(t1, :, :) blue_pos; track_red(t1, :, :) red_pos; end代码说明红方的规避策略是“朝远离蓝方质心的方向移动”这是对抗仿真里最基础的规避模式逻辑是如果红方保持静止蓝方最终会围捕成功如果红方朝蓝方集群中心相反方向逃跑蓝方需要不断调整搜索方向。evade_dir的计算用当前红方位置减去蓝方质心再归一化得到方向向量。这个策略虽然简单但已经足够让狼群算法暴露出参数问题比固定目标的静态寻优更能检验算法的适应性。轨迹可视化的关键是绘制多架无人机的运动过程而不是只画最终位置figure; hold on; grid on; for i 1:30 plot(squeeze(track_blue(:, i, 1)), squeeze(track_blue(:, i, 2)), -, LineWidth, 0.8); end plot(squeeze(track_red(:, 1, 1)), squeeze(track_red(:, 1, 2)), r-, LineWidth, 2); xlabel(X/m); ylabel(Y/m); legend(蓝方无人机, 红方目标);squeeze的作用是去掉track_blue中空的单例维度把它变成 2D 数组才能被plot正确解析。从运行结果看狼群算法的游猎阶段会产生大量交叉轨迹这是正常现象说明多机在并行搜索不必担心轨迹交叉在物理上是否冲突因为当前模型只关心 2D 位置投影。4.3 4个关键参数如何调优调试狼群算法时四个参数最值得调整scout_ratio、step_max、stale_limit、w1/w2权重比。下面说明每个参数的具体影响和调试方法。参数调低的影响调高的影响推荐调试策略scout_ratio搜索范围缩小快速向头狼靠拢搜索更充分但收敛变慢从 0.3 开始每次增减 0.05step_max前期步长短移动缓慢前期覆盖面大但容易跳过最优从 8 开始按场景尺寸的 8%~15% 调整stale_limit头狼频繁重置收敛不稳定长时间不重置可能困在局部最优5~10 之间试探w1编队更整齐但追踪慢追踪更快编队松散先固定 w10.7观察是否出现掉队在无人机对抗场景里w1和w2的权衡直接对应战术选择w1高时无人机会优先追击目标队形保持差容易被各个击破w2高时编队整齐但围捕速度慢目标容易逃出范围。实际调参时先固定算法参数跑一轮画收敛曲线观察曲线下降趋势是否平缓再调整两个权重。以 30 架无人机、100m×100m 空域为例step_max8合适如果空域扩大到 500mstep_max需要同步提升到 20 以上。5. 进阶技巧收敛性验证与无人机串级PID联动5.1 用箱线图验证算法稳定性单次运行的结果不足以说明狼群算法在对抗场景中可靠需要多次重复实验。常用的做法是固定随机种子范围连续运行 30 次记录每次推演的目标函数终值用箱线图输出分布情况。trials 30; final_scores zeros(trials, 1); for k 1:trials rng(k); % 不同种子 [~, score] wpa_base(fitness_func, init_pack, opt); final_scores(k) score; end boxplot(final_scores, Labels, {WPA}); ylabel(目标函数终值); grid on;箱线图能直观看出离群点的数量和分布如果离群点出现在上边界外说明有几次运行算法没有找到有效解需要回头检查reset_ratio和stale_limit的配置或者增大max_iter。5.2 向量化加速策略Matlab 里for循环逐行更新狼群位置的写法会明显拖慢运行速度。把位置更新改写成矩阵运算单次迭代的耗时可以下降到原来的五分之一。核心改进思路是先用向量计算所有狼的方向再统一做归一化和步长缩放而不是逐只狼调用目标函数。大规模场景里快速计算vecnorm是关键它对矩阵每一行做二范数返回的是列向量配合矩阵加减实现整批狼群的位置刷新。5.3 无人机串级PID与狼群算法的联动狼群算法输出的是位置控制指令不是飞控层的期望姿态。工程落地上通常把狼群算法的输出作为外环位置控制器的新参考值内环姿态控制使用传统的串级 PID 结构由飞控执行。位置环的参考输入来自wpa_base的best_pos对应无人机的目标航点而后位置环 PID 计算期望俯仰和滚转角姿态环 PID 计算期望油门和舵面量。时间间隔上外环位置更新频率通常设为 10Hz20Hz内环姿态频率 200Hz400Hz两者的时间尺度相差一个数量级。仿真过程中如果不加区分地让算法输出直接给电机飞控会很不可用这也是对抗仿真与真实飞行最大的差别所在。验证联动效果时检查内环指令响应是否在 300ms 内跟踪上外环输出以及超调量是否小于 15%这两项通过调外环 PID 的 P 和 D 参数解决。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门