化算法原理與Matlab實(shí)戰(zhàn):從黑盒優(yōu)化到多峰函數(shù)求解)
1. 項(xiàng)目概述從“黑盒”優(yōu)化到差分進(jìn)化在數(shù)學(xué)建模競(jìng)賽和實(shí)際的工程優(yōu)化問題里我們經(jīng)常會(huì)遇到一類讓人頭疼的“黑盒”函數(shù)優(yōu)化。什么叫黑盒就是你沒法寫出它的解析表達(dá)式或者即使能寫出來也復(fù)雜得讓人無從下手求導(dǎo)。比如你要設(shè)計(jì)一個(gè)天線它的輻射性能是仿真軟件跑出來的一個(gè)數(shù)值你要調(diào)整一個(gè)化工流程的參數(shù)最終的產(chǎn)品收率是通過一套復(fù)雜的機(jī)理模型計(jì)算出來的。這些場(chǎng)景下傳統(tǒng)的基于梯度的方法比如牛頓法、共軛梯度法就傻眼了——你連梯度都算不出來還怎么“下山”找最優(yōu)解這時(shí)候一群被稱為“智能優(yōu)化算法”或“元啟發(fā)式算法”的方法就登場(chǎng)了。它們不依賴問題的具體數(shù)學(xué)性質(zhì)只關(guān)心“輸入一組參數(shù)得到一個(gè)輸出值”這個(gè)映射關(guān)系通過模擬自然界的某種智能行為如進(jìn)化、群體協(xié)作、物理過程來在參數(shù)空間里進(jìn)行搜索。差分進(jìn)化算法就是其中一員猛將它結(jié)構(gòu)簡(jiǎn)單、參數(shù)少、魯棒性強(qiáng)特別適合處理連續(xù)變量的全局優(yōu)化問題。我第一次在數(shù)學(xué)建模國(guó)賽中用它來求解一個(gè)多峰函數(shù)的最優(yōu)參數(shù)組合效果出奇的好從此就成了我工具箱里的???。今天我就結(jié)合一個(gè)經(jīng)典的案例把差分進(jìn)化算法的原理、Matlab實(shí)現(xiàn)細(xì)節(jié)以及實(shí)戰(zhàn)中的調(diào)參心得掰開揉碎了講給你聽。2. 差分進(jìn)化算法核心原理拆解2.1 算法思想一種簡(jiǎn)潔的群體進(jìn)化策略差分進(jìn)化本質(zhì)上是一種基于實(shí)數(shù)編碼的進(jìn)化算法。它的核心思想非常直觀利用種群中個(gè)體之間的向量差來對(duì)個(gè)體進(jìn)行擾動(dòng)從而產(chǎn)生新的試驗(yàn)個(gè)體再通過貪婪選擇來決定下一代種群。這個(gè)過程模擬了自然界“物競(jìng)天擇適者生存”的進(jìn)化機(jī)制。你可以把它想象成在一個(gè)多維的地形圖上找最低點(diǎn)假設(shè)我們求最小值。我們有一群探險(xiǎn)者種群個(gè)體隨機(jī)散布在地圖上。每一代每個(gè)探險(xiǎn)者都會(huì)根據(jù)其他幾個(gè)探險(xiǎn)者的位置信息嘗試性地往一個(gè)新的方向試驗(yàn)向量邁出一步。如果這個(gè)新位置的海拔比原來的位置更低那他就移動(dòng)到新位置否則就留在原地。經(jīng)過很多代這樣的嘗試和選擇整個(gè)群體就會(huì)逐漸向最低點(diǎn)匯聚。它的“智能”就體現(xiàn)在這個(gè)“根據(jù)向量差進(jìn)行擾動(dòng)”的操作上這比完全隨機(jī)變異更有方向性也比傳統(tǒng)遺傳算法的交叉變異操作更直接、更易于控制。2.2 關(guān)鍵操作步驟詳解差分進(jìn)化算法主要包含四個(gè)步驟初始化、變異、交叉和選擇。我們?cè)O(shè)定優(yōu)化問題為最小化目標(biāo)函數(shù) f(X)其中 X 是一個(gè) D 維的向量。1. 初始化在給定的搜索空間內(nèi)隨機(jī)生成 NP 個(gè) D 維的個(gè)體構(gòu)成初始種群。每個(gè)個(gè)體可以表示為 Xi, G [x1,i,G, x2,i,G, ..., xD,i,G]其中 i1,2,...,NPG 是當(dāng)前代數(shù)。 通常每個(gè)維度的值在設(shè)定的下限和上限之間均勻隨機(jī)生成 xj,i,0 xj,min rand(0,1) * (xj,max - xj,min) 這里的關(guān)鍵是種群大小 NP。NP 太小種群多樣性不足容易陷入局部最優(yōu)NP 太大每一代的函數(shù)評(píng)估次數(shù)計(jì)算量會(huì)劇增。對(duì)于大多數(shù)中低維度問題D50NP 設(shè)置在 5D 到 10D 之間是個(gè)不錯(cuò)的起點(diǎn)。2. 變異這是DE算法的精髓。對(duì)于種群中的每一個(gè)目標(biāo)向量 Xi,G我們通過差分策略生成一個(gè)變異向量 Vi,G。最經(jīng)典也是最常用的策略是“DE/rand/1” Vi,G Xr1,G F * (Xr2,G - Xr3,G) 其中r1, r2, r3 是從種群中隨機(jī)選擇的三個(gè)互不相同的索引且它們也不同于當(dāng)前目標(biāo)向量的索引 i。F 是一個(gè)縮放因子通常取值在 [0, 1] 之間我習(xí)慣從0.5開始嘗試。 這個(gè)式子的意義是以個(gè)體 Xr1 為基礎(chǔ)加上另外兩個(gè)個(gè)體 (Xr2 - Xr3) 的向量差乘以一個(gè)系數(shù) F。這個(gè)差分向量 (Xr2 - Xr3) 提供了擾動(dòng)的方向和幅度F 控制了這個(gè)擾動(dòng)的強(qiáng)度。注意變異操作是DE探索能力的主要來源。差分向量 (Xr2 - Xr3) 本質(zhì)上定義了搜索的方向和步長(zhǎng)。當(dāng)種群分散時(shí)步長(zhǎng)大利于全局探索當(dāng)種群收斂時(shí)步長(zhǎng)自動(dòng)變小利于局部精細(xì)搜索。這是一種自適應(yīng)的機(jī)制。3. 交叉變異向量 Vi,G 需要與目標(biāo)向量 Xi,G 進(jìn)行交叉操作以生成試驗(yàn)向量 Ui,G。交叉的目的是增加種群的多樣性。通常使用二項(xiàng)式交叉 uj,i,G vj,i,G, if (rand(0,1) ≤ CR) or (j jrand) xj,i,G, otherwise 其中CR 是交叉概率取值 [0,1]。jrand 是一個(gè)在 [1, D] 中隨機(jī)選擇的維度索引這個(gè)條件保證了試驗(yàn)向量 Ui,G 至少從變異向量 Vi,G 那里繼承了一個(gè)維度的值確保它不會(huì)與目標(biāo)向量 Xi,G 完全相同。 CR 控制著試驗(yàn)向量有多大比例來自變異向量。CR 越大試驗(yàn)向量越像變異向量算法越激進(jìn)收斂可能越快但也可能破壞好模式CR 越小試驗(yàn)向量越像原目標(biāo)向量算法越保守搜索更細(xì)致。4. 選擇這是貪婪選擇步驟決定誰進(jìn)入下一代。將試驗(yàn)向量 Ui,G 代入目標(biāo)函數(shù)計(jì)算其適應(yīng)度值 f(Ui,G)并與目標(biāo)向量 Xi,G 的適應(yīng)度值 f(Xi,G) 進(jìn)行比較對(duì)于最小化問題 Xi,G1 Ui,G, if f(Ui,G) ≤ f(Xi,G) Xi,G1 Xi,G, otherwise 即如果試驗(yàn)向量更好則用它替換原目標(biāo)向量進(jìn)入下一代否則原目標(biāo)向量保留。這種一對(duì)一的貪婪選擇使得種群的平均適應(yīng)度總是非增的保證了算法的收斂性。2.3 算法參數(shù)的意義與經(jīng)驗(yàn)設(shè)置差分進(jìn)化主要有三個(gè)控制參數(shù)種群大小 NP縮放因子 F交叉概率 CR。NP (Population Size)如前所述與問題維度相關(guān)。我的經(jīng)驗(yàn)是對(duì)于簡(jiǎn)單單峰問題NP可以小一些如3D~5D對(duì)于復(fù)雜多峰問題NP需要大一些如10D~20D以維持多樣性。在計(jì)算資源允許的情況下稍微取大一點(diǎn)通常更穩(wěn)健。F (Scaling Factor)控制差分變異的步長(zhǎng)。F 越大擾動(dòng)越大全局探索能力越強(qiáng)但可能跳過最優(yōu)解附近區(qū)域F 越小局部開發(fā)能力越強(qiáng)但容易陷入局部最優(yōu)。經(jīng)典范圍是 [0.4, 1.0]。我常用的起始值是 0.5。有一種策略是讓 F 隨著迭代代數(shù)自適應(yīng)變化比如前期較大利于探索后期較小利于開發(fā)。CR (Crossover Rate)控制參數(shù)更新的概率。高 CR如0.9意味著試驗(yàn)向量大量采用新產(chǎn)生的變異向量信息有利于快速傳播優(yōu)良模式加速收斂但可能過早喪失多樣性。低 CR如0.1則更傾向于保留原個(gè)體的信息搜索更細(xì)致但收斂速度慢。對(duì)于可分離問題各變量相對(duì)獨(dú)立低CR可能更好對(duì)于不可分離問題變量間耦合強(qiáng)高CR通常更有效。我通常從0.3開始嘗試調(diào)整。實(shí)操心得參數(shù)設(shè)置沒有銀彈。一個(gè)非常實(shí)用的方法是先采用經(jīng)典參數(shù)如 NP10*D, F0.5, CR0.3運(yùn)行幾次觀察收斂曲線。如果收斂太快但結(jié)果不好可能是陷入了局部最優(yōu)可以嘗試增大F或NP來增強(qiáng)探索。如果收斂非常慢可以嘗試增大CR或F來加速。在數(shù)學(xué)建模比賽中時(shí)間有限我通常會(huì)準(zhǔn)備2-3組不同的參數(shù)組合如一組偏向探索一組偏向開發(fā)同時(shí)運(yùn)行最后取最好的結(jié)果。3. 案例實(shí)戰(zhàn)求解Rastrigin函數(shù)最小值為了讓大家有最直觀的感受我們用一個(gè)著名的多峰測(cè)試函數(shù)——Rastrigin函數(shù)來作為案例。這個(gè)函數(shù)以其大量的局部最優(yōu)點(diǎn)而聞名非常適合檢驗(yàn)算法的全局搜索和跳出局部最優(yōu)的能力。3.1 問題定義與目標(biāo)函數(shù)Rastrigin函數(shù)的數(shù)學(xué)表達(dá)式為 f(x) 10 * D Σ_{i1}^{D} [ xi^2 - 10 * cos(2 * π * xi) ] 其中D 是變量的維度。我們這里以 D2 為例搜索范圍設(shè)定為 xi ∈ [-5.12, 5.12]。該函數(shù)在原點(diǎn) (0,0,...,0) 處取得全局最小值 0。函數(shù)在搜索空間內(nèi)存在大量的正弦波擾動(dòng)形成的局部極小點(diǎn)對(duì)算法構(gòu)成很大挑戰(zhàn)。在Matlab中我們可以這樣定義這個(gè)目標(biāo)函數(shù)function y rastrigin(x) % x 是一個(gè)行向量或列向量 D維 D length(x); y 10 * D sum(x.^2 - 10 * cos(2 * pi * x)); end3.2 Matlab代碼逐行實(shí)現(xiàn)與解析下面是一個(gè)完整的、注釋詳細(xì)的差分進(jìn)化算法Matlab實(shí)現(xiàn)用于求解上述Rastrigin函數(shù)。%% 差分進(jìn)化算法求解Rastrigin函數(shù)最小值 clear; clc; close all; % 1. 問題定義 CostFunction (x) rastrigin(x); % 目標(biāo)函數(shù)句柄 D 2; % 變量維度 VarMin -5.12; % 變量下界 VarMax 5.12; % 變量上界 % 2. DE 參數(shù)設(shè)置 MaxIt 1000; % 最大迭代次數(shù) NP 10 * D; % 種群大小 (經(jīng)驗(yàn)規(guī)則) F 0.5; % 縮放因子 CR 0.3; % 交叉概率 % 3. 初始化種群 empty_individual.Position []; empty_individual.Cost []; pop repmat(empty_individual, NP, 1); % 創(chuàng)建種群結(jié)構(gòu)體數(shù)組 for i 1:NP % 在搜索空間內(nèi)隨機(jī)生成位置 pop(i).Position unifrnd(VarMin, VarMax, [1, D]); % 計(jì)算初始適應(yīng)度 pop(i).Cost CostFunction(pop(i).Position); end % 記錄最佳解 [~, bestIdx] min([pop.Cost]); BestSol pop(bestIdx); % 用于繪制收斂曲線的數(shù)組 BestCosts zeros(MaxIt, 1); BestCosts(1) BestSol.Cost; %% 4. DE 主循環(huán) for it 2:MaxIt for i 1:NP % 4.1 變異DE/rand/1策略 % 隨機(jī)選擇三個(gè)互不相同的個(gè)體索引且不等于i candidates 1:NP; candidates(i) []; % 移除當(dāng)前目標(biāo)索引 r randperm(NP-1, 3); % 隨機(jī)排列并取前3個(gè) r1 candidates(r(1)); r2 candidates(r(2)); r3 candidates(r(3)); % 生成變異向量 v pop(r1).Position F * (pop(r2).Position - pop(r3).Position); % 確保變異向量在邊界內(nèi)一種簡(jiǎn)單的邊界處理反射 % 如果超出上界則 v VarMax - (v - VarMax) 2*VarMax - v % 如果超出下界則 v VarMin (VarMin - v) 2*VarMin - v v max(v, VarMin); v min(v, VarMax); % 4.2 交叉二項(xiàng)式交叉 u pop(i).Position; % 初始化試驗(yàn)向量為目標(biāo)向量 j0 randi([1, D]); % 隨機(jī)選擇一個(gè)維度確保至少有一個(gè)維度來自v for j 1:D if rand CR || j j0 u(j) v(j); end end % 4.3 選擇 newCost CostFunction(u); if newCost pop(i).Cost pop(i).Position u; pop(i).Cost newCost; % 4.4 更新全局最優(yōu)解 if newCost BestSol.Cost BestSol.Position u; BestSol.Cost newCost; end end end % 記錄每一代的最佳成本 BestCosts(it) BestSol.Cost; % 可選顯示迭代信息 if mod(it, 100) 0 disp([Iteration , num2str(it), : Best Cost , num2str(BestSol.Cost)]); end end %% 5. 結(jié)果展示 disp(優(yōu)化結(jié)束); disp([找到的最佳位置: , num2str(BestSol.Position)]); disp([對(duì)應(yīng)的最小值: , num2str(BestSol.Cost)]); figure; % 5.1 繪制收斂曲線 subplot(1,2,1); plot(BestCosts, LineWidth, 2); xlabel(迭代次數(shù)); ylabel(最佳適應(yīng)度值); title(差分進(jìn)化算法收斂曲線); grid on; % 5.2 繪制函數(shù)曲面及最優(yōu)解位置 (僅適用于D2) if D 2 subplot(1,2,2); % 生成網(wǎng)格點(diǎn) [X1, X2] meshgrid(linspace(VarMin, VarMax, 100), linspace(VarMin, VarMax, 100)); Z 10*D (X1.^2 - 10*cos(2*pi*X1)) (X2.^2 - 10*cos(2*pi*X2)); surf(X1, X2, Z, EdgeColor, none, FaceAlpha, 0.7); hold on; scatter3(BestSol.Position(1), BestSol.Position(2), BestSol.Cost, 200, rp, filled, LineWidth, 3); xlabel(x1); ylabel(x2); zlabel(f(x)); title(Rastrigin函數(shù)曲面及最優(yōu)解); colorbar; view(-20, 30); % 調(diào)整視角 end3.3 代碼關(guān)鍵點(diǎn)解析與調(diào)試技巧種群初始化使用結(jié)構(gòu)體數(shù)組pop來存儲(chǔ)每個(gè)個(gè)體的位置和成本這比用兩個(gè)獨(dú)立的矩陣更清晰也更容易管理個(gè)體附加信息。變異索引選擇randperm(NP-1, 3)是關(guān)鍵。先構(gòu)建一個(gè)不包含當(dāng)前索引i的候選列表candidates再從中隨機(jī)選取三個(gè)確保了r1, r2, r3與i互異且彼此互異。這是標(biāo)準(zhǔn)DE的要求避免自交和過度利用。邊界處理變異操作可能產(chǎn)生超出定義域的值。代碼中采用了簡(jiǎn)單的“反射”方法先截?cái)嗟竭吔缫部梢圆捎秒S機(jī)重置或吸收邊界值。對(duì)于邊界敏感的問題需要更精細(xì)的處理策略。交叉操作j0 randi([1, D])這一行至關(guān)重要。它保證了試驗(yàn)向量u至少有一個(gè)維度來自變異向量v防止了試驗(yàn)向量與目標(biāo)向量完全相同而導(dǎo)致無效迭代。貪婪選擇選擇操作在個(gè)體層面進(jìn)行并同步更新全局最優(yōu)解BestSol。這種機(jī)制使得算法具有精英保留特性當(dāng)前找到的最好解不會(huì)丟失。結(jié)果顯示收斂曲線是評(píng)估算法性能的核心。一個(gè)健康的收斂曲線應(yīng)該在前中期快速下降后期趨于平穩(wěn)。如果曲線一直劇烈震蕩說明算法探索性太強(qiáng)可能需要減小F或增大CR如果曲線很早就變平但值很大說明陷入了局部最優(yōu)需要增大F或NP。調(diào)試技巧在算法開發(fā)階段我強(qiáng)烈建議將MaxIt先設(shè)小比如50NP也設(shè)小比如5然后單步調(diào)試或輸出中間變量如每一代的最佳適應(yīng)度、種群平均適應(yīng)度、某個(gè)個(gè)體的位置變化。觀察變異向量v和試驗(yàn)向量u是如何生成的選擇是如何發(fā)生的。這能幫你深刻理解算法流程快速定位邏輯錯(cuò)誤。4. 差分進(jìn)化在數(shù)學(xué)建模中的實(shí)戰(zhàn)策略4.1 模型適配何時(shí)該想到用DE在數(shù)學(xué)建模中差分進(jìn)化并非萬能鑰匙但在以下場(chǎng)景中它的優(yōu)勢(shì)非常明顯目標(biāo)函數(shù)不可導(dǎo)或求導(dǎo)困難這是DE的“主場(chǎng)”。比如模型內(nèi)部調(diào)用了商業(yè)仿真軟件、包含查表插值、或者是基于代理模型響應(yīng)面、Kriging模型的優(yōu)化。問題維度中等通常D100對(duì)于超高維問題DE的搜索效率會(huì)下降需要非常大的種群計(jì)算成本激增。但對(duì)于幾十個(gè)變量的優(yōu)化DE游刃有余。需要全局最優(yōu)解而非局部最優(yōu)面對(duì)多峰、非線性、非凸的復(fù)雜問題梯度類方法極易陷入局部最優(yōu)而DE的群體搜索和差分?jǐn)_動(dòng)機(jī)制賦予其更強(qiáng)的全局探索能力。參數(shù)為連續(xù)實(shí)數(shù)DE原生支持實(shí)數(shù)編碼對(duì)于連續(xù)變量?jī)?yōu)化非常自然。對(duì)于混合整數(shù)規(guī)劃需要結(jié)合特定的編碼和解碼策略。例如在2019年國(guó)賽C題“機(jī)場(chǎng)的出租車問題”中如果要優(yōu)化出租車司機(jī)的決策策略如等待時(shí)間閾值、空駛選擇概率等這些策略參數(shù)是連續(xù)的收益函數(shù)需要通過模擬仿真來評(píng)估不可導(dǎo)這就非常適合用DE來優(yōu)化策略參數(shù)以最大化司機(jī)單位時(shí)間收益。4.2 與其他智能算法的對(duì)比選型數(shù)學(xué)建模中常用的智能優(yōu)化算法還有遺傳算法、粒子群算法、模擬退火等。了解它們的區(qū)別有助于正確選型。算法核心思想優(yōu)勢(shì)劣勢(shì)適用場(chǎng)景差分進(jìn)化(DE)向量差分變異貪婪選擇參數(shù)少原理簡(jiǎn)單魯棒性強(qiáng)全局探索與局部開發(fā)平衡較好。對(duì)高維問題效率下降對(duì)離散問題處理不便。連續(xù)變量全局優(yōu)化黑盒函數(shù)多峰問題。遺傳算法(GA)模擬生物進(jìn)化選擇、交叉、變異通用性強(qiáng)易于結(jié)合問題知識(shí)進(jìn)行編碼有成熟的多種交叉變異算子。參數(shù)較多種群大小、交叉率、變異率、選擇策略等調(diào)參復(fù)雜收斂速度可能較慢。各類優(yōu)化問題連續(xù)、離散、組合特別是問題有特殊結(jié)構(gòu)可設(shè)計(jì)專門算子時(shí)。粒子群算法(PSO)模擬鳥群社會(huì)行為個(gè)體歷史最優(yōu)和群體歷史最優(yōu)概念簡(jiǎn)單收斂速度通常較快特別是前期。容易早熟收斂陷入局部最優(yōu)對(duì)參數(shù)慣性權(quán)重、學(xué)習(xí)因子敏感。連續(xù)空間優(yōu)化問題相對(duì)簡(jiǎn)單或維度不高時(shí)。模擬退火(SA)模擬固體退火過程Metropolis準(zhǔn)則接受劣解單個(gè)體迭代內(nèi)存占用小理論上能以概率1收斂到全局最優(yōu)。收斂速度慢降溫 schedule 需要精心設(shè)計(jì)對(duì)初始解敏感。組合優(yōu)化如TSP或作為其他算法的局部搜索器。我的經(jīng)驗(yàn)是對(duì)于一般的連續(xù)函數(shù)優(yōu)化尤其是數(shù)學(xué)建模中常見的、沒有先驗(yàn)知識(shí)的問題我會(huì)優(yōu)先嘗試差分進(jìn)化。因?yàn)樗_箱即用調(diào)參負(fù)擔(dān)小結(jié)果穩(wěn)定。如果問題有明顯的組合特性比如調(diào)度、路徑規(guī)劃則會(huì)考慮遺傳算法或模擬退火。4.3 性能提升與高級(jí)技巧基礎(chǔ)DE能解決大部分問題但在面對(duì)復(fù)雜挑戰(zhàn)時(shí)可以引入一些策略提升性能參數(shù)自適應(yīng)讓F和CR在迭代過程中動(dòng)態(tài)變化。例如JADE算法提出了一種基于成功歷史記錄的自適應(yīng)參數(shù)調(diào)整機(jī)制性能提升顯著。一個(gè)簡(jiǎn)單的自實(shí)現(xiàn)思路是在迭代初期設(shè)置較大的F如0.8和較小的CR如0.2以加強(qiáng)探索迭代后期設(shè)置較小的F如0.3和較大的CR如0.9以加強(qiáng)開發(fā)。策略自適應(yīng)除了經(jīng)典的“DE/rand/1”還有“DE/best/1”利用當(dāng)前最優(yōu)個(gè)體引導(dǎo)搜索、“DE/current-to-best/1”等??梢噪S機(jī)混合使用多種策略或者根據(jù)策略的歷史成功率自適應(yīng)選擇。種群多樣性管理當(dāng)檢測(cè)到種群過早收斂如所有個(gè)體間距離小于某個(gè)閾值時(shí)可以重新初始化部分個(gè)體或者引入小概率的“災(zāi)難性”突變來跳出局部最優(yōu)?;旌纤惴▽E作為全局搜索器在其找到的近似最優(yōu)解區(qū)域再用一個(gè)局部搜索方法如Nelder-Mead單純形法、擬牛頓法進(jìn)行精細(xì)搜索形成“全局探索局部開發(fā)”的兩階段策略往往能更快更準(zhǔn)地找到最優(yōu)解。在Matlab中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的F自適應(yīng)示例% 在迭代循環(huán)開始前定義 F_min 0.2; F_max 0.8; ... for it 1:MaxIt % 線性遞減的F F F_max - (F_max - F_min) * (it / MaxIt); % 或者使用非線性遞減如 % F F_max * (F_min/F_max)^(it/MaxIt); ... end5. 常見問題排查與Matlab調(diào)試實(shí)錄即使理解了原理自己實(shí)現(xiàn)時(shí)還是會(huì)遇到各種問題。下面是我在多年使用和教學(xué)中總結(jié)的一些典型“坑”和解決方法。5.1 算法不收斂或收斂到錯(cuò)誤值癥狀最佳適應(yīng)度值曲線不下降或者很快穩(wěn)定在一個(gè)很差的水平。排查思路檢查目標(biāo)函數(shù)首先手動(dòng)計(jì)算幾個(gè)已知點(diǎn)的函數(shù)值確保你的CostFunction實(shí)現(xiàn)正確。對(duì)于Rastrigin函數(shù)可以測(cè)試f([0,0])是否等于0。檢查邊界處理如果變異向量超出邊界后處理不當(dāng)比如直接賦為邊界值可能會(huì)導(dǎo)致大量個(gè)體聚集在邊界上。嘗試輸出幾代種群的位置看看是否都擠在邊界。改用反射或隨機(jī)重置方法。調(diào)整參數(shù)F和CR這是最常見的原因。F太小會(huì)導(dǎo)致差分?jǐn)_動(dòng)不足算法像“微步爬行”容易陷入局部最優(yōu)F太大則擾動(dòng)過于劇烈像“隨機(jī)跳躍”難以穩(wěn)定收斂。CR太小意味著試驗(yàn)向量幾乎繼承原向量搜索停滯CR太大則變異向量完全主導(dǎo)可能破壞已找到的好解。建議進(jìn)行參數(shù)掃描固定其他參數(shù)分別系統(tǒng)性地改變F和CR如F[0.2,0.5,0.8], CR[0.1,0.5,0.9]觀察哪種組合效果最好。增大種群大小NPNP太小種群多樣性不足算法搜索空間覆蓋不夠容易早熟。嘗試將NP增加到15*D或20*D。檢查變異索引選擇確保r1, r2, r3, i互不相同。如果r1等于i則變異基向量是自身會(huì)減弱探索能力。5.2 收斂速度過慢癥狀函數(shù)值下降很慢需要非常多代迭代才能達(dá)到可接受的結(jié)果。排查與解決引入“DE/best/1”策略將變異公式改為Vi Xbest F*(Xr1 - Xr2)。利用當(dāng)前最優(yōu)個(gè)體的信息引導(dǎo)搜索可以顯著加快收斂速度。但要注意這會(huì)增加陷入局部最優(yōu)的風(fēng)險(xiǎn)。一個(gè)折中的方案是使用“DE/current-to-best/1”:Vi Xi F*(Xbest - Xi) F*(Xr1 - Xr2)。動(dòng)態(tài)調(diào)整F在迭代初期使用較大的F進(jìn)行探索后期使用較小的F進(jìn)行開發(fā)。檢查交叉操作確保jrand機(jī)制正常工作??梢暂敵鰩讉€(gè)試驗(yàn)向量u看看它是否確實(shí)與目標(biāo)向量Xi不同。問題本身性質(zhì)有些函數(shù)本身就很“平坦”或“崎嶇”收斂慢是固有的??梢試L試與其他算法如PSO比較如果都慢那可能就是問題本身計(jì)算復(fù)雜。5.3 Matlab特定錯(cuò)誤與優(yōu)化錯(cuò)誤“索引超出矩陣維度”原因最可能發(fā)生在選擇r1, r2, r3時(shí)。當(dāng)NP較小比如為4時(shí)candidates 1:NP; candidates(i)[]后candidates長(zhǎng)度為3。此時(shí)randperm(NP-1, 3)中的NP-1應(yīng)該是length(candidates)即3。如果錯(cuò)誤地用了randperm(NP-1, 3)而NP4則NP-13沒問題但如果NP5NP-14就會(huì)試圖從4個(gè)元素中選3個(gè)而candidates實(shí)際只有4個(gè)不對(duì)NP5時(shí)移除i后candidates有4個(gè)元素randperm(4,3)是合法的。更穩(wěn)妥的寫法是r randperm(length(candidates), 3);。性能瓶頸向量化操作在D較大時(shí)循環(huán)計(jì)算每個(gè)個(gè)體的成本可能成為瓶頸。如果可能嘗試將種群位置堆疊成矩陣一次性計(jì)算所有個(gè)體的成本。但DE的選擇操作是個(gè)體間的完全向量化較難。通常目標(biāo)函數(shù)的計(jì)算成本遠(yuǎn)高于DE算法本身的開銷所以優(yōu)化重點(diǎn)應(yīng)放在目標(biāo)函數(shù)的加速上如預(yù)計(jì)算、查表、簡(jiǎn)化模型。并行計(jì)算DE種群中個(gè)體的評(píng)估是相互獨(dú)立的非常適合并行??梢允褂肕atlab的parfor循環(huán)來并行計(jì)算每個(gè)個(gè)體的成本這對(duì)于計(jì)算昂貴的目標(biāo)函數(shù)能帶來近乎線性的加速比。% 將主循環(huán)中的成本計(jì)算部分改為并行 newCosts zeros(NP, 1); parfor i 1:NP newCosts(i) CostFunction(u_i); % 需要預(yù)先為每個(gè)i生成u_i這里是個(gè)示意 end % 然后串行進(jìn)行選擇操作結(jié)果復(fù)現(xiàn)性固定隨機(jī)數(shù)種子為了調(diào)試和比較不同參數(shù)的效果需要確保每次運(yùn)行的可復(fù)現(xiàn)性。在代碼開頭使用rng(1, twister)或rng(default)來固定隨機(jī)數(shù)生成器的種子。最后再分享一個(gè)在數(shù)學(xué)建模比賽中至關(guān)重要的小技巧記錄完整實(shí)驗(yàn)日志。當(dāng)你嘗試多組參數(shù)、甚至多種算法變體時(shí)務(wù)必用一個(gè)結(jié)構(gòu)體或表格記錄每次運(yùn)行的參數(shù)配置、最終結(jié)果、運(yùn)行時(shí)間。這不僅能幫你快速找到最佳方案在撰寫論文的“靈敏度分析”或“算法對(duì)比”部分時(shí)這些記錄就是現(xiàn)成且可信的數(shù)據(jù)來源。差分進(jìn)化算法就像一把瑞士軍刀簡(jiǎn)單但實(shí)用。理解其每一個(gè)部件的工作原理你就能根據(jù)具體問題靈活調(diào)整讓它成為你解決復(fù)雜優(yōu)化問題的得力助手。