對(duì)抗推演中的Matlab實(shí)現(xiàn)與參數(shù)調(diào)優(yōu))
簡介面向無人機(jī)集群對(duì)抗仿真場景的MATLAB源碼以狼群算法為核心實(shí)現(xiàn)多無人機(jī)協(xié)同對(duì)抗策略。狼群算法模擬頭狼召喚、探狼游走、猛狼圍攻等協(xié)作機(jī)制可映射無人機(jī)的搜索、追蹤與進(jìn)攻決策資源定位于需要學(xué)習(xí)群體智能算法在無人機(jī)攻防領(lǐng)域應(yīng)用的研究者、競賽隊(duì)伍或高年級(jí)本科生。壓縮包大小約9KB輕量緊湊核心實(shí)現(xiàn)以MATLAB腳本為主適合直接運(yùn)行與二次修改。目前已有523人瀏覽學(xué)習(xí)代碼結(jié)構(gòu)清晰包含算法主流程、參數(shù)初始化及對(duì)抗效果可視化等模塊有助于快速復(fù)現(xiàn)實(shí)驗(yàn)并在此基礎(chǔ)上調(diào)整參數(shù)或擴(kuò)展對(duì)抗規(guī)則。通過簡單參數(shù)調(diào)整即可觀察不同圍捕策略的對(duì)抗效果便于教學(xué)演示與二次開發(fā)。整體上是一份小而精的算法演示資源便于在短時(shí)間內(nèi)掌握狼群算法應(yīng)用于無人機(jī)對(duì)抗的基本思路。1. 狼群算法與無人機(jī)對(duì)抗為什么這個(gè)標(biāo)題值得看無人機(jī)對(duì)抗仿真比普通路徑規(guī)劃難在雙方都在動(dòng)態(tài)決策你預(yù)測的航線下一秒就可能被對(duì)方打斷。傳統(tǒng)粒子群算法在靜態(tài)尋優(yōu)時(shí)表現(xiàn)穩(wěn)定但進(jìn)入對(duì)抗場景后收斂過快、種群多樣性快速衰減容易被對(duì)手抓住運(yùn)動(dòng)規(guī)律。狼群算法Wolf Pack Algorithm, WPA把搜索過程切成語義鮮明的游獵、召喚、圍攻三個(gè)階段正好對(duì)應(yīng)對(duì)抗推演里的廣域搜索、集中集結(jié)、末端圍捕配合Matlab代碼可以在分鐘級(jí)得到一組可復(fù)現(xiàn)的紅藍(lán)攻防軌跡。這篇文章從數(shù)學(xué)模型講起落到可直接運(yùn)行的Matlab代碼適合正在做無人機(jī)集群課題的研究生也適合想從路徑規(guī)劃切入無人機(jī)博弈仿真、又不想從零編寫優(yōu)化器的工程師。標(biāo)題里提到的代碼壓縮包我會(huì)按工程慣例給出文件劃分方式不依賴于特定版本。2. 狼群算法原理與無人機(jī)對(duì)抗建模2.1 狼群捕獵行為到無人機(jī)攻防策略的映射狼群算法模擬的是灰狼群體在捕獵中的協(xié)作行為核心包括三個(gè)語義明確的階段游獵階段探路狼分散在多個(gè)方向搜索獵物蹤跡召喚階段頭狼發(fā)現(xiàn)目標(biāo)后發(fā)出遠(yuǎn)距離信號(hào)召喚附近狼向目標(biāo)方向靠攏圍攻階段狼群收縮包圍圈從多個(gè)方向同時(shí)靠近獵物完成圍捕。三個(gè)階段在無人機(jī)對(duì)抗中能一一映射。狼群行為算法階段無人機(jī)對(duì)抗對(duì)應(yīng)策略探路狼搜索游獵多無人機(jī)分區(qū)巡邏覆蓋未知空域頭狼召喚召喚發(fā)現(xiàn)目標(biāo)后引導(dǎo)編隊(duì)向威脅方向集結(jié)狼群圍攻圍攻多機(jī)協(xié)同從不同方位圍捕目標(biāo)這個(gè)映射關(guān)系決定了參數(shù)設(shè)計(jì)思路游獵階段需要較大的隨機(jī)步長和較低的方向一致性保證搜索覆蓋度召喚階段需要向當(dāng)前最優(yōu)個(gè)體收斂方向一致性增強(qiáng)圍攻階段步長逐步減小最后由距離目標(biāo)最近的個(gè)體發(fā)起末端攻擊。論文里常把這三種運(yùn)動(dòng)模式叫做“分布式搜索 — 集中式引導(dǎo) — 末端圍捕”無人機(jī)集群對(duì)抗課題里可以直接套這套邏輯。2.2 對(duì)抗推演的數(shù)學(xué)模型2.2.1 位置更新與目標(biāo)函數(shù)以二維空域?yàn)槔款^狼代表一架無人機(jī)的投影位置決策變量是坐標(biāo)。無人機(jī)對(duì)抗場景中目標(biāo)函數(shù)的設(shè)計(jì)需要考慮兩個(gè)部分一是與目標(biāo)之間的距離二是保持編隊(duì)協(xié)同的代價(jià)?;A(chǔ)的目標(biāo)函數(shù)可以寫成score w1 * norm(pos - target_pos) w2 * formation_cost(pos, pack_pos)w1和w2是權(quán)重系數(shù)前者控制追蹤優(yōu)先級(jí)后者控制隊(duì)形保持程度。實(shí)際對(duì)抗推演中formation_cost通常取當(dāng)前無人機(jī)與編隊(duì)幾何中心的距離標(biāo)準(zhǔn)差。位置更新公式采用最簡形式pos_new pos_old step * direction levy_jumpdirection由階段決定游獵階段隨機(jī)生成召喚階段指向頭狼位置圍攻階段指向目標(biāo)當(dāng)前位置levy_jump是萊維飛行的隨機(jī)擾動(dòng)項(xiàng)用來防止算法陷入局部最優(yōu)。step是步長控制量隨迭代線性衰減衰減方式可以寫為step step_max * (1 - iter/max_iter);這里的iter是當(dāng)前迭代次數(shù)max_iter是最大迭代。衰減率固定保證前期搜索范圍大、后期精細(xì)收斂。2.2.2 頭狼選舉與角色更替機(jī)制頭狼不是固定的。每次迭代結(jié)束后會(huì)計(jì)算全部狼的目標(biāo)函數(shù)值把當(dāng)前最優(yōu)個(gè)體設(shè)為新頭狼。角色更替的邏輯是如果新頭狼連續(xù)多代沒有更新說明種群可能陷入局部最優(yōu)此時(shí)重置部分探路狼的位置擴(kuò)大搜索范圍。這個(gè)機(jī)制叫“頭狼退化重置”是與粒子群最顯著的差異點(diǎn)。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重置比例取種群規(guī)模的 30% 是常用區(qū)間比例過小無法打破聚集狀態(tài)比例過大會(huì)讓收斂變慢甚至發(fā)散。stagnation_limit一般設(shè) 510 代取決于地形復(fù)雜度。2.3 狼群算法 vs 粒子群/遺傳算法的選型對(duì)比在無人機(jī)對(duì)抗課題里選型不應(yīng)該只看論文標(biāo)題要看清研究對(duì)象是靜態(tài)尋優(yōu)還是動(dòng)態(tài)博弈。對(duì)比項(xiàng)狼群算法 WPA粒子群 PSO遺傳算法 GA階段劃分游獵、召喚、圍攻三階段無階段劃分選擇、交叉、變異局部最優(yōu)逃逸頭狼重置機(jī)制速度重置但缺乏語義變異率控制對(duì)抗場景適配三階段對(duì)應(yīng)攻防節(jié)奏收斂快易被預(yù)判變異算子難以解釋參數(shù)數(shù)量6~8 個(gè)4~5 個(gè)4 個(gè)實(shí)際工程中如果只需要一次快速尋優(yōu)粒子群足夠但如果要模擬多次對(duì)抗回合狼群算法的三階段語義讓每次迭代的輸出都可以對(duì)應(yīng)到戰(zhàn)術(shù)行為便于分析哪一步出了問題。遺傳算法的問題在于交叉變異算子缺乏物理意義生成的新位置可能落在禁區(qū)調(diào)試起來費(fèi)勁。我一般會(huì)保留狼群算法作為主框架后面在改進(jìn)環(huán)節(jié)引入粒子群的速度項(xiàng)來加速收斂。3. Matlab代碼實(shí)現(xiàn)從狼群算法到無人機(jī)對(duì)抗推演3.1 代碼文件結(jié)構(gòu)與數(shù)據(jù)流標(biāo)題里的“附matlab代碼.zip”在實(shí)際工程中通常對(duì)應(yīng)三個(gè)文件wpa_base.m存放狼群算法主體函數(shù)uav_conflict_scene.m負(fù)責(zé)初始化戰(zhàn)場環(huán)境、目標(biāo)和無人機(jī)編隊(duì)run_demo.m是入口腳本串起整個(gè)推演流程。下面給出標(biāo)準(zhǔn)的文件劃分方式├── run_demo.m # 入口腳本配置參數(shù)并調(diào)用推演 ├── wpa_base.m # 狼群算法主函數(shù) ├── uav_conflict_scene.m # 對(duì)抗場景初始化與目標(biāo)函數(shù) ├── plot_tracks.m # 軌跡可視化 └── evaluate_metrics.m # 結(jié)算評(píng)估指標(biāo)run_demo.m只做三件事設(shè)置隨機(jī)種子、加載參數(shù)、循環(huán)調(diào)用wpa_base。wpa_base不關(guān)心對(duì)抗規(guī)則只接受目標(biāo)函數(shù)句柄和邊界條件。數(shù)據(jù)流向是run_demo把uav_conflict_scene返回的函數(shù)句柄傳給wpa_basewpa_base在每次迭代里調(diào)用該句柄計(jì)算適應(yīng)度最后把全局最優(yōu)個(gè)體輸出給plot_tracks。% run_demo.m 入口腳本核心邏輯 rng(42); % 固定隨機(jī)種子保證可復(fù)現(xiàn) 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)固定隨機(jī)種子是復(fù)現(xiàn)實(shí)驗(yàn)的基礎(chǔ)很多調(diào)試問題來源于隨機(jī)性不可控跑十次結(jié)果完全不一樣加上這一行后每次運(yùn)行軌跡一致。scene_params用結(jié)構(gòu)體傳參比逐參數(shù)傳更清晰后續(xù)加障礙物、風(fēng)速直接擴(kuò)展字段即可。3.2 核心函數(shù)wpa_base.m 實(shí)現(xiàn)wpa_base是狼群算法的核心需要實(shí)現(xiàn)游獵、召喚、圍攻三個(gè)階段的切換和對(duì)應(yīng)的位置更新。這里給出一個(gè)能在Matlab R2021a 及以上版本直接運(yùn)行的精簡實(shí)現(xiàn)邏輯完整沒有使用工具箱function [best_pos, best_score, history] wpa_base(fitness_func, init_pack, opt) % wpa_base: 狼群算法主函數(shù) % 輸入: % fitness_func - 目標(biāo)函數(shù)句柄輸入Nx2位置矩陣輸出Nx1分?jǐn)?shù) % init_pack - 初始狼群位置pack_size x dim % opt - 參數(shù)結(jié)構(gòu)體包含 pack_size, max_iter, step_max % 輸出: % best_pos - 全局最優(yōu)位置 % best_score - 全局最優(yōu)分?jǐn)?shù) % history - 每代最優(yōu)分?jǐn)?shù)用于收斂曲線 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; % 初始化狼群位置和分?jǐn)?shù) 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 % 階段三: 圍攻 - 向目標(biāo)位置線性收縮 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); % 更新分?jǐn)?shù)與頭狼 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) % 萊維飛行隨機(jī)跳躍防止陷入局部最優(yōu) 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代碼說明游獵階段使用隨機(jī)方向加萊維飛行其中vecnorm(direction, 2, 2)是逐行歸一化確保每個(gè)方向向量模長為 1避免方向向量的長度不一致導(dǎo)致步長失真。召喚階段直接向頭狼位置靠近這里沒有加入噪聲項(xiàng)實(shí)際對(duì)抗場景中如果發(fā)現(xiàn)收斂過快可以在方向后加上小幅隨機(jī)擾動(dòng)。圍攻階段的判定條件是“距離頭狼小于當(dāng)前步長的兩倍”在這個(gè)范圍內(nèi)進(jìn)行減半收縮模擬狼群收緊包圍圈。整個(gè)循環(huán)中的隨機(jī)數(shù)每代都會(huì)重新生成配合外部固定的隨機(jī)種子保證每次運(yùn)行軌跡一致。3.3 參數(shù)初始化表與命令調(diào)用方式狼群算法在無人機(jī)對(duì)抗推演中的參數(shù)需要拆成兩類來看一類是算法參數(shù)控制搜索行為另一類是場景參數(shù)控制對(duì)抗條件。兩者要分開配置不要混在同一個(gè)結(jié)構(gòu)體里。下面的表格整理了常用范圍和典型值參數(shù)含義典型值調(diào)試范圍pack_size狼群規(guī)模3020~50max_iter最大迭代次數(shù)200100~500step_max初始最大步長84~15stale_limit頭狼停滯代數(shù)閾值85~15scout_ratio游獵狼比例0.30.15~0.45reset_ratio重置比例0.30.2~0.4w1追蹤目標(biāo)權(quán)重0.70.5~0.9w2編隊(duì)保持權(quán)重0.30.1~0.5在run_demo.m中調(diào)用wpa_base后還需要把歷史最優(yōu)分?jǐn)?shù)畫出來判斷算法是否收斂。收斂曲線的繪制方法是figure; plot(history, LineWidth, 1.5); xlabel(迭代次數(shù)); ylabel(最優(yōu)目標(biāo)函數(shù)值); title(狼群算法收斂曲線); grid on;這里history是wpa_base返回的每代最優(yōu)分?jǐn)?shù)向量保存它的意義在于定位算法是否在迭代后期還在大幅下降如果曲線在最后幾十代還在明顯下降說明max_iter不夠需要增大迭代次數(shù)。如果曲線前 20 代就已經(jīng)平了說明種群多樣性不足要檢查scout_ratio是否太低或step_max是否太大導(dǎo)致過早收斂。4. 無人機(jī)對(duì)抗仿真場景搭建與參數(shù)調(diào)整4.1 紅藍(lán)對(duì)抗場景初始化狼群算法在無人機(jī)對(duì)抗推演中的典型用法是讓藍(lán)方無人機(jī)集群使用狼群算法追蹤紅方目標(biāo)同時(shí)紅方目標(biāo)帶有簡單的規(guī)避策略。目標(biāo)函數(shù)里的target_pos不是固定值每個(gè)推演步長結(jié)束后紅方會(huì)做一次機(jī)動(dòng)比如改變方向或加速。建立對(duì)抗場景時(shí)需要定義三維數(shù)組第一個(gè)維度是推演回合數(shù)第二個(gè)維度是無人機(jī)架數(shù)第三個(gè)維度是位置分量。初始化腳本如下function [fitness_func, init_pack] uav_conflict_scene(scene_params) % 初始化對(duì)抗場景 width scene_params.width; height scene_params.height; target_pos scene_params.target_pos; % 藍(lán)方無人機(jī)初始位置隨機(jī)分布在左半?yún)^(qū)域 init_pack [rand(30, 1) * width/2, rand(30, 1) * height]; % 紅方目標(biāo)位置固定為場景右上角附近的隨機(jī)偏移 target_state target_pos randn(1, 2) * 5; % 返回目標(biāo)函數(shù)句柄 fitness_func (pos) evaluate_score(pos, target_state); end function score evaluate_score(pos, target_state) % 目標(biāo)函數(shù): 距離懲罰 編隊(duì)代價(jià) 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里對(duì)每一架無人機(jī)分別計(jì)算距離懲罰和編隊(duì)?wèi)土P距離懲罰讓無人機(jī)向目標(biāo)靠近編隊(duì)?wèi)土P讓它們不擠在一起。centroid是當(dāng)前狼群的幾何中心formation_penalty是每架無人機(jī)到中心的距離。這里的target_pos是初始目標(biāo)位置實(shí)際推演中紅方會(huì)移動(dòng)需要在主循環(huán)里動(dòng)態(tài)更新在wpa_base中每次迭代前調(diào)用一次fitness_func時(shí)重新計(jì)算當(dāng)前目標(biāo)狀態(tài)。4.2 執(zhí)行推演與結(jié)果可視化推演主體不是單次調(diào)用wpa_base而是在時(shí)間軸上循環(huán)調(diào)用。每個(gè)推演步長內(nèi)藍(lán)方使用狼群算法優(yōu)化一次位置紅方做一次規(guī)避機(jī)動(dòng)然后進(jìn)入下一個(gè)步長。實(shí)際工程中我一般把推演步長設(shè)置為 0.5 秒對(duì)應(yīng)一個(gè)控制周期算法迭代 30 次作為該步長內(nèi)的尋優(yōu)預(yù)算。主循環(huán)如下% 推演主循環(huán) total_time 10; % 總推演時(shí)長 10 秒 dt 0.5; % 步長 0.5 秒 num_steps total_time / dt; track_blue zeros(num_steps1, 30, 2); % 保存藍(lán)方軌跡 track_red zeros(num_steps1, 1, 2); % 保存紅方軌跡 for t 1:num_steps % 藍(lán)方調(diào)用狼群算法更新位置 opt.max_iter 30; % 步長內(nèi)迭代次數(shù) [blue_pos, ~, ~] wpa_base(fitness_func, blue_pos, opt); % 紅方做簡單規(guī)避: 遠(yuǎn)離藍(lán)方質(zhì)心 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代碼說明紅方的規(guī)避策略是“朝遠(yuǎn)離藍(lán)方質(zhì)心的方向移動(dòng)”這是對(duì)抗仿真里最基礎(chǔ)的規(guī)避模式邏輯是如果紅方保持靜止藍(lán)方最終會(huì)圍捕成功如果紅方朝藍(lán)方集群中心相反方向逃跑藍(lán)方需要不斷調(diào)整搜索方向。evade_dir的計(jì)算用當(dāng)前紅方位置減去藍(lán)方質(zhì)心再歸一化得到方向向量。這個(gè)策略雖然簡單但已經(jīng)足夠讓狼群算法暴露出參數(shù)問題比固定目標(biāo)的靜態(tài)尋優(yōu)更能檢驗(yàn)算法的適應(yīng)性。軌跡可視化的關(guān)鍵是繪制多架無人機(jī)的運(yùn)動(dòng)過程而不是只畫最終位置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(藍(lán)方無人機(jī), 紅方目標(biāo));squeeze的作用是去掉track_blue中空的單例維度把它變成 2D 數(shù)組才能被plot正確解析。從運(yùn)行結(jié)果看狼群算法的游獵階段會(huì)產(chǎn)生大量交叉軌跡這是正?,F(xiàn)象說明多機(jī)在并行搜索不必?fù)?dān)心軌跡交叉在物理上是否沖突因?yàn)楫?dāng)前模型只關(guān)心 2D 位置投影。4.3 4個(gè)關(guān)鍵參數(shù)如何調(diào)優(yōu)調(diào)試?yán)侨核惴〞r(shí)四個(gè)參數(shù)最值得調(diào)整scout_ratio、step_max、stale_limit、w1/w2權(quán)重比。下面說明每個(gè)參數(shù)的具體影響和調(diào)試方法。參數(shù)調(diào)低的影響調(diào)高的影響推薦調(diào)試策略scout_ratio搜索范圍縮小快速向頭狼靠攏搜索更充分但收斂變慢從 0.3 開始每次增減 0.05step_max前期步長短移動(dòng)緩慢前期覆蓋面大但容易跳過最優(yōu)從 8 開始按場景尺寸的 8%~15% 調(diào)整stale_limit頭狼頻繁重置收斂不穩(wěn)定長時(shí)間不重置可能困在局部最優(yōu)5~10 之間試探w1編隊(duì)更整齊但追蹤慢追蹤更快編隊(duì)松散先固定 w10.7觀察是否出現(xiàn)掉隊(duì)在無人機(jī)對(duì)抗場景里w1和w2的權(quán)衡直接對(duì)應(yīng)戰(zhàn)術(shù)選擇w1高時(shí)無人機(jī)會(huì)優(yōu)先追擊目標(biāo)隊(duì)形保持差容易被各個(gè)擊破w2高時(shí)編隊(duì)整齊但圍捕速度慢目標(biāo)容易逃出范圍。實(shí)際調(diào)參時(shí)先固定算法參數(shù)跑一輪畫收斂曲線觀察曲線下降趨勢是否平緩再調(diào)整兩個(gè)權(quán)重。以 30 架無人機(jī)、100m×100m 空域?yàn)槔齭tep_max8合適如果空域擴(kuò)大到 500mstep_max需要同步提升到 20 以上。5. 進(jìn)階技巧收斂性驗(yàn)證與無人機(jī)串級(jí)PID聯(lián)動(dòng)5.1 用箱線圖驗(yàn)證算法穩(wěn)定性單次運(yùn)行的結(jié)果不足以說明狼群算法在對(duì)抗場景中可靠需要多次重復(fù)實(shí)驗(yàn)。常用的做法是固定隨機(jī)種子范圍連續(xù)運(yùn)行 30 次記錄每次推演的目標(biāo)函數(shù)終值用箱線圖輸出分布情況。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(目標(biāo)函數(shù)終值); grid on;箱線圖能直觀看出離群點(diǎn)的數(shù)量和分布如果離群點(diǎn)出現(xiàn)在上邊界外說明有幾次運(yùn)行算法沒有找到有效解需要回頭檢查reset_ratio和stale_limit的配置或者增大max_iter。5.2 向量化加速策略Matlab 里for循環(huán)逐行更新狼群位置的寫法會(huì)明顯拖慢運(yùn)行速度。把位置更新改寫成矩陣運(yùn)算單次迭代的耗時(shí)可以下降到原來的五分之一。核心改進(jìn)思路是先用向量計(jì)算所有狼的方向再統(tǒng)一做歸一化和步長縮放而不是逐只狼調(diào)用目標(biāo)函數(shù)。大規(guī)模場景里快速計(jì)算vecnorm是關(guān)鍵它對(duì)矩陣每一行做二范數(shù)返回的是列向量配合矩陣加減實(shí)現(xiàn)整批狼群的位置刷新。5.3 無人機(jī)串級(jí)PID與狼群算法的聯(lián)動(dòng)狼群算法輸出的是位置控制指令不是飛控層的期望姿態(tài)。工程落地上通常把狼群算法的輸出作為外環(huán)位置控制器的新參考值內(nèi)環(huán)姿態(tài)控制使用傳統(tǒng)的串級(jí) PID 結(jié)構(gòu)由飛控執(zhí)行。位置環(huán)的參考輸入來自wpa_base的best_pos對(duì)應(yīng)無人機(jī)的目標(biāo)航點(diǎn)而后位置環(huán) PID 計(jì)算期望俯仰和滾轉(zhuǎn)角姿態(tài)環(huán) PID 計(jì)算期望油門和舵面量。時(shí)間間隔上外環(huán)位置更新頻率通常設(shè)為 10Hz20Hz內(nèi)環(huán)姿態(tài)頻率 200Hz400Hz兩者的時(shí)間尺度相差一個(gè)數(shù)量級(jí)。仿真過程中如果不加區(qū)分地讓算法輸出直接給電機(jī)飛控會(huì)很不可用這也是對(duì)抗仿真與真實(shí)飛行最大的差別所在。驗(yàn)證聯(lián)動(dòng)效果時(shí)檢查內(nèi)環(huán)指令響應(yīng)是否在 300ms 內(nèi)跟蹤上外環(huán)輸出以及超調(diào)量是否小于 15%這兩項(xiàng)通過調(diào)外環(huán) PID 的 P 和 D 參數(shù)解決。本文還有配套的精品資源點(diǎn)擊獲取