原理詳解與Matlab實(shí)戰(zhàn):從鳥群覓食到參數(shù)優(yōu)化)
1. 從“鳥群覓食”到“參數(shù)尋優(yōu)”粒子群算法的直觀理解如果你正在為一個(gè)復(fù)雜的工程優(yōu)化問題尋找最佳參數(shù)組合比如想讓無人機(jī)的飛行路徑最短、想讓工廠的生產(chǎn)成本最低或者想讓一個(gè)神經(jīng)網(wǎng)絡(luò)模型的預(yù)測精度最高你可能會發(fā)現(xiàn)傳統(tǒng)的數(shù)學(xué)方法比如求導(dǎo)在這些“黑盒”問題面前常常束手無策。這時(shí)候一群“鳥”或許能幫上忙。我說的不是真的鳥而是一種靈感源于鳥群、魚群等自然界群體行為的智能優(yōu)化算法——粒子群算法。粒子群算法英文全稱Particle Swarm Optimization簡稱PSO。我第一次接觸它是在為一個(gè)通信基站做天線陣列的波束賦形優(yōu)化時(shí)。當(dāng)時(shí)需要調(diào)整幾十個(gè)天線的相位和幅度參數(shù)目標(biāo)是在特定方向形成最強(qiáng)的信號增益同時(shí)抑制其他方向的干擾。參數(shù)空間維度高、目標(biāo)函數(shù)復(fù)雜且非線性用常規(guī)的遍歷搜索或者梯度下降計(jì)算量巨大且容易陷入局部最優(yōu)。導(dǎo)師當(dāng)時(shí)就建議“試試PSO吧它不依賴梯度全局搜索能力強(qiáng)代碼實(shí)現(xiàn)也簡單。” 結(jié)果用Matlab寫了幾十行代碼跑了幾百次迭代就找到了一個(gè)相當(dāng)不錯(cuò)的解效果遠(yuǎn)超預(yù)期。從那以后PSO就成了我解決多參數(shù)、非線性、非凸優(yōu)化問題的“工具箱”常客。那么PSO到底是怎么工作的我們可以把它想象成在一片廣袤的森林里有一群鳥粒子在尋找食物最多的地方最優(yōu)解。每只鳥都不知道食物具體在哪但它們有兩個(gè)信息來源一是自己飛過的地方哪里食物比較多個(gè)體歷史最佳位置二是聽同伴們?nèi)氯抡f在哪個(gè)方向發(fā)現(xiàn)過很多食物群體歷史最佳位置。每只鳥決定下一步往哪飛就是綜合了“自己的經(jīng)驗(yàn)”和“群體的智慧”同時(shí)保留一點(diǎn)隨機(jī)探索的慣性。通過這種簡單的信息共享和迭代更新整個(gè)鳥群會逐漸向食物最豐盛的區(qū)域聚集。在數(shù)學(xué)上每只“鳥”就是一個(gè)候選解一組參數(shù)它的“位置”代表了這組參數(shù)的值它的“飛行速度”決定了參數(shù)更新的方向和步長。“食物多少”則由一個(gè)我們預(yù)先定義好的“適應(yīng)度函數(shù)”來評價(jià)函數(shù)值越好代表這個(gè)解越優(yōu)。PSO的魅力在于其概念清晰、參數(shù)少、易于實(shí)現(xiàn)并且不需要目標(biāo)函數(shù)可導(dǎo)特別適合處理那些數(shù)學(xué)模型復(fù)雜、甚至沒有明確數(shù)學(xué)表達(dá)式的工程優(yōu)化問題。接下來我們就從一個(gè)具體的案例出發(fā)手把手帶你用Matlab實(shí)現(xiàn)PSO并深入探討其每一個(gè)核心環(huán)節(jié)與調(diào)參技巧。2. 案例實(shí)戰(zhàn)用PSO求解經(jīng)典函數(shù)極值問題為了讓大家快速上手并理解PSO的全過程我們選擇一個(gè)有明確圖形和理論最優(yōu)解的經(jīng)典測試函數(shù)作為我們的“狩獵場”Rastrigin函數(shù)。這個(gè)函數(shù)在優(yōu)化領(lǐng)域非常有名因?yàn)樗写罅康木植繕O小值點(diǎn)就像一個(gè)布滿坑洼的山地非常適合檢驗(yàn)算法的全局搜索能力和避免陷入局部最優(yōu)的能力。二維Rastrigin函數(shù)的數(shù)學(xué)表達(dá)式如下f(x, y) 20 x2 - 10*cos(2πx) y2 - 10*cos(2πy)其中x和y通常定義在區(qū)間[-5.12, 5.12]上。這個(gè)函數(shù)的全局最小值點(diǎn)為(0, 0)最小值為0。它的圖像在最小值點(diǎn)周圍有無數(shù)個(gè)“波紋狀”的局部極小點(diǎn)算法很容易被這些“陷阱”吸引而停滯不前。我們的任務(wù)就是編寫一個(gè)PSO程序在x和y的定義域內(nèi)尋找使f(x, y)最小的(x, y)組合。我們將這個(gè)任務(wù)分解為以下幾個(gè)核心步驟并逐一用Matlab代碼實(shí)現(xiàn)。2.1 算法初始化生成第一代“鳥群”任何優(yōu)化算法的第一步都是初始化。對于PSO我們需要初始化兩樣?xùn)|西所有粒子的位置和速度。位置初始化在[-5.12, 5.12]的區(qū)間內(nèi)為每個(gè)粒子隨機(jī)生成一個(gè)(x, y)坐標(biāo)。這相當(dāng)于把鳥群隨機(jī)撒在整個(gè)森林里。速度初始化同樣為每個(gè)粒子隨機(jī)初始化一個(gè)速度向量(vx, vy)。初始速度一般也在一個(gè)較小的范圍內(nèi)隨機(jī)生成比如[-1, 1]。此外我們還需要設(shè)置算法的一些超參數(shù)粒子數(shù)量鳥群有多大粒子數(shù)越多搜索能力越強(qiáng)但每次迭代的計(jì)算量也越大。對于這個(gè)二維問題我們設(shè)置N 30個(gè)粒子。最大迭代次數(shù)鳥群要搜索多久我們設(shè)置max_iter 100。學(xué)習(xí)因子c1和c2。c1是“個(gè)體認(rèn)知”權(quán)重代表粒子對自己經(jīng)驗(yàn)的重視程度c2是“社會認(rèn)知”權(quán)重代表粒子對群體經(jīng)驗(yàn)的重視程度。通常都設(shè)為2左右。慣性權(quán)重w。這個(gè)參數(shù)控制著粒子保留上一代速度的程度。w較大時(shí)全局探索能力強(qiáng)w較小時(shí)局部開發(fā)能力強(qiáng)。我們采用線性遞減策略從0.9逐漸降到0.4這樣前期側(cè)重探索后期側(cè)重收斂。在初始化時(shí)每個(gè)粒子的“個(gè)體歷史最佳位置”就是它自己的初始位置對應(yīng)的“個(gè)體歷史最佳適應(yīng)度”就是該位置的目標(biāo)函數(shù)值。然后我們從所有粒子中找出適應(yīng)度最好的那個(gè)作為整個(gè)群體的“全局歷史最佳位置”。%% 1. 問題定義與參數(shù)設(shè)置 CostFunction (x) rastrigin(x); % 目標(biāo)函數(shù)句柄 nVar 2; % 決策變量個(gè)數(shù) (x和y) VarSize [1 nVar]; % 決策變量矩陣大小 VarMin -5.12; % 變量下界 VarMax 5.12; % 變量上界 %% 2. PSO參數(shù)設(shè)置 MaxIt 100; % 最大迭代次數(shù) nPop 30; % 粒子數(shù)量 w 0.9; % 初始慣性權(quán)重 wdamp 0.99; % 迭代慣性權(quán)重衰減系數(shù) c1 2; % 個(gè)體學(xué)習(xí)因子 c2 2; % 群體學(xué)習(xí)因子 %% 3. 初始化粒子 empty_particle.Position []; empty_particle.Velocity []; empty_particle.Cost []; empty_particle.Best.Position []; empty_particle.Best.Cost []; particle repmat(empty_particle, nPop, 1); % 創(chuàng)建粒子結(jié)構(gòu)體數(shù)組 GlobalBest.Cost inf; % 初始化全局最優(yōu)解為無窮大 for i 1:nPop % 隨機(jī)初始化粒子位置 particle(i).Position unifrnd(VarMin, VarMax, VarSize); % 隨機(jī)初始化粒子速度 particle(i).Velocity zeros(VarSize); % 計(jì)算當(dāng)前粒子的適應(yīng)度值 particle(i).Cost CostFunction(particle(i).Position); % 初始化個(gè)體歷史最佳 particle(i).Best.Position particle(i).Position; particle(i).Best.Cost particle(i).Cost; % 更新全局歷史最佳 if particle(i).Best.Cost GlobalBest.Cost GlobalBest particle(i).Best; end end BestCosts zeros(MaxIt, 1); % 記錄每次迭代的最優(yōu)值用于繪圖2.2 核心迭代粒子的速度與位置更新這是PSO算法的“發(fā)動機(jī)”部分。在每一次迭代中我們都要根據(jù)公式更新每個(gè)粒子的速度和位置。標(biāo)準(zhǔn)的速度更新公式如下v_new w * v_old c1 * r1 * (pBest - x_old) c2 * r2 * (gBest - x_old)其中v_new,v_old新/舊速度。x_old粒子當(dāng)前位置。pBest該粒子自身的個(gè)體歷史最佳位置。gBest整個(gè)群體的全局歷史最佳位置。r1,r2[0, 1]區(qū)間內(nèi)的隨機(jī)數(shù)增加搜索的隨機(jī)性。這個(gè)公式直觀地體現(xiàn)了我們之前說的“綜合經(jīng)驗(yàn)”w * v_old是慣性部分讓粒子保持原來的運(yùn)動趨勢c1 * r1 * (pBest - x_old)是個(gè)體認(rèn)知部分驅(qū)使粒子飛向自己曾找到的最好位置c2 * r2 * (gBest - x_old)是社會認(rèn)知部分驅(qū)使粒子飛向群體找到的最好位置。更新速度后再更新位置x_new x_old v_new。注意更新后必須檢查粒子的新位置是否超出了我們設(shè)定的搜索邊界[VarMin, VarMax]。如果超出常見的處理方法是將其拉回邊界x_new max(min(x_new, VarMax), VarMin)并將對應(yīng)方向的速度置零或反向防止粒子“飛離”搜索空間。每次更新完位置計(jì)算新位置的適應(yīng)度并更新該粒子的個(gè)體歷史最佳以及整個(gè)群體的全局歷史最佳。%% 4. PSO主循環(huán) for it 1:MaxIt for i 1:nPop % 更新速度 particle(i).Velocity w * particle(i).Velocity ... c1 * rand(VarSize) .* (particle(i).Best.Position - particle(i).Position) ... c2 * rand(VarSize) .* (GlobalBest.Position - particle(i).Position); % 應(yīng)用速度限制可選防止速度爆炸 % 這里我們采用更常用的位置邊界處理 % 更新位置 particle(i).Position particle(i).Position particle(i).Velocity; % 應(yīng)用位置邊界限制 particle(i).Position max(particle(i).Position, VarMin); particle(i).Position min(particle(i).Position, VarMax); % 計(jì)算新位置的適應(yīng)度 particle(i).Cost CostFunction(particle(i).Position); % 更新個(gè)體歷史最佳 if particle(i).Cost particle(i).Best.Cost particle(i).Best.Position particle(i).Position; particle(i).Best.Cost particle(i).Cost; % 更新全局歷史最佳 if particle(i).Best.Cost GlobalBest.Cost GlobalBest particle(i).Best; end end end % 記錄當(dāng)前迭代的全局最優(yōu)值 BestCosts(it) GlobalBest.Cost; % 動態(tài)顯示迭代信息每10次迭代顯示一次 if mod(it, 10) 0 disp([Iteration num2str(it) : Best Cost num2str(BestCosts(it))]); disp([Best Position: x num2str(GlobalBest.Position(1)) , y num2str(GlobalBest.Position(2))]); end % 更新慣性權(quán)重線性遞減 w w * wdamp; end2.3 結(jié)果可視化與收斂性分析代碼跑完后我們得到了兩個(gè)最重要的輸出GlobalBest.Position找到的最優(yōu)點(diǎn)和GlobalBest.Cost對應(yīng)的最優(yōu)值。為了直觀地評估PSO的性能我們通常做兩個(gè)圖收斂曲線圖繪制每次迭代的全局最優(yōu)適應(yīng)度值BestCosts的變化曲線。一個(gè)好的優(yōu)化算法其收斂曲線應(yīng)該隨著迭代次數(shù)的增加而穩(wěn)步下降并最終趨于平穩(wěn)。如果曲線劇烈震蕩或很早就停止下降說明參數(shù)可能設(shè)置不當(dāng)。粒子運(yùn)動軌跡圖可選適用于二維問題在一張等高線圖上畫出Rastrigin函數(shù)的形狀并動態(tài)或靜態(tài)地展示粒子群在整個(gè)迭代過程中位置的演變。這能非常生動地展示粒子如何從隨機(jī)散布逐漸聚集到全局最優(yōu)點(diǎn)附近。%% 5. 結(jié)果展示 figure; plot(BestCosts, LineWidth, 2); xlabel(迭代次數(shù)); ylabel(最優(yōu)適應(yīng)度值); title(PSO收斂曲線); grid on; disp( ); disp([ 優(yōu)化結(jié)果 ]); disp([找到的最優(yōu)解: x num2str(GlobalBest.Position(1), %.6f) ... , y num2str(GlobalBest.Position(2), %.6f)]); disp([對應(yīng)的最優(yōu)函數(shù)值: num2str(GlobalBest.Cost, %.10f)]); disp([理論全局最優(yōu)值: 0]);運(yùn)行上述完整代碼你通常會看到類似這樣的輸出迭代到100代左右找到的最優(yōu)點(diǎn)非常接近(0, 0)最優(yōu)值在10^-10甚至更小的量級。這說明我們的PSO成功跳過了無數(shù)局部極小點(diǎn)找到了全局最優(yōu)。3. 核心參數(shù)深度解析如何調(diào)出一群“聰明”的粒子寫完代碼并能跑出結(jié)果只是第一步。要讓PSO在你的特定問題上發(fā)揮出最佳性能理解并調(diào)校其核心參數(shù)至關(guān)重要。很多人把PSO當(dāng)“黑盒”用參數(shù)一直用默認(rèn)值結(jié)果不是收斂慢就是精度差最后抱怨算法不好用。其實(shí)PSO的參數(shù)各有其物理意義調(diào)整它們就是調(diào)整鳥群的“性格”和“策略”。3.1 慣性權(quán)重探索與開發(fā)的平衡藝術(shù)慣性權(quán)重w是PSO中最重要的參數(shù)之一它直接控制了算法的全局探索與局部開發(fā)能力。w較大如0.9粒子速度受前一時(shí)刻速度影響大傾向于在全局范圍內(nèi)進(jìn)行探索不容易陷入局部最優(yōu)但收斂速度慢且后期可能在最優(yōu)解附近震蕩。w較小如0.4粒子速度更多由個(gè)體和群體最佳位置引導(dǎo)傾向于在當(dāng)前位置附近進(jìn)行精細(xì)搜索開發(fā)收斂速度快但容易早熟陷入局部最優(yōu)。固定權(quán)重 vs. 動態(tài)權(quán)重固定權(quán)重簡單但需要經(jīng)驗(yàn)選擇。對于復(fù)雜多峰問題固定的高權(quán)重可能無法收斂固定的低權(quán)重可能早熟。動態(tài)遞減權(quán)重強(qiáng)烈推薦這是最常用且有效的策略。在迭代初期采用較大的w值讓粒子充分探索整個(gè)空間隨著迭代進(jìn)行線性或非線性地減小w使算法后期專注于在最有希望的區(qū)域進(jìn)行開發(fā)。我們代碼中使用的w w * wdampwdamp0.99就是一種簡單的線性遞減。實(shí)操心得對于一個(gè)新問題我通常從動態(tài)權(quán)重開始嘗試設(shè)置w_init0.9w_final0.4線性遞減。觀察收斂曲線如果前期下降太慢可以適當(dāng)提高初始w或降低wdamp讓權(quán)重降得更快如果曲線顯示早熟很早就平了則應(yīng)該提高最終w或降低wdamp讓權(quán)重降得慢些保持更久的探索能力。3.2 學(xué)習(xí)因子個(gè)體經(jīng)驗(yàn)與群體智慧的權(quán)重學(xué)習(xí)因子c1和c2分別代表了粒子向“個(gè)體歷史最佳”和“群體歷史最佳”學(xué)習(xí)的傾向。c1大c2小粒子更相信自己的經(jīng)驗(yàn)群體多樣性保持得好但收斂速度慢有點(diǎn)像“個(gè)人主義者”組成的松散群體。c1小c2大粒子更傾向于跟隨群體中的領(lǐng)先者收斂速度快但容易導(dǎo)致群體多樣性迅速喪失陷入局部最優(yōu)有點(diǎn)像“盲從的集體”。**c1 c2 ≈ 2**這是最經(jīng)典和常用的設(shè)置在個(gè)體經(jīng)驗(yàn)和群體智慧間取得平衡。通常建議范圍在[1.5, 2.5]之間。一個(gè)高級技巧異步學(xué)習(xí)因子。有些改進(jìn)的PSO變體會讓c1和c2隨時(shí)間變化。例如迭代初期設(shè)置較大的c1和較小的c2鼓勵(lì)粒子獨(dú)立探索迭代后期設(shè)置較小的c1和較大的c2促使群體向最優(yōu)解收斂。這比固定因子有更好的效果。3.3 粒子數(shù)量與迭代次數(shù)計(jì)算資源與精度的權(quán)衡粒子數(shù)量nPop粒子越多搜索能力越強(qiáng)找到全局最優(yōu)的概率越高但每次迭代的計(jì)算開銷也越大。對于大多數(shù)問題粒子數(shù)設(shè)置在20到50之間是個(gè)不錯(cuò)的起點(diǎn)。對于我們的二維Rastrigin函數(shù)30個(gè)粒子足夠了。對于更高維度比如50維的問題可能需要更多的粒子100以上來覆蓋搜索空間。最大迭代次數(shù)MaxIt這取決于問題的復(fù)雜度和你對精度的要求。可以通過觀察收斂曲線來判斷當(dāng)曲線在連續(xù)幾十次迭代中下降幅度小于一個(gè)閾值時(shí)就可以停止了。通常100到500次迭代對于許多問題已經(jīng)足夠。經(jīng)驗(yàn)法則總評估次數(shù) nPop * MaxIt。在計(jì)算資源有限的情況下你需要權(quán)衡是增加粒子數(shù)擴(kuò)大單次搜索范圍還是增加迭代次數(shù)進(jìn)行更深的搜索。對于多峰復(fù)雜問題我傾向于優(yōu)先保證足夠的粒子數(shù)。4. 進(jìn)階標(biāo)準(zhǔn)PSO的局限與常用改進(jìn)策略標(biāo)準(zhǔn)的PSO雖然強(qiáng)大但在實(shí)際應(yīng)用中也暴露出一些缺點(diǎn)主要是“早熟收斂”過早陷入局部最優(yōu)和“后期震蕩”在最優(yōu)解附近徘徊收斂精度不夠。學(xué)術(shù)界和工業(yè)界提出了大量的改進(jìn)變體這里介紹幾種最實(shí)用、也最容易集成到我們代碼中的策略。4.1 速度限制與收縮因子速度限制為了防止粒子速度無限增大而飛離搜索空間早期PSO會設(shè)置一個(gè)最大速度限制Vmax。如果某維速度超過Vmax則將其設(shè)置為Vmax。Vmax通常與搜索空間的寬度相關(guān)例如Vmax k * (VarMax - VarMin)k一般取0.1~0.2。在我們的代碼中我們通過位置邊界處理和速度更新公式本身一定程度上控制了速度但顯式的Vmax在某些問題上仍有價(jià)值。收縮因子這是一個(gè)更優(yōu)雅的方法。Clerc和Kennedy提出了一個(gè)帶收縮因子的PSO版本其速度更新公式修改為v_new χ * [v_old c1*r1*(pBest - x_old) c2*r2*(gBest - x_old)]其中收縮因子χ 2 / |2 - φ - sqrt(φ^2 - 4φ)|且φ c1 c2 4。當(dāng)c1c22.05時(shí)φ4.1計(jì)算得χ≈0.729。使用收縮因子后通常不再需要慣性權(quán)重w也不再需要設(shè)置Vmax。這種方法能保證算法收斂且性能通常優(yōu)于標(biāo)準(zhǔn)PSO。4.2 鄰域拓?fù)浣Y(jié)構(gòu)打破“明星粒子”的壟斷在標(biāo)準(zhǔn)PSO中所有粒子都向同一個(gè)全局最佳粒子gBest學(xué)習(xí)這被稱為“全局版PSO”。它的問題是一旦某個(gè)粒子找到了一個(gè)較好的局部最優(yōu)所有粒子都會迅速被吸引過去導(dǎo)致多樣性急劇下降可能錯(cuò)過全局最優(yōu)。這就好比鳥群里只有一只“明星鳥”大家都只聽它的。鄰域拓?fù)渚褪菫榱私鉀Q這個(gè)問題。每個(gè)粒子不再關(guān)注整個(gè)群體的最佳而是只關(guān)注一個(gè)“小圈子”鄰域內(nèi)的最佳粒子lBest。常見的鄰域結(jié)構(gòu)有環(huán)形拓?fù)涿總€(gè)粒子與左右各k個(gè)粒子相連。信息傳播慢多樣性保持好收斂慢但全局搜索能力強(qiáng)。馮·諾依曼拓?fù)淞W优帕性诰W(wǎng)格上每個(gè)粒子與上下左右四個(gè)鄰居相連。隨機(jī)拓?fù)鋭討B(tài)隨機(jī)地為每個(gè)粒子分配鄰居。使用鄰域拓?fù)浜笏俣雀鹿街械膅Best被替換為lBest。這種PSO被稱為“局部版PSO”。它收斂速度慢于全局版但找到全局最優(yōu)解的概率更高。對于復(fù)雜多峰問題局部版PSO通常是更好的選擇。4.3 混合策略與其他算法聯(lián)姻單一的優(yōu)化算法難免有其局限性。將PSO與其他算法的思想結(jié)合是提升性能的有效途徑。PSO與局部搜索結(jié)合在PSO迭代一定次數(shù)后或者對全局最佳粒子用一個(gè)局部搜索算法如爬山法、Nelder-Mead單純形法進(jìn)行精細(xì)搜索能快速提高解的精度。PSO與遺傳算法思想結(jié)合引入類似遺傳算法的“變異”操作。以一定的小概率隨機(jī)改變某個(gè)粒子的位置相當(dāng)于給粒子群注入新的隨機(jī)探索能量有助于跳出局部最優(yōu)。這被稱為“帶變異的PSO”。在我做天線優(yōu)化的實(shí)際項(xiàng)目中最終采用的是一種“帶收縮因子和隨機(jī)變異的局部版PSO”。收縮因子保證了穩(wěn)定收斂局部拓?fù)浔3至朔N群多樣性而偶爾的變異操作則能在我認(rèn)為算法可能停滯時(shí)“推它一把”。這種組合策略在實(shí)際復(fù)雜工程優(yōu)化中表現(xiàn)非常穩(wěn)健。5. 從測試函數(shù)到真實(shí)世界PSO工程應(yīng)用指南與避坑要點(diǎn)掌握了基本原理和改進(jìn)策略后如何將PSO應(yīng)用到真實(shí)的工程問題中這里分享一些從理論到實(shí)踐的過渡經(jīng)驗(yàn)和常見陷阱。5.1 問題建模定義決策變量與適應(yīng)度函數(shù)這是應(yīng)用PSO最關(guān)鍵的一步也最容易出錯(cuò)。PSO本身不關(guān)心你的問題是什么它只負(fù)責(zé)在給定的決策變量空間里尋找能使適應(yīng)度函數(shù)值最優(yōu)最大或最小的那組變量。決策變量編碼你需要把實(shí)際問題抽象成一組數(shù)字決策變量。比如優(yōu)化神經(jīng)網(wǎng)絡(luò)權(quán)重、天線陣元相位、物流路徑順序等。要確保變量的物理意義明確且搜索邊界[VarMin, VarMax]設(shè)置合理。邊界太窄可能漏掉最優(yōu)解太寬會降低搜索效率。適應(yīng)度函數(shù)設(shè)計(jì)這是算法的“指揮棒”。函數(shù)值的好壞直接引導(dǎo)粒子群的飛行方向。單目標(biāo) vs. 多目標(biāo)我們目前討論的是單目標(biāo)PSO。如果你的問題有多個(gè)相互沖突的目標(biāo)比如既要成本低又要質(zhì)量高則需要使用多目標(biāo)粒子群算法其輸出是一組“帕累托最優(yōu)解”。函數(shù)計(jì)算成本一次適應(yīng)度函數(shù)評估可能很簡單如數(shù)學(xué)函數(shù)也可能極其耗時(shí)如調(diào)用一次復(fù)雜的流體力學(xué)仿真軟件。對于耗時(shí)長的“昂貴優(yōu)化”問題需要盡量減少評估次數(shù)可以考慮使用代理模型或并行計(jì)算。包含約束實(shí)際問題往往帶有約束如“總成本小于預(yù)算”。處理約束的常用方法有罰函數(shù)法將約束違反程度加到適應(yīng)度值上使其變差、可行解優(yōu)先法在比較兩個(gè)粒子時(shí)總是優(yōu)先選擇滿足約束的等。5.2 算法實(shí)現(xiàn)中的常見陷阱與調(diào)試技巧即使理論懂了代碼寫了跑起來也可能不盡如人意。以下是一些實(shí)戰(zhàn)中踩過的坑陷阱一早熟收斂。現(xiàn)象收斂曲線在前20次迭代就迅速下降并變平但最終結(jié)果與理論最優(yōu)值相差甚遠(yuǎn)。排查與解決首先檢查慣性權(quán)重w是否太小或?qū)W習(xí)因子c2是否遠(yuǎn)大于c1。嘗試增大w或c1。嘗試使用局部拓?fù)溧徲蚪Y(jié)構(gòu)打破全局最佳粒子的壟斷。引入變異操作在迭代中期對粒子位置進(jìn)行小幅擾動。增加粒子數(shù)量nPop擴(kuò)大搜索范圍。陷阱二收斂精度不足。現(xiàn)象算法能靠近全局最優(yōu)區(qū)域但始終在最優(yōu)解附近震蕩無法進(jìn)一步逼近。排查與解決在迭代后期采用動態(tài)遞減的慣性權(quán)重讓w變得很小如0.4使粒子進(jìn)行精細(xì)搜索。在算法結(jié)束后對找到的全局最佳位置GlobalBest.Position用一個(gè)簡單的局部搜索算法如坐標(biāo)輪換法進(jìn)行“拋光”往往能以很小的計(jì)算代價(jià)顯著提升精度。檢查速度是否過大。可以嘗試在速度更新后加入速度限制Vmax或者直接使用帶收縮因子的PSO版本。陷阱三結(jié)果不穩(wěn)定。現(xiàn)象每次運(yùn)行程序得到的最優(yōu)結(jié)果波動很大。排查與解決PSO本身具有隨機(jī)性這是正常現(xiàn)象。對于重要問題應(yīng)獨(dú)立運(yùn)行算法多次如30次然后取這些運(yùn)行結(jié)果的平均值、最優(yōu)值和標(biāo)準(zhǔn)差來綜合評價(jià)算法性能。如果波動異常大可能是粒子數(shù)nPop太少或者最大迭代次數(shù)MaxIt不夠。增加這兩個(gè)參數(shù)通常能提高穩(wěn)定性。確保你的隨機(jī)數(shù)種子是隨機(jī)的或者在多次運(yùn)行時(shí)重置隨機(jī)數(shù)生成器rng(shuffle)。5.3 性能評估與對比如何知道你的PSO調(diào)好了不要滿足于“能跑出結(jié)果”。一個(gè)嚴(yán)謹(jǐn)?shù)膬?yōu)化實(shí)踐需要評估和對比。收斂曲線這是最直觀的指標(biāo)。一條好的收斂曲線應(yīng)該前期快速下降中期平穩(wěn)過渡后期緩慢趨近于穩(wěn)定值。畫出多次獨(dú)立運(yùn)行的平均收斂曲線更能說明問題。統(tǒng)計(jì)指標(biāo)對算法進(jìn)行N次如30次獨(dú)立運(yùn)行記錄每次找到的最優(yōu)值。計(jì)算平均最優(yōu)值反映算法的平均性能。最優(yōu)值標(biāo)準(zhǔn)差反映算法的穩(wěn)定性。標(biāo)準(zhǔn)差越小越好。找到全局最優(yōu)的成功率如果理論最優(yōu)值已知可以統(tǒng)計(jì)有多少次運(yùn)行的結(jié)果與理論最優(yōu)的誤差在可接受范圍內(nèi)。與其它算法對比將你調(diào)參后的PSO與標(biāo)準(zhǔn)PSO、遺傳算法、差分進(jìn)化等其他智能優(yōu)化算法在同一個(gè)問題上進(jìn)行對比。使用相同的最大評估次數(shù)作為停止條件比較它們的平均最優(yōu)值和收斂速度。這能最有力地證明你改進(jìn)的有效性。最后我想強(qiáng)調(diào)的是PSO是一個(gè)強(qiáng)大的工具但絕非“銀彈”。它的成功應(yīng)用離不開對問題本身的深刻理解建模和對算法原理的靈活運(yùn)用調(diào)參。我習(xí)慣于把PSO的調(diào)參過程看作是一場實(shí)驗(yàn)先有一個(gè)基于經(jīng)驗(yàn)的初始設(shè)置然后運(yùn)行、觀察收斂曲線、分析問題、調(diào)整參數(shù)、再次運(yùn)行。這個(gè)過程本身就是優(yōu)化思想和工程實(shí)踐的最佳結(jié)合。當(dāng)你看到自己精心調(diào)整的“鳥群”成功繞過無數(shù)陷阱精準(zhǔn)地?fù)湎蚰繕?biāo)時(shí)那種成就感正是從事優(yōu)化工作最迷人的地方。希望這份詳細(xì)的指南和附帶的Matlab代碼能成為你探索智能優(yōu)化世界的一塊堅(jiān)實(shí)跳板。