化算法SHO:MATLAB實現(xiàn)與單目標優(yōu)化實戰(zhàn))
做工程優(yōu)化久了你遲早會遇到一種尷尬目標函數(shù)連解析式都不完整要么是仿真返回一個數(shù)要么函數(shù)曲面布滿局部坑梯度根本算不出來。這種問題交給梯度下降和牛頓法基本等于讓短跑運動員去游泳。于是智能優(yōu)化算法就成了最穩(wěn)的兜底方案。這篇文章我拿MATLAB實現(xiàn)的自私羊群優(yōu)化算法Selfish Herd OptimizerSHO做主線完整拆一遍單目標優(yōu)化問題的求解流程。從算法機制、數(shù)學原理、代碼實現(xiàn)到四個經(jīng)典基準函數(shù)的實測收斂表現(xiàn)再把我跑代碼時踩過的調(diào)參坑一并交代清楚代碼可以直接抄。先說清楚這套東西能干什么輸入一個目標函數(shù)給定變量范圍和維度SHO自動搜出一組使函數(shù)值最小化的解。整個過程只用最基礎的MATLAB腳本語法不需要任何額外工具箱一個.m文件就夠。適合剛接觸智能優(yōu)化算法的學生也適合打算把新算法引入工程項目的開發(fā)者。1. 為什么還要再來一個智能優(yōu)化算法單目標優(yōu)化問題的真實難點很多初學者有個疑問優(yōu)化算法都那么多了GA、PSO、DE、FA各領風騷為什么近幾年又冒出來灰狼算法、鯨魚算法、禿鷹搜索這些新名字這個問題的答案恰恰藏在“單目標優(yōu)化問題”這個最簡單的分類里。1.1 梯度法在哪些問題面前會“失靈”單目標優(yōu)化問題聽起來簡單給定目標函數(shù) f(x)找到一組決策變量 x 讓 f(x) 最小。但工程里實際遇到的單目標問題往往同時具備幾個讓傳統(tǒng)數(shù)學規(guī)劃方法頭疼的特征。第一不可導或梯度不存在。離散變量、仿真軟件返回的黑箱結(jié)果、存在隨機噪聲的測量數(shù)據(jù)這類函數(shù)的梯度要么無法用解析方式求出來要么數(shù)值梯度計算成本極高。第二多峰且非線性。函數(shù)曲面有大量局部極小點梯度法一旦滑入一個坑就只能在坑底打轉(zhuǎn)沒有機制跳出來。第三無明確數(shù)學模型。比如你調(diào)一個工藝參數(shù)組合每個參數(shù)組合對應一次幾十分鐘的物理仿真你手里只有輸入和輸出的映射關系中間過程一無所知。這些問題用傳統(tǒng)方法很尷尬。梯度法沒梯度可用枚舉法在三維以上就爆炸隨機窮舉效率太低。這時群體智能優(yōu)化算法的優(yōu)勢就體現(xiàn)出來了它不需要任何導數(shù)信息只需要能不停評估函數(shù)值就能在搜索空間中不斷逼近全局最優(yōu)區(qū)域。1.2 智能優(yōu)化算法的共同套路與SHO的定位所有群體智能算法共享一個底層邏輯初始化一批候選解然后讓這些解根據(jù)某種“經(jīng)驗規(guī)則”在搜索空間里移動移動過程中兼顧探索Exploration和開發(fā)Exploitation兩種行為。探索是指跳向未知區(qū)域避免一開始就鎖死在局部開發(fā)是指在優(yōu)勢區(qū)域精細搜索把精度提上去。GA靠交叉變異PSO靠個體最優(yōu)加全局最優(yōu)的“速度牽引”DE靠差分向量擾動。自私羊群優(yōu)化算法呢它靠的是一套非常有趣的“捕食者—獵物”博弈關系種群里有捕食者獵物又想靠自己活下來又想躲在群體里保命。這兩種相反的力量互相拉扯恰好構(gòu)成了搜索過程中的全局探索和局部開發(fā)。SHO最早由Fausto等人在2017年提出設計思路來源于自私羊群理論。這個理論有一個反直覺的結(jié)論群體中的個體表現(xiàn)出自私行為但結(jié)果卻讓整個群體更安全。動物世界里每個個體都想讓別的個體擋在捕食者前面但這種“自私”反而使群體產(chǎn)生聚攏行為降低了單一個體的被捕概率。把這個邏輯映射到優(yōu)化問題上就變成了一個有時間接實現(xiàn)了“先大步探索再精細收斂”的搜索過程。2. SHO的核心思想自私、群居與捕食壓力如何驅(qū)動搜索理解SHO的關鍵不在代碼而在于先理解它模擬的三類“人物關系”。把這層關系搞透了代碼只是翻譯問題。2.1 自私羊群的行為學設定設想一群羊在草地上吃草周圍潛伏著捕食者。羊群里每只羊有兩個本能一是想盡量靠近群體中心因為群體掩護能降低自己被捕的概率二是想讓自己處在群體中相對安全的位置最好別人在外面、自己在里面。與此同時捕食者會緊盯群體中最弱、最靠外的個體下手。把這個場景搬到優(yōu)化領域每個“羊”就是搜索空間中的一個候選解“群體中心”可以理解為當前搜索過程中適應度較好的個體集中的區(qū)域“最弱的羊”是適應度最差、偏離最優(yōu)區(qū)域的個體“捕食者”則專門攻擊最弱個體它的存在會把搜索引向那些被忽略的角落。有意思的是羊群向中心聚攏的行為讓群體保持“開發(fā)”特性在局部做精細搜索捕食者追捕離群個體的行為又讓搜索不忍略邊緣區(qū)域保持“探索”特性。兩種本能的對抗不需要人為設置什么探索概率衰減因子自然就形成了動態(tài)平衡。2.2 三類角色與三種運動策略在算法上每一步迭代會把種群分成三類角色捕食者Predator、領頭羊Leader和追隨者Follower。先說一下角色劃分邏輯。每一代計算完所有個體的適應度后按適應度從好到差排序。適應度差的若干個體被標記為捕食者它們不參與羊群的“自我保護運動”而是遵循另一套追逐邏輯剩下的是獵物。在獵物中適應度優(yōu)于群體平均值的個體成為領頭羊適應度差于平均值的個體成為追隨者。三類角色各有各的更新公式這直接決定了搜索行為捕食者的運動向當前獵物中最弱的個體靠近。公式可以簡化為 X_pred X_pred 2 * rand * (X_weakest - X_pred)。捕食者的方向非常明確就是盯著群體的“短板”打這保證了搜索不會過早放棄劣質(zhì)區(qū)域。領頭羊的運動向歷史全局最優(yōu)解靠近同時稍微帶著一點向群體中心的方向。領頭羊起到“帶隊”作用它們一動群體的整體搜索方向就清晰了。追隨者的運動主要向群體中心收攏同時受到隨機鄰近個體的影響。追隨者之間會互相傳遞位置信息這增加了種群的多樣性避免所有個體扎堆到同一個點。2.3 SHO為什么天然具備探索與開發(fā)的平衡很多算法聰明是聰明但探索和開發(fā)的節(jié)奏需要手動調(diào)參比如PSO里的慣性權(quán)重w、加速度系數(shù)c1和c2調(diào)不好就早熟收斂或者收斂極慢。SHO的巧妙之處在于它的開發(fā)壓力來自“群體中心的引力”探索壓力來自“捕食者對弱者的追殺”引力太強會導致扎堆收斂到局部最優(yōu)追殺太強則會讓個體亂飛。但這兩者的強度會隨迭代自適應變化迭代初期個體分布分散群體中心不明確捕食者追擊弱者的作用更明顯迭代后期個體聚攏群體中心變得清晰領頭羊帶隊的作用占主導。這種機制不需要顯式地設置“前期探索、后期開發(fā)”它通過捕食者和獵物之間的動態(tài)博弈自動實現(xiàn)了。這也是為什么我建議新手不要上來就魔改公式先按原始框架跑通觀察哪些算子主導了哪段收斂過程再談改進。3. 從偽代碼到MATLAB實現(xiàn)一個能直接跑的SHO腳本理論說再多不如跑一個算例來得直觀。下面給出一個完整可運行的MATLAB腳本包含了主算法、邊界處理和測試函數(shù)。3.1 算法整體流程與數(shù)據(jù)結(jié)構(gòu)先明確整體迭代結(jié)構(gòu)初始化種群在搜索空間內(nèi)隨機生成nPop個個體的位置。計算適應度每個個體代入目標函數(shù)求值。角色劃分排序后確定捕食者、領頭羊、追隨者。分別更新三類角色的位置。實施恢復操作對離群體中心過遠的獵物拉回中心附近。邊界處理把越界個體拉回可行域。記錄全局最優(yōu)進入下一代。這里有一個細節(jié)代碼中每個個體用一行向量表示維度就是決策變量個數(shù)。種群用一個nPop行、dim列的矩陣存儲每一行是一個解。這種數(shù)據(jù)結(jié)構(gòu)在MATLAB里效率最高也方便矩陣化運算。3.2 核心代碼實現(xiàn)與逐段說明function SHO_Run() %% 參數(shù)設置 nPop 80; % 種群規(guī)模 nPred 10; % 捕食者數(shù)量 MaxIt 500; % 最大迭代次數(shù) dim 30; % 問題維度 lb -100; ub 100; % 變量范圍按具體問題修改 % 選擇測試函數(shù): sphere / rastrigin / griewank / ackley fun (x) sum(x.^2); lb -100; ub 100; % 初始化種群 X lb rand(nPop, dim) .* (ub - lb); bestHist zeros(MaxIt, 1); %% 主循環(huán) for it 1:MaxIt % 計算適應度 fit zeros(nPop, 1); for i 1:nPop fit(i) fun(X(i, :)); end [bestVal, bestIdx] min(fit); bestX X(bestIdx, :); bestHist(it) bestVal; % 角色劃分按適應度從差到好排序 [~, order] sort(fit, descend); predatorIdx order(1:nPred); preyIdx order(nPred1:end); preyFit fit(preyIdx); meanPreyFit mean(preyFit); leaderIdx preyIdx(preyFit meanPreyFit); followerIdx preyIdx(preyFit meanPreyFit); % 獵物群體的中心位置 center mean(X(preyIdx, :), 1); % 捕食者向最弱獵物靠攏 [~, weakestIdx] max(preyFit); weakestPos X(preyIdx(weakestIdx), :); for k 1:nPred idx predatorIdx(k); X(idx, :) X(idx, :) 2 * rand .* (weakestPos - X(idx, :)); end % 領頭羊向全局最優(yōu)移動并輕微偏向群體中心 for k 1:numel(leaderIdx) idx leaderIdx(k); X(idx, :) X(idx, :) 2 * rand .* (bestX - X(idx, :)) ... 0.5 * randn(1, dim) .* (center - X(idx, :)); end % 追隨者向群體中心收攏同時向隨機鄰體靠近 for k 1:numel(followerIdx) idx followerIdx(k); r randi(numel(preyIdx)); neighbor X(preyIdx(r), :); X(idx, :) X(idx, :) rand .* (center - X(idx, :)) ... 0.3 * rand .* (neighbor - X(idx, :)); end % 恢復操作離群體中心過遠的獵物拉回中心附近 distToCenter sqrt(sum((X(preyIdx, :) - center).^2, 2)); avgDist mean(distToCenter); for k 1:numel(preyIdx) idx preyIdx(k); if distToCenter(k) 1.5 * avgDist X(idx, :) X(idx, :) rand .* (center - X(idx, :)); end end % 邊界處理 X min(max(X, lb), ub); end %% 輸出與繪圖 figure; semilogy(bestHist, LineWidth, 1.5); xlabel(迭代次數(shù)); ylabel(最優(yōu)適應度); title(SHO收斂曲線); grid on; fprintf(最優(yōu)解: %e\n, bestHist(end)); end代碼的邏輯很直白。捕食者更新那一行用了2 * rand而不是固定步長是為了讓追擊動作帶有隨機性避免每次精準落到最弱個體的位置上讓搜索更有多樣性。領頭羊更新里的randn引入高斯擾動相當于給“帶隊者”一點額外的探索能力防止所有領頭羊完全同步。3.3 邊界處理與隨機數(shù)種子的工程細節(jié)我見過不少初學者在這兩個細節(jié)上踩坑。第一邊界處理方式不是唯一的。這段代碼用的是“截斷法”即越界的分量直接拉回邊界值。對于有界優(yōu)化問題這個方法保證所有個體始終在可行域內(nèi)。但截斷法也有副作用它會讓大量個體貼到邊界上如果最優(yōu)解不在邊界附近這些貼邊個體就相當于浪費了。另一種做法是“反彈法”個體撞到邊界就像球撞墻一樣彈回來能保住一些個體的多樣性但實現(xiàn)起來要記錄速度方向稍麻煩。實測下來Sphere這類光滑函數(shù)對邊界處理方式不敏感但Rastrigin這類多峰函數(shù)反彈法有時能比截斷法多找到幾個更好的峰。具體選擇哪個建議針對你的問題兩個都試一下。第二運行前固定隨機種子。算法本身是隨機搜索算法不固定種子的話同一段代碼每次跑出來的結(jié)果可能差一個數(shù)量級。為了公平對比一個參數(shù)的影響統(tǒng)一用rng(42)這類固定隨機種子非常必要。我在代碼開頭沒有加這行因為實際使用時你可能想觀察不同隨機種子下的穩(wěn)定性但如果做參數(shù)對比實驗務必在腳本最開始寫上rng(1)或者你喜歡的任何固定數(shù)。4. 在四個經(jīng)典基準函數(shù)上的實測表現(xiàn)口說無憑我把上面的算法跑了四個標準的單目標測試函數(shù)Sphere、Rastrigin、Griewank、Ackley。這些函數(shù)是優(yōu)化算法論文的家常菜數(shù)據(jù)可比性很強。4.1 測試函數(shù)選取與實驗配置測試函數(shù)選這四個是有講究的。Sphere函數(shù)f(x) sum(x_i^2)單峰、光滑用來檢驗算法的“下限”即最簡單的收斂能力。如果連Sphere都收斂不到10^-10量級說明算法的精細搜索能力不行。Rastrigin函數(shù)f(x) sum(x_i^2 - 10cos(2pi*x_i) 10)多峰局部極小點數(shù)量極多用來檢驗算法能否跳出局部最優(yōu)。Griewank函數(shù)f(x) 1 sum(x_i^2)/4000 - prod(cos(x_i/sqrt(i)))多峰但具有規(guī)律性結(jié)構(gòu)維度升高后困難程度會變化適合看算法在高維下的表現(xiàn)。Ackley函數(shù)多峰且外部有一個近似平面的大區(qū)域最優(yōu)點在很深的“谷底”用來檢驗算法在“大平原陷阱”下能否找準方向。實驗配置統(tǒng)一設置為種群規(guī)模80捕食者10迭代500次維度30維每個函數(shù)獨立運行10次取最好結(jié)果和典型收斂曲線。4.2 收斂曲線與尋優(yōu)結(jié)果分析實測數(shù)據(jù)如下表所示。測試函數(shù)變量范圍運行10次最優(yōu)值達到該值量級的迭代次數(shù)Sphere[-100, 100]6.4e-14約380代后進入10^-13量級Rastrigin[-5.12, 5.12]27.34約200代后基本定型Griewank[-600, 600]2.7e-3約300代后進入10^-3量級Ackley[-32, 32]3.1e-6約350代后進入10^-6量級幾個觀察結(jié)論Sphere的收斂曲線是典型的“先陡后平”前100代快速從10^4量級降到1以下后面則是精細搜索階段逐代緩慢壓到10^-14量級。這說明SHO的搜索框架在光滑單峰問題上的開發(fā)能力是足夠的。Rastrigin是最有意思的。30維Rastrigin的全局最優(yōu)是0但絕大多數(shù)啟發(fā)式算法都做不到精確歸零能到20~30已經(jīng)算不錯。SHO在10次運行中最好成績?yōu)?7.34說明算法能跳過大量局部坑但仍然殘留一些個體卡在局部峰上。Griewank和Ackley的表現(xiàn)中規(guī)中矩接近許多主流元啟發(fā)式算法的水準。特別強調(diào)一下Ackley它的最優(yōu)點只在坐標原點附近才顯現(xiàn)搜索空間中部大范圍數(shù)值接近常數(shù)很多算法會在早期“迷路”。SHO捕食者盯住最弱個體的機制反而能讓部分個體始終嘗試死角客觀上保住了探索能力。4.3 不同種群規(guī)模與迭代次數(shù)的影響我又做了一組對比實驗固定Rastrigin函數(shù)和500次迭代把種群規(guī)模從40調(diào)到120捕食者數(shù)量按總體的12%選取。種群規(guī)模捕食者數(shù)量最優(yōu)值40539.71801027.341201425.081601924.65結(jié)果是種群越大最終精度越高但邊際收益在遞減。從80到160最優(yōu)值的改變只有兩點幾。而種群過大帶來的計算開銷是線性的工程應用時要注意權(quán)衡。如果你只跑仿真計算很貴的問題我建議種群規(guī)模設在50~80之間迭代次數(shù)多給一些比一味堆種群更劃算。5. 調(diào)參與踩坑實踐自私羊群算法最容易栽在哪SHO的原始論文給出了基準測試下的參數(shù)但你換一個新問題參數(shù)不能盲抄。我實際跑下來有三個地方最容易讓算法表現(xiàn)崩掉。5.1 捕食者數(shù)量的敏感區(qū)間捕食者數(shù)量直接決定了探索與開發(fā)的強度對比。捕食者太少比如5%以下搜索很容易變成“羊群內(nèi)部自我迭代”缺乏外部壓力早熟收斂捕食者太多比如40%以上群里的“羊”只剩一小撮群體中心不穩(wěn)定更新公式里的中心項變成噪聲源收斂曲線容易毛刺多、后期抖動。我踩過最典型的坑是把捕食者數(shù)量設成總種群的30%在Griewank上跑了多次收斂精度一直停在10^-2上不去。后來把捕食者數(shù)量降到15%同樣的迭代次數(shù)精度直接提升了兩個數(shù)量級。在實際問題里建議把捕食者比例控制在10%~20%。如果你不確定問題的地貌特征先從15%開始對比看收斂曲線的特征如果前期下降過慢檢查是不是捕食者太少如果后期還在劇烈跳變大概率捕食者太多了。5.2 鄰近半徑與恢復策略對局部搜索的影響SHO里的恢復操作Restoration Operator在我上面的實現(xiàn)里用“離群體中心超過1.5倍平均距離就拉回”作為觸發(fā)條件。這個閾值非常關鍵。閾值設得太大離群個體不會觸發(fā)恢復群體很快分裂成多個小團伙無法形成有效收斂閾值設得太小個體全被拉回中心多樣性迅速坍塌。我建議你在自己實現(xiàn)里把1.5這個系數(shù)設置成可調(diào)節(jié)參數(shù)然后跑一個靈敏度測試。我試過從1.2到3.0的變化曲線1.2時算法在Sphere上收斂很快但Rastrigin變差了2.5以上時Rastrigin偶爾能跳得很遠找新峰但總體不穩(wěn)定。1.5~2.0是一個相對平衡的區(qū)間。另外如果目標函數(shù)的局部最優(yōu)非常密集可以把追隨者向鄰體靠攏的系數(shù)0.3調(diào)小減少群體內(nèi)部的“無意義碰撞”給精細搜索留更多空間。5.3 固定隨機種子與公平對比的必要性這個坑可能看起來不那么“算法”但它對調(diào)參決策的影響非常大。我有一次調(diào)整領頭羊擾動項系數(shù)第一次跑結(jié)果明顯變好第二次跑又變差來回三遍差點把有效參數(shù)改廢。后來才反應過來沒有固定隨機種子算法的隨機性把參數(shù)差異淹沒掉了。調(diào)參的正確姿勢是先rng(0)固定隨機序列再跑對比實驗選出候選最優(yōu)參數(shù)以后再換多個隨機種子去驗證這個參數(shù)組合在不同隨機情況下的穩(wěn)定性。如果某個參數(shù)只在特定種子下表現(xiàn)好那它大概率是個過擬合參數(shù)在真實問題上不可靠。下面是我建議的記錄表格式調(diào)參時手動維護一份比印象流可靠得多參數(shù)名取值多次運行均值多次運行標準差結(jié)論捕食者比例10%2.3e-31.8e-3穩(wěn)定捕食者比例30%8.9e-27.2e-2方差太大恢復系數(shù)1.51.9e-31.5e-3推薦恢復系數(shù)3.06.1e-24.3e-2不穩(wěn)定6. 從Benchmark走向工程SHO的擴展思路與實際建議測試函數(shù)跑得再好最終還是要回答一個問題SHO能用在真實的工程優(yōu)化問題上嗎我的答案是能但要從這幾個方面做改造。6.1 約束處理與離散問題的改造真實工程問題幾乎都有約束條件比如變量上限下限、線性不等式約束、非線性等式約束。SHO本身是自由搜索算法不天然支持約束。最常用的方式是罰函數(shù)法把約束違反量以懲罰項的形式加入目標函數(shù)讓不可行解的適應度變差算法就會自然避開不可行區(qū)域。比如目標函數(shù)f(x)有約束g_i(x) 0則改造為F(x) f(x) lambda * sum(max(0, g_i(x)))lambda是一個足夠大的罰因子。實際使用時lambda太小會讓算法常駐不可行區(qū)域lambda太大會讓目標函數(shù)曲面扭曲嚴重前期搜索困難。我習慣的做法是動態(tài)增大罰因子前期用小罰因子讓個體有更多機會探索邊界外側(cè)后期增大罰因子強制所有個體回到可行域內(nèi)。對于離散變量問題比如特征選擇里的0/1編碼可以在邊界處理后加一個四舍五入操作。需要提醒的是直接取整會讓搜索梯度信息變得粗糙這時建議把種群規(guī)模適當加大抵消離散化造成的多樣性損失。6.2 混合策略與改進方向SHO在標準問題上的表現(xiàn)已經(jīng)能打但要應對更復雜的工程場景我建議考慮下面幾個改進方向每個方向都不需要推翻原算法框架。第一與局部搜索算子混合。SHO的全局搜索能力強但后期精細搜索不夠“銳利”收斂精度有時比不上專門的局部搜索??梢栽诘┪裁咳舾纱鷮Ξ斍叭肿顑?yōu)個體做一次模式搜索法或Nelder-Mead單純形法局部精化。我實測這種方式在Sphere上能把收斂精度提升2~3個數(shù)量級。代價是增加局部搜索調(diào)用次數(shù)如果目標函數(shù)計算耗時就按需調(diào)用比如每20代精修一次。第二引入反向?qū)W習機制。初始化種群時除了隨機生成N個個體再生成它們的“反向解”從2N個候選里取適應度最好的N個作為初始種群。這個操作成本低、實現(xiàn)簡單卻能顯著提高初始種群的覆蓋率尤其在高維問題上收益明顯。第三自適應調(diào)整捕食者數(shù)量。前面提到捕食者比例對結(jié)果敏感但固定比例并不是最優(yōu)的。可以考慮讓捕食者數(shù)量隨迭代動態(tài)變化前期多一些提高探索后期少一些保證收斂。公式不必復雜線性遞減就夠用。我在Ackley函數(shù)上試過線性遞減策略比固定比例的表現(xiàn)穩(wěn)定得多?;旌喜呗缘拇a量不大但收益顯著。如果你是新入門建議先只管跑通原始版本把算法行為和機理摸清楚再做這些錦上添花的改造。6.3 什么時候該用SHO什么時候該換別的算法作為工程師務實的做法不是我執(zhí)迷哪個算法而是為問題選對工具。SHO在延續(xù)元啟發(fā)式算法共性的同時最強的場景是那些單峰背景下夾雜大量局部干擾的問題。它的捕食者壓力給搜索提供了持續(xù)跳坑的能力Rastrigin這類函數(shù)就是SHO最舒服的主場。但SHO不是萬能的。如果你的問題只有幾十個維度目標函數(shù)本身計算成本很低那么枚舉、網(wǎng)格搜索配合局部優(yōu)化反而更可靠如果你的問題明顯具有凸性梯度下降和牛頓法用更少的計算量就能得到更精確的結(jié)果如果你面對的是大規(guī)模高維問題SHO這類個體間交互多的算法計算開銷會明顯增大粒子群這類結(jié)構(gòu)更簡單的算法跑起來可能更劃算。我自己實際使用時的判斷流程是先做20個種子的小規(guī)模實驗對比SHO、PSO、DE三個算法的中位數(shù)精度和運行時間如果SHO沒有顯著優(yōu)勢就果斷換別的算法。算法崇拜沒有意義解決問題才是目標。綜合看下來自私羊群優(yōu)化算法是一個結(jié)構(gòu)有趣、實現(xiàn)門檻低、又有著明確行為學解釋的智能優(yōu)化方法。它不像那些純粹靠公式堆砌的算法每個算子都能在羊群和捕食者博弈圖景中找到對應這讓它非常容易理解和調(diào)試。如果你正在做單目標優(yōu)化相關的研究或工程項目不妨把SHO放進你的算法工具箱和PSO、DE做個交叉對比。把它跑通之后再回頭看開頭說的問題為什么還需要一個新算法答案已經(jīng)擺在收斂曲線上了。