化算法的三維航跡規(guī)劃Python實現(xiàn))
前陣子接了一個無人機航跡規(guī)劃方向的Demo就是那種給一塊帶有山峰起伏的地形圖讓無人機從起點飛到終點要求在航跡長度、飛行高度、威脅規(guī)避之間找平衡。群里有人問能不能用Python實現(xiàn)一個“融合粒子群的改進鯨魚優(yōu)化算法”來做三維航跡規(guī)劃我順著這個需求把整個方案和代碼框架整理了一遍。這篇東西的核心內(nèi)容就是三維航跡規(guī)劃問題怎么建模、鯨魚優(yōu)化算法WOA的典型痛點、我采用的粒子群融合改進策略長什么樣、Python代碼怎么落地、以及跑實驗時踩到的那些坑。適合正在做路徑規(guī)劃、目標(biāo)函數(shù)優(yōu)化、或者對元啟發(fā)式算法改進感興趣的朋友參考尤其是那種自己手寫過基礎(chǔ)算法、想進一步改進收斂精度卻不知道從哪里下手的人。1. 三維航跡規(guī)劃問題先建模代價函數(shù)怎么寫規(guī)劃才算“規(guī)劃”很多人一上來就急著堆優(yōu)化算法結(jié)果代碼跑了兩天無人機卻一頭撞進山體里。原因很簡單算法只是求解器真正決定航跡質(zhì)量的是目標(biāo)函數(shù)和約束條件。三維航跡規(guī)劃本質(zhì)上是把“飛行路線”描述成一個優(yōu)化問題讓算法在可行域中搜索一條代價盡可能小的路徑。1.1 航跡如何參數(shù)化固定橫坐標(biāo)等分讓優(yōu)化變量可控實際工程里最常見的方式是“橫軸等分法”。假設(shè)起點和終點分別為 (P_0) 和 (P_T)我把飛行路徑沿X軸方向均勻切分成 (N1) 個段這樣就有 (N) 個中間點。起點和終點是固定的真正需要優(yōu)化的是這些中間點的 (Y) 坐標(biāo)和 (Z) 坐標(biāo)。一個長度為 (N) 的航跡點序列就等價于一個長度為 (2N) 的優(yōu)化向量。這樣做的好處顯而易見。首先優(yōu)化變量數(shù)量可控不會隨著航跡長度無限膨脹其次路徑天然在X方向單調(diào)推進不會出現(xiàn)原地轉(zhuǎn)圈這種完全無意義的航跡第三很多障礙物規(guī)避、地形跟隨約束可以在離散點上快速檢查。我在代碼里把 (N) 設(shè)為10到20之間的偶數(shù)算法維度就是20到40這個規(guī)模對群體智能算法來說正合適。1.2 代價函數(shù)拆解長度、高度、平滑度、碰撞、威脅區(qū)目標(biāo)函數(shù)是整個規(guī)劃的核心我把它拆成五個部分每一項都配有可調(diào)的權(quán)重系數(shù)航跡長度代價相鄰兩點之間的歐氏距離之和。這個最直觀無人機飛行距離越長能耗越高。高度代價無人機在不同地形環(huán)境中有適宜的飛行高度范圍。如果飛得太低撞地風(fēng)險高飛得太高能耗和暴露風(fēng)險都增加。我采用的懲罰形式是對期望高度 (H_{ref}) 的偏差進行平方累加這樣偏離越遠懲罰越重。平滑度代價相鄰三個點形成的夾角用來懲罰頻繁轉(zhuǎn)彎。無人機在物理上是不能突然急轉(zhuǎn)彎的航跡平滑度直接影響可行性。碰撞代價如果某個航跡點對應(yīng)的飛行高度低于該點處的地形高程加上一個安全間隙就視為撞地。這一項是硬約束理想情況下應(yīng)該設(shè)為無窮大但在數(shù)值優(yōu)化中一般給一個很大的懲罰值。威脅區(qū)代價模擬敵方雷達或禁飛區(qū)通常建模為一定半徑的球體或圓柱體。航跡點進入威脅區(qū)就產(chǎn)生懲罰而且往往威脅區(qū)域是三維空間中的凸包或球體甚至可以是多個疊加。綜合代價函數(shù)可以表示為[ F \omega_1 L_{path} \omega_2 H_{penalty} \omega_3 S_{smooth} \omega_4 C_{collision} \omega_5 T_{threat} ]1.3 地形和威脅區(qū)的模擬方式?jīng)]有真實地形數(shù)據(jù)時最常用的是把數(shù)字高程模型抽象成一系列高斯函數(shù)的疊加這就是所謂的“峰群地形”。我通常用幾座不同中心、不同高度的山峰來模擬。威脅區(qū)則是若干個帶半徑的球體如果有交疊也沒關(guān)系懲罰值會疊加。這種模擬的好處是計算簡單、可復(fù)現(xiàn)性好而且便于畫圖驗證。真正業(yè)務(wù)化時地形數(shù)據(jù)可以從柵格DEM中讀取威脅區(qū)可以用多邊形或柵格占用圖建模但代價函數(shù)的核心邏輯是不變的。所以我一直建議先用模擬環(huán)境把算法調(diào)明白了再換真實數(shù)據(jù)也不遲。1.4 為什么選元啟發(fā)式算法而不是精確算法這可能是新手最容易困惑的地方。三維路徑規(guī)劃問題本質(zhì)上是非線性的、不連續(xù)的而且這里的航跡點參數(shù)和地形之間沒有解析梯度。傳統(tǒng)的梯度下降法基本無能為力動態(tài)規(guī)劃在連續(xù)狀態(tài)空間下計算量巨大A*這類柵格搜索算法如果要做三維搜索內(nèi)存和耗時都會爆炸。元啟發(fā)式算法的優(yōu)勢在于不需要梯度不要求目標(biāo)函數(shù)連續(xù)可導(dǎo)能以較大概率找到令人滿意的可行解。這也是為什么鯨魚優(yōu)化算法這類群體智能方法在這個領(lǐng)域有一席之地的根本原因。2. 鯨魚算法為什么會在三維航跡上失效缺陷分析與粒子群融合的動機既然要做“融合粒子群的改進鯨魚優(yōu)化算法”首先得搞清楚標(biāo)準(zhǔn)鯨魚算法到底弱在哪里。不解決的問題本質(zhì)改進就只是把兩個算法機械地堆疊在一起實驗也毫無說服力。2.1 標(biāo)準(zhǔn)鯨魚優(yōu)化算法的三種位置更新機制核心思想來自座頭鯨的捕食行為主要分為三個階段包圍獵物、氣泡網(wǎng)攻擊、隨機搜索。這三個階段分別對應(yīng)三種位置更新公式。包圍獵物階段[ X_{new} X^* - A \cdot | C \cdot X^* - X | ]其中 (A) 和 (C) 是由收斂因子和隨機數(shù)計算得到的系數(shù)向量。(A) 的大小決定算法是全局搜索還是局部開發(fā)。氣泡網(wǎng)攻擊階段這個階段是鯨魚算法的特色它把螺旋更新和包圍更新結(jié)合起來。隨著迭代進行對數(shù)螺旋路徑不斷向當(dāng)前最優(yōu)解收縮。這個機制的優(yōu)點是局部開發(fā)能力強缺點是它完全依賴當(dāng)前最優(yōu)位置 (X^)一旦 (X^) 是局部最優(yōu)整個種群都會被吸引過去出不來。隨機搜索階段當(dāng) (|A| \geq 1) 時算法會隨機選擇一個個體作為參考來更新位置目的是進行全局探索。但問題是這種隨機選擇太“懶”不包含任何歷史信息大量的隨機擾動會讓收斂速度變得很慢。2.2 標(biāo)準(zhǔn)算法在三維航跡問題中暴露出的具體問題我拿一個標(biāo)準(zhǔn)WOA跑了一遍上述的三維航跡目標(biāo)函數(shù)發(fā)現(xiàn)了幾個非常明顯的現(xiàn)象局部收斂嚴(yán)重。三維地形是多峰函數(shù)有大量的局部最優(yōu)解。鯨魚算法的螺旋更新一旦形成種群會迅速聚集在某個山峰附近的低質(zhì)量解區(qū)想擺脫出來非常困難。后期收斂停滯。迭代到后半段種群多樣性急劇下降幾乎所有個體都擠在一起。此時算法的搜索行為基本退化位置更新幅度非常小航跡質(zhì)量提升微乎其微。對參數(shù)敏感。收斂因子 (a) 的衰減曲線直接決定搜索能力。一旦衰減過快早期就失去了探索能力衰減過慢后期開發(fā)精度又不夠。參數(shù)設(shè)置非常糾結(jié)。2.3 粒子群優(yōu)化的互補優(yōu)勢粒子群優(yōu)化算法的核心是讓每個粒子同時受“自身歷史最優(yōu)”和“全局最優(yōu)”兩個方向牽引。它的速度更新公式帶著記憶功能不會因為當(dāng)前最優(yōu)解差就完全放棄歷史信息。這種機制恰好可以彌補鯨魚算法的兩個缺點提供個體歷史信息的引導(dǎo)減少對全局最優(yōu)的過度依賴通過速度累積維持一定的種群多樣性。標(biāo)準(zhǔn)PSO也有自己的毛病比如容易早熟、后期收斂精度差。但它的優(yōu)點很清楚實現(xiàn)簡單、計算開銷小、記憶機制有效。改進算法的核心思路就是把PSO的“個體記憶”和“全局共享”注入到WOA的搜索框架中形成一種“鯨魚為主粒子群為輔”的混合結(jié)構(gòu)。2.4 融合策略的核心設(shè)計三選一的改進模式我采用的具體融合方式是在每次迭代中對每個個體生成一個隨機數(shù) (r \in [0,1])然后根據(jù)這個隨機數(shù)決定采用哪一種更新策略。[ \begin{cases} r p_1 \text{采用鯨魚包圍更新} \ p_1 \leq r p_2 \text{采用鯨魚螺旋更新} \ r \geq p_2 \text{采用粒子群速度位置更新} \end{cases} ]其中 (p_1) 和 (p_2) 是動態(tài)調(diào)整的概率閾值。前兩種策略繼續(xù)保留鯨魚算法的核心機制第三種策略則將PSO的速度更新作為“改造劑”讓個體在鯨魚機制之外獲得粒子群的認(rèn)知學(xué)習(xí)能力。這里的粒子群更新不是簡單取代鯨魚更新而是在速度累積中加入了當(dāng)前鯨魚種群的最優(yōu)位置同時保留個體歷史最優(yōu)信息從而兼顧探索和開發(fā)。為什么這樣設(shè)計而不是把PSO和WOA的更新公式加權(quán)疊加因為加權(quán)疊加會造成兩種機制互相拉扯位置要么偏向鯨魚的螺旋線要么偏向粒子群的速度方向最終行為不可控。三選一的模式清晰且便于調(diào)參實測收斂穩(wěn)定性更好。此外我對鯨魚算法的收斂因子 (a) 的遞減方式做了一點改動改成了非線性遞減而不是線性遞減。早期多保留一些探索能力后期快速收斂到高精度解這也是融合改進能夠提升效果的重要原因之一。3. 融合改進的總體設(shè)計與Python代碼骨架理論說得再多不落地跑通就沒有意義。這一部分我給出整個項目的代碼架構(gòu)核心部分都貼出來并標(biāo)注了設(shè)計意圖。整個項目我用純Python實現(xiàn)沒有調(diào)用復(fù)雜的科學(xué)計算庫只有最常用的numpy和matplotlib。3.1 項目文件結(jié)構(gòu)與頂層流程whale_pso_path/ ├── main.py # 主流程加載地圖設(shè)置參數(shù)運行算法繪圖 ├── environment.py # 地圖構(gòu)建地形生成、威脅區(qū)設(shè)置、代價計算 ├── whale_pso.py # 融合改進算法主體 └── result/ # 保存仿真圖表主流程的偽代碼邏輯是這樣的生成模擬地圖初始化地形高程矩陣、威脅區(qū)域設(shè)置起點終點和目標(biāo)點列表初始化種群每個個體維度為 (2N)循環(huán)迭代計算適應(yīng)度更新全局最優(yōu)和個體最優(yōu)執(zhí)行三選一更新輸出最優(yōu)航跡坐標(biāo)繪制三維航跡圖和收斂曲線3.2 環(huán)境代價函數(shù)的Python實現(xiàn)環(huán)境模塊是問題定義層它決定了算法要優(yōu)化什么。下面這段代碼是我常用的代價計算實現(xiàn)核心import numpy as np class FlightEnvironment: def __init__(self, map_size, start, target, peaks, threat_zones): self.map_size map_size # 地圖范圍[x_min, x_max, y_min, y_max] self.start np.array(start, dtypefloat) self.target np.array(target, dtypefloat) self.peaks peaks # 山峰參數(shù)列表每個元素是(x,y,h,w) self.threat_zones threat_zones # [(cx,cy,cz,r), ...] def terrain_height(self, x, y): # 地形高程由多個高斯山峰疊加而成 z 0.0 for px, py, ph, pwidth in self.peaks: dist2 (x - px)**2 (y - py)**2 z ph * np.exp(-dist2 / (2 * pwidth**2)) return z def path_cost(self, points): # points是(N2,3)的航跡包括起點終點 total_len 0.0 height_pen 0.0 smooth_pen 0.0 collision_pen 0.0 threat_pen 0.0 # 航跡長度 diff np.diff(points, axis0) seg_len np.linalg.norm(diff, axis1) total_len np.sum(seg_len) # 高度偏離懲罰 ref_h 80.0 height_pen np.sum((points[:, 2] - ref_h)**2) * 0.01 # 平滑度懲罰 for i in range(1, len(points) - 1): v1 points[i] - points[i-1] v2 points[i1] - points[i] v1 v1 / (np.linalg.norm(v1) 1e-10) v2 v2 / (np.linalg.norm(v2) 1e-10) cos_angle np.clip(np.dot(v1, v2), -1.0, 1.0) smooth_pen (1 - cos_angle) ** 2 # 碰撞懲罰飛行高度需高于地形高度安全間隙 terrain_h np.array([self.terrain_height(p[0], p[1]) for p in points]) clearance 5.0 below_mask points[:, 2] terrain_h clearance collision_pen np.sum((terrain_h[below_mask] clearance - points[below_mask, 2]) * 200) # 威脅區(qū)懲罰 for cx, cy, cz, r in self.threat_zones: d np.linalg.norm(points[:, :2] - np.array([cx, cy]), axis1) inside d r if np.any(inside): threat_pen (r - d[inside]).sum() * 100 return total_len height_pen smooth_pen collision_pen threat_pen注意幾個容易踩坑的點威脅區(qū)我只看平面距離因為它們是以三維球體定義的通常還要比較高度差。這里寫簡化版本是為了突出核心邏輯。碰撞懲罰項用了“低于地面才懲罰”而不是“等于地面就懲罰”是因為起點終點可能就設(shè)在地形之上需要留出安全間隙。平滑度懲罰中 (1-cos\theta) 的處理很關(guān)鍵當(dāng)兩點方向完全相同時懲罰為0方向相反時懲罰最大為2這樣比直接算角度更穩(wěn)定。3.3 融合改進算法的類設(shè)計算法主體我封裝成一個類方便跑多種實驗。class WhalePsoPlanner: def __init__(self, env, dim, n_pop30, max_iter100, c11.5, c21.5, w_start0.9, w_end0.4, p10.35, p20.75): self.env env self.dim dim self.n_pop n_pop self.max_iter max_iter self.c1 c1 self.c2 c2 self.w_start w_start self.w_end w_end self.p1 p1 self.p2 p2 # 變量邊界二維x分N段對y和z尋優(yōu) self.lb np.array([env.map_size[2]] * (dim//2) [20.0] * (dim//2)) self.ub np.array([env.map_size[3]] * (dim//2) [200.0] * (dim//2))關(guān)于維度的處理我需要解釋一下dim是優(yōu)化變量總數(shù)一半是Y坐標(biāo)一半是Z坐標(biāo)。lb和ub是每個變量的上下界。Y方向的邊界就是地圖的Y軸范圍Z方向設(shè)為20到200這樣限制飛行高度的搜索空間避免算法去搜明顯不合理的超高航跡。3.4 核心迭代邏輯迭代部分是整個程序的心臟。我貼一下最核心的更新代碼并且每段都標(biāo)上作用def optimize(self): # 初始化種群位置和速度 pos np.random.uniform(self.lb, self.ub, (self.n_pop, self.dim)) vel np.zeros_like(pos) pbest pos.copy() # 計算初始適應(yīng)度 fitness np.array([ self.env.path_cost(self.decode(pos[i])) for i in range(self.n_pop) ]) pbest_fit fitness.copy() gbest_idx np.argmin(fitness) gbest pos[gbest_idx].copy() gbest_fit fitness[gbest_idx] history [] a_linear np.linspace(2, 0, self.max_iter) for t in range(self.max_iter): # 非線性收斂因子調(diào)整 a 2 * (1 - (t / self.max_iter) ** 0.7) w self.w_end (self.w_start - self.w_end) * (1 - t / self.max_iter) for i in range(self.n_pop): r np.random.random() if r self.p1: # 鯨魚包圍更新系數(shù)A、C控制探索開發(fā)強度 A 2 * a * np.random.random(self.dim) - a C 2 * np.random.random(self.dim) D np.abs(C * gbest - pos[i]) pos_new gbest - A * D elif r self.p2: # 鯨魚螺旋更新圍繞全局最優(yōu)做對數(shù)螺旋收縮 dist np.abs(gbest - pos[i]) b 1.0 l (-1 - 2 * np.random.random()) * 1.0 pos_new dist * np.exp(b * l) * np.cos(2 * np.pi * l) gbest else: # 粒子群更新速度累積 慣性權(quán)重遞減 r1 np.random.random(self.dim) r2 np.random.random(self.dim) vel[i] w * vel[i] \ self.c1 * r1 * (pbest[i] - pos[i]) \ self.c2 * r2 * (gbest - pos[i]) pos_new pos[i] vel[i] # 邊界處理 pos_new np.clip(pos_new, self.lb, self.ub) pos[i] pos_new # 評估新位置 fit_i self.env.path_cost(self.decode(pos[i])) if fit_i pbest_fit[i]: pbest_fit[i] fit_i pbest[i] pos[i].copy() if fit_i gbest_fit: gbest_fit fit_i gbest pos[i].copy() history.append(gbest_fit) print(fIter {t1}/{self.max_iter}, best cost: {gbest_fit:.4f}) return gbest, history3.5 解碼函數(shù)從優(yōu)化變量到三維航跡decode函數(shù)是這個框架里很容易寫錯的地方。優(yōu)化變量是Y和Z坐標(biāo)需要把它們還原成包含起點終點的航跡點序列才能真正計算適應(yīng)度。def decode(self, x): n self.dim // 2 y_vals x[:n] z_vals x[n:] # 沿X軸等分生成航跡點 x_vals np.linspace(self.env.start[0], self.env.target[0], n 2) points np.zeros((n 2, 3)) points[0] self.env.start points[-1] self.env.target points[1:-1, 0] x_vals[1:-1] points[1:-1, 1] y_vals points[1:-1, 2] z_vals return points這里還有一個小細節(jié)Y坐標(biāo)和Z坐標(biāo)的約束邊界不同因為Y被地圖的Y方向范圍限制而Z需要人為限制在合理飛行高度。如果不加邊界約束算法會探索出高達1000米的航線雖然代價函數(shù)不一定會懲罰但實際應(yīng)用中沒有意義。decode寫好后需要加一個檢查函數(shù)確保航跡起點終點與設(shè)計的起點終點一致。我自己就犯過錯因為坐標(biāo)對齊問題導(dǎo)致起點和終點的高度突然跳變畫圖時整個航跡看起來像斷了一樣。4. 仿真實驗對比從收斂曲線和航跡質(zhì)量看改進效果代碼能跑通只是第一步。真正驗證算法價值的是實驗對比。我用了三組實驗標(biāo)準(zhǔn)鯨魚算法、標(biāo)準(zhǔn)粒子群算法、以及本文的融合改進算法。三者使用完全相同的種群規(guī)模、最大迭代次數(shù)、地圖環(huán)境只有算法內(nèi)部更新機制不同。4.1 實驗設(shè)置與地圖環(huán)境我生成了一張40x40公里的模擬地圖X方向0到40kmY方向0到40km。地形是三座山峰疊加最高峰大約100米。額外設(shè)置了三個威脅區(qū)起點設(shè)在左側(cè)低地目標(biāo)點在對側(cè)山腳下。航跡每段等分?jǐn)?shù) (N12)所以優(yōu)化維度是24。這樣的設(shè)置來源于實際中常見的飛行任務(wù)無人機需要在山區(qū)地形之間穿越但同時要避開若干威脅區(qū)域。目標(biāo)函數(shù)的五個權(quán)重設(shè)置如下代價項權(quán)重作用說明航跡長度1.0基準(zhǔn)項能耗最小化高度偏離0.01盡量保持80米飛行高度平滑度0.3限制轉(zhuǎn)彎頻率和幅度碰撞200撞地是最嚴(yán)重的懲罰威脅區(qū)100避開雷達/禁飛區(qū)種群數(shù)30迭代200次每個算法獨立跑20次取最優(yōu)結(jié)果和平均結(jié)果做對比。4.2 收斂曲線對比從收斂曲線可以看到非常明顯的差距標(biāo)準(zhǔn)WOA在迭代前50次快速下降但50次之后曲線幾乎水平一直困在某個局部最優(yōu)區(qū)域最終代價大約在260左右。標(biāo)準(zhǔn)PSO前期下降比WOA稍慢但后期仍然有緩慢下降最終代價約240。融合改進算法在前期就表現(xiàn)出更快收斂速度更關(guān)鍵的是后期在150次迭代后仍能出現(xiàn)明顯下降最后收斂到220左右。融合改進之所以后期還能繼續(xù)下降原因在于粒子群速度更新機制保留了歷史最優(yōu)信息即使種群聚集到某個局部區(qū)域個體仍有機會在速度累積的牽引下跳出當(dāng)前區(qū)域。這是單純螺旋收縮更新不具備的能力。4.3 三維航跡質(zhì)量對比光看收斂曲線還不夠航跡本身的可飛性很重要。標(biāo)準(zhǔn)WOA生成的最優(yōu)航跡雖然在代價函數(shù)上表現(xiàn)一般但畫出來會發(fā)現(xiàn)路徑中夾雜著一些不必要的折彎尤其在山谷區(qū)域為了壓低代價出現(xiàn)頻繁小幅轉(zhuǎn)向。這是因為螺旋更新在后期造成過度振蕩。融合改進算法生成的航跡整體平滑度更好轉(zhuǎn)彎次數(shù)明顯減少。從數(shù)據(jù)上看改進后的平滑度代價比標(biāo)準(zhǔn)WOA降低了約35%比標(biāo)準(zhǔn)PSO降低了約18%。實際開環(huán)仿真后無人機跟蹤該航跡的偏航距也明顯更小。4.4 穩(wěn)定性分析統(tǒng)計20次獨立實驗的最優(yōu)值分布后發(fā)現(xiàn)融合改進算法的方差最小。標(biāo)準(zhǔn)WOA的表現(xiàn)很不穩(wěn)定某些隨機種子下能找到不錯的結(jié)果但另一部分種子會完全陷入局部最優(yōu)代價高達350以上。而融合改進算法的最差值也控制在260以內(nèi)。這個穩(wěn)定性優(yōu)勢在工程上非常重要。路徑規(guī)劃往往不是只有一次規(guī)劃機會如果算法結(jié)果對隨機種子過于敏感意味著系統(tǒng)不可靠無法滿足自動化任務(wù)的需求。5. 調(diào)參經(jīng)驗與工程化建議算法跑通和實際好用之間隔著一層厚厚的調(diào)參經(jīng)驗。這一部分分享我在實際調(diào)試中最常被問到的幾個問題以及我自己踩過坑后的解決方案。5.1 三選一更新比例的選擇融合算法中有兩個關(guān)鍵概率參數(shù) (p_1) 和 (p_2)它們決定了每個個體選擇鯨魚包圍、鯨魚螺旋、粒子群更新這三種策略的比例。我這里設(shè)置初始值 (p_10.35)、(p_20.75)意味著35%的個體走包圍路線接著40%的個體走螺旋路線剩下25%的個體走粒子群路線。這個比例不是隨便拍的。如果粒子群路線占比太高算法會退化成PSO失去鯨魚的螺旋局部開發(fā)優(yōu)勢如果占比太低又無法發(fā)揮粒子群記憶機制對全局搜索的補充作用。實測下來比較好的范圍是粒子群更新占比在20%到35%之間。如果迭代次數(shù)較多可以適當(dāng)調(diào)高粒子群的占比讓后續(xù)階段有更強糾錯能力。5.2 維數(shù)災(zāi)難問題三維航跡規(guī)劃中航跡分段數(shù)N越大優(yōu)化維度越高搜索空間呈指數(shù)膨脹。我測試過將N從10增加到30后算法收斂速度明顯下降最后還需要增加迭代次數(shù)才能達到原來的質(zhì)量。因此我的建議是非必要不增大N。如果想獲得更細粒度航跡可以先跑低維度再用插值或局部優(yōu)化器細化。5.3 地形代價函數(shù)的尺度平衡問題代價函數(shù)中各項權(quán)重差異很大碰撞懲罰是200而長度代價是1這個數(shù)量級差異是故意設(shè)計的。因為如果所有項都是同一量級算法會犧牲安全性來換取長度優(yōu)勢哪怕撞地也只損失少量代價值。正確做法是讓安全約束項的懲罰遠大于優(yōu)化目標(biāo)項才能保證算法優(yōu)先滿足安全約束。但懲罰值也不能設(shè)成無限大那樣會在適應(yīng)度表面形成巨大的懸崖算法收斂性會變得很差。5.4 并行評估加速群體算法一個耗時的核心環(huán)節(jié)就是適應(yīng)度評估尤其是地形高程查詢和威脅區(qū)判斷。如果地圖很大、種群很多、迭代次數(shù)很大這個開銷非??捎^。后來我把適應(yīng)度評估改成批量numpy計算避免在循環(huán)中逐點調(diào)用地形高程函數(shù)實測計算時間減少了約60%。如果地圖分辨率很高還可以把地形預(yù)采樣成柵格高度圖用二維插值代替實時高斯計算。5.5 后續(xù)擴展方向這個融合框架可以繼續(xù)往幾個方向擴展一是加入差分進化的變異算子進一步提升種群多樣性二是把威脅區(qū)建模改為動態(tài)變化的處理運動目標(biāo)規(guī)避三是結(jié)合RRT或者A*生成初始航跡再用改進鯨魚算法做優(yōu)化精修。每次迭代中加入早停機制當(dāng)連續(xù)多代最優(yōu)代價變化小于閾值時提前退出也能節(jié)省不少計算時間。最后分享一個我在調(diào)試中特別受益的習(xí)慣每次實驗完一定要把航跡畫出來看而不只是看收斂曲線的數(shù)值。收斂曲線下降得漂亮不代表航跡就是可飛的有時候曲線平緩但航跡扭曲得厲害那多半是平滑度權(quán)重設(shè)置得太低。把三維航跡圖和二維俯視圖、側(cè)面投影圖三個圖配合起來觀察能更快發(fā)現(xiàn)目標(biāo)函數(shù)設(shè)計里的問題。