現(xiàn)與參數(shù)整定實(shí)戰(zhàn)(含代碼))
簡(jiǎn)介本資源是一套完整的花授粉算法FPA及其改進(jìn)版本LFPA、IMFPA的MATLAB實(shí)現(xiàn)代碼包面向優(yōu)化算法初學(xué)者、智能計(jì)算方向研究生及工程實(shí)踐者用于理解與復(fù)現(xiàn)基于生物啟發(fā)的全局優(yōu)化方法適用于非線性、多模態(tài)函數(shù)極值求解、參數(shù)調(diào)優(yōu)等典型科研與工程問題。壓縮包共40個(gè)文件含18個(gè)核心.m函數(shù)如fpa.m、IMFPA.m、pso.m、bat_algorithm.m等、18個(gè).fig可視化結(jié)果圖直觀展示收斂曲線與搜索過程、4個(gè).mat數(shù)據(jù)文件含預(yù)設(shè)測(cè)試函數(shù)與實(shí)驗(yàn)記錄整體僅501KB輕量易部署。已有653人學(xué)習(xí)下載資源結(jié)構(gòu)清晰主算法模塊、邊界處理simplebounds.m、測(cè)試函數(shù)庫(kù)Fun.m、sanjiaohanshu.m、繪圖工具DrawFun.m、createfigure.m及對(duì)比基準(zhǔn)PSO、蝙蝠算法一應(yīng)俱全支持開箱即用、參數(shù)調(diào)試與性能橫向?qū)Ρ仁情_展畢業(yè)設(shè)計(jì)、算法課程實(shí)驗(yàn)或優(yōu)化問題實(shí)證研究的實(shí)用基礎(chǔ)材料。 寫這篇東西的起因是我在幫人調(diào)一組非線性參數(shù)辨識(shí)問題時(shí)發(fā)現(xiàn)手頭的粒子群、遺傳算法都容易陷進(jìn)局部最優(yōu)尤其是多峰目標(biāo)函數(shù)跑十次有八次結(jié)果不理想。后來翻到Xin-She Yang在2012年提出的花授粉算法Flower Pollination AlgorithmFPA代碼簡(jiǎn)單到讓人懷疑效果卻意外地穩(wěn)。如果你也在找一種實(shí)現(xiàn)成本低、參數(shù)少、全局搜索能力強(qiáng)的智能優(yōu)化算法并且習(xí)慣用MATLAB來驗(yàn)證想法那花授粉算法值得你花一個(gè)下午好好試試。這篇文章我會(huì)從算法機(jī)制、MATLAB代碼實(shí)現(xiàn)、參數(shù)整定、測(cè)試函數(shù)驗(yàn)證到工程適配把完整的實(shí)操鏈路拆開講清楚。每一段代碼都是可以直接跑的程度每個(gè)參數(shù)我都會(huì)解釋“為什么這么選”以及踩過的坑和排查思路。適合剛接觸智能優(yōu)化算法的研究生也適合想把手頭優(yōu)化問題快速驗(yàn)證一版方案的工程師。1. 花授粉算法的核心機(jī)制兩套授粉策略如何配合1.1 從花朵授粉到優(yōu)化搜索這個(gè)映射關(guān)系很優(yōu)雅自然界里花朵授粉主要分兩種方式。一種是異花授粉也就是花粉依靠風(fēng)、昆蟲等媒介傳播到遠(yuǎn)處另一朵花上這保證了種群基因的多樣性對(duì)應(yīng)到優(yōu)化算法里就是全局探索能力。另一種是自花授粉花粉在自己這朵花或者同一株植物的花之間傳播后代變化不大對(duì)應(yīng)到算法里就是局部開發(fā)能力負(fù)責(zé)在已有解附近精細(xì)搜索。花授粉算法的設(shè)計(jì)者把這兩套機(jī)制編碼進(jìn)了同一個(gè)迭代框架里。每次生成新解時(shí)算法會(huì)先拋一個(gè)隨機(jī)數(shù)跟轉(zhuǎn)換概率p做比較如果隨機(jī)數(shù)小于p走全局授粉路線利用Lévy飛行生成一個(gè)跳躍性很強(qiáng)的新解否則走局部授粉路線在當(dāng)前解的鄰域內(nèi)擾動(dòng)一下。這個(gè)“全局探索”和“局部開發(fā)”的切換邏輯是整套算法的靈魂。你可能會(huì)問這不就是常見的exploration和exploitation權(quán)衡嗎確實(shí)核心思想不新鮮但花授粉算法有兩個(gè)很實(shí)在的優(yōu)點(diǎn)。第一是參數(shù)極少完整算法只需要調(diào)整p、種群規(guī)模和迭代次數(shù)Lévy飛行的β參數(shù)也基本固定不像差分進(jìn)化或者粒子群那樣有一堆系數(shù)要調(diào)。第二是全局授粉的Lévy飛行步長(zhǎng)具有重尾分布特性偶爾會(huì)跳出很遠(yuǎn)的距離這讓算法在早期迭代中不容易被局部最優(yōu)點(diǎn)“粘住”在多峰問題上的表現(xiàn)甚至比一些變種粒子群還要好。1.2 Lévy飛行為什么是關(guān)鍵先生Lévy飛行是一種隨機(jī)游走模式步長(zhǎng)服從Lévy分布特點(diǎn)是大多數(shù)步長(zhǎng)很短但偶爾會(huì)出現(xiàn)一個(gè)特別長(zhǎng)的跳躍。自然界中很多鳥類和昆蟲的覓食路徑就符合這個(gè)規(guī)律比如信天翁在廣闊海面上搜索食物時(shí)會(huì)頻繁在小范圍內(nèi)轉(zhuǎn)圈然后突然長(zhǎng)距離飛到另一個(gè)區(qū)域。放到花授粉算法里這個(gè)“偶爾的長(zhǎng)跳”就是全局搜索的引擎。它讓當(dāng)前解有機(jī)會(huì)直接從一個(gè)吸引域跳到另一個(gè)吸引域從而跳出局部最優(yōu)。相比之下如果步長(zhǎng)嚴(yán)格服從高斯分布或均勻分布長(zhǎng)距離跳躍的概率極低算法本質(zhì)上就退化成一種局部的隨機(jī)爬坡效果會(huì)差很多。在MATLAB里生成Lévy飛行步長(zhǎng)最常用的是Mantegna提出的算法。它通過兩個(gè)服從正態(tài)分布的隨機(jī)變量u和v的組合來近似Lévy分布具體公式是step u ./ (|v|^(1/β))其中u服從均值為0、方差為σ2的正態(tài)分布v服從標(biāo)準(zhǔn)正態(tài)分布σ的計(jì)算公式為σ [ Γ(1β) * sin(πβ/2) / ( Γ((1β)/2) * β * 2^((β-1)/2) ) ]^(1/β)這里的β通常取1.5也是原論文和多數(shù)文獻(xiàn)的默認(rèn)值。實(shí)際寫代碼時(shí)你不需要深究這個(gè)式子的數(shù)學(xué)推導(dǎo)但要知道β越小步長(zhǎng)分布的重尾越明顯跳躍能力越強(qiáng)β越大步長(zhǎng)越接近正態(tài)分布跳躍能力越弱。我實(shí)測(cè)下來1.5是個(gè)很穩(wěn)的中間點(diǎn)除非你明確知道問題需要更強(qiáng)的探索或開發(fā)否則不建議動(dòng)它。1.3 局部授粉的擾動(dòng)邏輯為什么用兩個(gè)隨機(jī)個(gè)體做差局部授粉的更新公式很簡(jiǎn)單x_new x_i ε * (x_j - x_k)其中x_j和x_k是從種群中隨機(jī)挑出的兩個(gè)不同個(gè)體ε是[0,1]上的均勻隨機(jī)數(shù)。這個(gè)公式的本質(zhì)是在x_i的基礎(chǔ)上沿著x_j到x_k的方向做一個(gè)隨機(jī)幅度的偏移。因?yàn)閤_j和x_k本身是種群中的個(gè)體所以這個(gè)偏移天然落在當(dāng)前種群分布的“經(jīng)驗(yàn)區(qū)域”內(nèi)不會(huì)產(chǎn)生太離譜的新解。這里有個(gè)容易被忽略的細(xì)節(jié)被選的兩個(gè)個(gè)體x_j和x_k應(yīng)當(dāng)與x_i不同最好彼此也不同。如果j等于k差向量為零新解就等于舊解白白浪費(fèi)一次評(píng)估。我在初版代碼里就踩過這個(gè)坑后來加了個(gè)while循環(huán)保證j和k不相等。對(duì)于維數(shù)比較高的優(yōu)化問題這個(gè)細(xì)節(jié)對(duì)收斂速度有一定影響算是實(shí)現(xiàn)層面的小經(jīng)驗(yàn)。另外需要注意spite名字里帶“授粉”算法本身并不涉及花朵數(shù)量的真實(shí)繁殖約束比如花蜜量、傳粉距離等它只是從授粉現(xiàn)象提煉了兩種搜索策略。所以你在理解算法時(shí)不用把這個(gè)映射關(guān)系想得太復(fù)雜把它當(dāng)成一種“全局Lévy跳躍局部隨機(jī)差分”的混合搜索框架來對(duì)待反而更清晰。2. MATLAB代碼實(shí)現(xiàn)與逐行解讀2.1 主框架搭建初始化、主循環(huán)、結(jié)果記錄花授粉算法的MATLAB代碼非常緊湊核心迭代部分大概只有三十行。我先給一個(gè)完整的函數(shù)框架然后逐段解釋。function [best_fitness, best_solution, history] fpa(obj_func, dim, lb, ub, n, iter_max, p) % obj_func 目標(biāo)函數(shù)句柄輸入行向量輸出標(biāo)量適應(yīng)度求最小值 % dim 決策變量維度 % lb, ub 每個(gè)維度的下界和上界可以是標(biāo)量或向量 % n 種群規(guī)模 % iter_max 最大迭代次數(shù) % p 全局授粉概率一般取0.8 % history 記錄每輪全局最優(yōu)適應(yīng)度用于畫收斂曲線 % 1. 初始化種群 x lb (ub - lb) .* rand(n, dim); fitness zeros(n, 1); for i 1:n fitness(i) feval(obj_func, x(i, :)); end % 2. 找到初始全局最優(yōu) [best_fitness, best_idx] min(fitness); best_solution x(best_idx, :); history zeros(iter_max, 1); % 3. 主循環(huán) for iter 1:iter_max for i 1:n % 根據(jù)概率 p 決定走全局授粉還是局部授粉 if rand p % 3.1 全局授粉Lévy飛行 L levy_step(dim, 1.5); x_new x(i, :) L .* (best_solution - x(i, :)); else % 3.2 局部授粉隨機(jī)差分?jǐn)_動(dòng) j randi(n); k randi(n); while (j i) || (k i) || (j k) j randi(n); k randi(n); end eps_val rand; x_new x(i, :) eps_val .* (x(j, :) - x(k, :)); end % 4. 邊界處理 x_new min(max(x_new, lb), ub); % 5. 貪心選擇 new_fitness feval(obj_func, x_new); if new_fitness fitness(i) x(i, :) x_new; fitness(i) new_fitness; if new_fitness best_fitness best_fitness new_fitness; best_solution x_new; end end end history(iter) best_fitness; end end這個(gè)框架有幾個(gè)地方值得說明。初始化種群時(shí)我是用lb (ub - lb) .* rand(n, dim)生成均勻分布初始解保證覆蓋整個(gè)搜索空間。如果lb和ub是向量MATLAB會(huì)自動(dòng)做逐維廣播這段代碼對(duì)多維邊界也是適用的。主循環(huán)里對(duì)每個(gè)個(gè)體都執(zhí)行一次“生成新解邊界修正貪心選擇”注意這里的貪心選擇是只保留適應(yīng)度更優(yōu)的新解如果不優(yōu)就保持原解不動(dòng)這樣能保證種群質(zhì)量不會(huì)隨著迭代而退化。2.2 Lévy飛行子函數(shù)的實(shí)現(xiàn)細(xì)節(jié)Lévy飛行的實(shí)現(xiàn)是花授粉算法中唯一的“數(shù)學(xué)密集型”部分。我常用的子函數(shù)寫成了獨(dú)立的m文件方便在多個(gè)腳本里復(fù)用。function L levy_step(dim, beta) % 生成維度為 dim 的 Lévy 飛行步長(zhǎng)向量 % beta 通常在 [1, 2] 之間典型值 1.5 % 計(jì)算 sigma num_gamma gamma(1 beta) * sin(pi * beta / 2); den_gamma gamma((1 beta) / 2) * beta * 2^((beta - 1) / 2); sigma (num_gamma / den_gamma)^(1 / beta); % 生成 u 和 v u randn(1, dim) * sigma; v randn(1, dim); % 計(jì)算步長(zhǎng) step u ./ (abs(v).^(1 / beta)); L step; end這段代碼的每一行都有講究。gamma(1beta)*sin(pi*beta/2)是Lévy分布參數(shù)σ的分子部分分母gamma((1beta)/2)*beta*2^((beta-1)/2)是完整歸一化項(xiàng)兩者相除再開1/β次方得到的σ就是Mantegna算法中u分布的標(biāo)準(zhǔn)差。這里必須用randn(1, dim)生成與維度等長(zhǎng)的向量因?yàn)楹罄m(xù)要跟best_solution - x(i, :)做逐元素乘法。實(shí)際使用中你會(huì)注意到Lévy步長(zhǎng)偶爾會(huì)產(chǎn)生特別大的值比如正負(fù)幾百甚至上千。這在邊界范圍很大的問題時(shí)問題不大但在邊界范圍較窄比如[0,1]時(shí)會(huì)頻繁越界。所以邊界處理絕不能省。我的經(jīng)驗(yàn)是先用截?cái)喾╩in(max(x_new, lb), ub)把越界變量拉回邊界效果穩(wěn)定如果發(fā)現(xiàn)算法因?yàn)轭l繁截?cái)喽ヌ剿餍钥梢愿某煞瓷浞ɑ蛘咧匦码S機(jī)初始化這個(gè)我在第4節(jié)會(huì)展開講。2.3 從測(cè)試函數(shù)出發(fā)驗(yàn)證代碼正確性代碼寫完后第一步不是急著應(yīng)用到工程問題上而是先在標(biāo)準(zhǔn)測(cè)試函數(shù)上驗(yàn)證實(shí)現(xiàn)是否正確。最常用的是Sphere函數(shù)求極小值function f sphere(x) f sum(x.^2); endSphere函數(shù)是一個(gè)單峰凸函數(shù)全局最小值在原點(diǎn)處取0。如果算法在Sphere上都不能收斂到接近0的數(shù)說明實(shí)現(xiàn)有問題。之后再用Rastrigin函數(shù)做多峰測(cè)試function f rastrigin(x) dim length(x); f sum(x.^2 - 10 * cos(2 * pi * x)) 10 * dim; endRastrigin在搜索空間里布滿了大量局部極小點(diǎn)全局最小值同樣是0但只在所有分量為整數(shù)0時(shí)取到。如果花授粉算法在這個(gè)函數(shù)上能穩(wěn)定收斂到0附近就說明全局搜索和局部開發(fā)機(jī)制都工作正常。跑測(cè)試時(shí)的推薦配置是n30iter_max500~1000p0.8dim10或者30。調(diào)用方式很簡(jiǎn)單“[best_f, best_x, history] fpa((x) rastrigin(x), 10, -5.12, 5.12, 30, 500, 0.8); semilogy(history);用semilogy畫收斂曲線時(shí)你通常會(huì)看到一條階梯狀下降的曲線——前期快速下降后期緩慢逼近最優(yōu)。如果曲線早早變成水平線且離最優(yōu)值還很遠(yuǎn)就要懷疑是否陷入了局部最優(yōu)這是后續(xù)調(diào)參和排查的重點(diǎn)。3. 參數(shù)整定與多場(chǎng)景適配3.1 轉(zhuǎn)換概率p的調(diào)法不要迷信0.8轉(zhuǎn)換概率p是控制全局授粉與局部授粉占比的唯一旋鈕。原論文中給出的推薦值是0.8意味著種群中約80%的個(gè)體在每輪迭代中走全局授粉20%走局部授粉。這個(gè)設(shè)置在通用問題上是合理的因?yàn)槿炙阉鞒杀镜颓腋采w范圍大而局部開發(fā)主要靠貪心選擇和后續(xù)迭代的個(gè)體間差分來逐步細(xì)化。但我在實(shí)際使用中發(fā)現(xiàn)p的“最優(yōu)區(qū)間”跟問題的地理形狀強(qiáng)相關(guān)。Sphere這種單峰函數(shù)0.8甚至0.9都能快速收斂但Rastrigin這種周期多峰函數(shù)p如果太高后期的微調(diào)能力不足收斂曲線會(huì)在某個(gè)精度附近震蕩。反過來p太低比如0.2全局探索不足種群容易被一個(gè)局部最優(yōu)吸引住。我自己的經(jīng)驗(yàn)是先用p0.8跑一組基準(zhǔn)測(cè)試觀察收斂曲線的末端斜率。如果末端明顯走平且最優(yōu)值不理想試著把p降到0.6~0.7通常能改善后期精度如果早中期收斂太慢則嘗試升到0.85。這個(gè)參數(shù)不需要做網(wǎng)格搜索因?yàn)樗拿舾行圆桓哒{(diào)到“大致合適”的范圍內(nèi)差別不大。真正影響結(jié)果穩(wěn)定性的往往是隨機(jī)種子的選擇和種群規(guī)模而不是p的小幅浮動(dòng)。3.2 種群規(guī)模與迭代次數(shù)先定迭代再定種群種群規(guī)模n和最大迭代次數(shù)iter_max共同決定了目標(biāo)函數(shù)的總評(píng)估次數(shù)約等于n×iter_max。在算力有限的前提下我的建議是先根據(jù)問題復(fù)雜度確定一個(gè)可接受的評(píng)估預(yù)算再分配種群規(guī)模和迭代次數(shù)。一般經(jīng)驗(yàn)是10~30維的連續(xù)優(yōu)化問題n取20~50就夠了。n太小比如5~10會(huì)導(dǎo)致種群多樣性不足容易早熟n太大比如200以上對(duì)結(jié)果提升不明顯但計(jì)算時(shí)間線性增長(zhǎng)。迭代次數(shù)方面我通常先設(shè)一個(gè)較大的值比如2000然后觀察收斂曲線在什么時(shí)候開始走平。如果1000代之后曲線基本沒有下降說明后面1000代是浪費(fèi)的可以把iter_max調(diào)到1000左右節(jié)省一半算力。這里給一組參考配置適合在普通筆記本上快速測(cè)試問題維度種群規(guī)模n迭代次數(shù)iter_max總評(píng)估次數(shù)2~5維20200~5004000~1000010維30500~100015000~3000030維40~501000~200040000~10000050維以上50~802000~5000100000~400000這個(gè)表格不是死規(guī)矩而是讓你心里有個(gè)量級(jí)概念。很多論文里的基準(zhǔn)測(cè)試用的評(píng)估次數(shù)是幾萬到幾十萬你可以根據(jù)自己的算力靈活縮放。3.3 三種工程改造思路約束處理、混合策略、離散化實(shí)際工程優(yōu)化問題很少是純無約束的連續(xù)問題常見需求有三種改造方向。第一是約束處理。最粗暴也最常用的方法是罰函數(shù)法在目標(biāo)函數(shù)里加一個(gè)對(duì)約束違例的懲罰項(xiàng)。例如某變量必須大于某個(gè)閾值違例時(shí)罰款一個(gè)足夠大的常數(shù)這樣不滿足約束的解適應(yīng)度會(huì)很差算法自然會(huì)淘汰它。另一種方法是可行解優(yōu)先策略比較兩個(gè)解時(shí)如果一個(gè)可行一個(gè)不可行優(yōu)先選可行解如果都不可行比較違例量大小。后者在可行域特別窄的問題上表現(xiàn)更好。第二是混合策略?;ㄊ诜鬯惴ǖ木植块_發(fā)能力和粒子群相比略弱遇到需要高精度收斂的問題時(shí)可以跟序列二次規(guī)劃SQP做混合先用FPA跑幾百代找到一個(gè)較好區(qū)域然后用fmincon從最優(yōu)點(diǎn)出發(fā)做局部精調(diào)。我在做非線性參數(shù)辨識(shí)時(shí)就常用這個(gè)組合效果比單獨(dú)用FPA好很多精度能提升幾個(gè)數(shù)量級(jí)。第三是離散化。如果決策變量是整數(shù)或組合變量比如設(shè)備選型、整數(shù)規(guī)劃可以在生成新解后做round取整或者用編碼映射的方式把連續(xù)值映射到離散集合上。雖然這會(huì)損失一些搜索連貫性但花授粉算法本身對(duì)目標(biāo)函數(shù)的連續(xù)性要求不高只要你能給出一個(gè)可比較的適應(yīng)度函數(shù)就能跑。4. 常見問題與排查技巧實(shí)錄4.1 收斂太慢或者陷入局部最優(yōu)從三個(gè)角度觀察這是跑群智能算法最常遇到的問題。我第一次用FPA跑Ackley函數(shù)的時(shí)候連續(xù)五次都收斂到一個(gè)偏離全局最優(yōu)點(diǎn)很遠(yuǎn)的位置當(dāng)時(shí)第一反應(yīng)是代碼寫錯(cuò)了反復(fù)查了兩天才發(fā)現(xiàn)不是代碼問題而是參數(shù)和隨機(jī)性問題。排查時(shí)我習(xí)慣從三個(gè)角度看。第一畫種群種子的初始分布圖確認(rèn)初始解確實(shí)覆蓋了整個(gè)搜索空間如果初始種群全都聚集在某個(gè)角落后面再怎么迭代也救不回來。第二打印每一輪的全局最優(yōu)值變化如果前50代幾乎沒下降說明全局搜索能力不足試著增大p或者調(diào)小Lévy飛行的β。第三如果前幾百代下降很好但后期紋絲不動(dòng)說明陷入了局部最優(yōu)這時(shí)應(yīng)該考慮增加種群多樣性比如在迭代中后期按一定概率對(duì)部分個(gè)體重新隨機(jī)初始化。另外隨機(jī)種子對(duì)結(jié)果影響很大。同一個(gè)參數(shù)配置換一個(gè)rng種子可能結(jié)果就不同。所以驗(yàn)證算法性能時(shí)一定要做多次獨(dú)立重復(fù)試驗(yàn)統(tǒng)計(jì)均值、標(biāo)準(zhǔn)差和中位數(shù)不要只跑一次看結(jié)果。我一般跑至少20次取統(tǒng)計(jì)指標(biāo)來評(píng)價(jià)。4.2 越界處理截?cái)?、反射還是重置越界處理直接影響算法在高維問題上的表現(xiàn)。截?cái)喾ㄊ亲钊菀讓?shí)現(xiàn)的對(duì)新解逐維做min(max(..., lb), ub)。問題是當(dāng)Lévy步長(zhǎng)特別大時(shí)大量個(gè)體會(huì)被截?cái)嗟竭吔缟蠈?dǎo)致邊界附近個(gè)體堆積損失多樣性。反射法的思路是如果x_new(i)小于lb(i)就用2*lb(i)-x_new(i)把它反射回搜索空間同理處理上界。這個(gè)方法更溫和能保持種群在邊界附近的多樣性。重置法最簡(jiǎn)單粗暴越界后直接重新在[lb,ub]內(nèi)隨機(jī)生成一個(gè)新值適合探索性要求高的場(chǎng)景。我個(gè)人的建議是邊界范圍較大比如[-100,100]時(shí)直接用截?cái)喾ê?jiǎn)單高效邊界范圍較窄比如[0,1]時(shí)用反射法或者概率性的“截?cái)嘀刂谩苯M合更穩(wěn)。在代碼里實(shí)現(xiàn)這個(gè)問題不大但要在評(píng)測(cè)時(shí)留意最優(yōu)解如果落在邊界附近截?cái)喾ㄍ軒椭惴ǜ煺业竭吔缱顑?yōu)。4.3 高維問題下的性能退化該怎么應(yīng)對(duì)花授粉算法在維度升高后和大多數(shù)元啟發(fā)式算法一樣會(huì)面臨性能退化。原因是維度升高后搜索空間呈指數(shù)增長(zhǎng)Levy飛行在這個(gè)高維空間里靠稀疏的采樣很難有效覆蓋。這不是FPA獨(dú)有的問題粒子群、差分進(jìn)化也同樣存在。應(yīng)對(duì)辦法主要有兩條路。一條是降維如果原問題存在相關(guān)性較強(qiáng)的變量先用主成分分析或者因子分析做降維再在低維空間用FPA優(yōu)化。另一條是分而治之把高維問題按變量分組每組分別做優(yōu)化例如協(xié)同進(jìn)化框架子種群各自優(yōu)化一部分維度再組合起來評(píng)估適應(yīng)度。這條路徑實(shí)現(xiàn)成本較高但效果立竿見影。另外在高維場(chǎng)景下要特別關(guān)注p參數(shù)的調(diào)整。維度升高后局部授粉產(chǎn)生的新解兩個(gè)隨機(jī)個(gè)體之差在維度很高時(shí)長(zhǎng)向量很大擾動(dòng)幅度很大可能破壞已經(jīng)找到的好解。這時(shí)適當(dāng)增大p、減少局部授粉比例有助于維持穩(wěn)定收斂。我自己的經(jīng)驗(yàn)是30維以上的問題p取0.85~0.9比0.8更好。4.4 把這個(gè)算法用到實(shí)際問題的最后建議如果你現(xiàn)在就想把花授粉算法用到自己的研究或項(xiàng)目里我的建議是拿一個(gè)你已經(jīng)用粒子群或者遺傳算法跑過的問題來對(duì)比。先在你熟悉的問題上實(shí)現(xiàn)FPA用同樣的評(píng)估次數(shù)跑一遍比較收斂精度和穩(wěn)定性。通常你會(huì)發(fā)現(xiàn)FPA在早期迭代的收斂速度比粒子群快但后期精度略遜在Rastrigin這類多峰問題上FPA的中位數(shù)表現(xiàn)往往比標(biāo)準(zhǔn)粒子群更好。這個(gè)對(duì)比過程會(huì)幫你建立對(duì)這個(gè)算法的直覺知道在什么場(chǎng)景下用它最順手。從代碼維護(hù)的角度建議把fpa函數(shù)封裝成獨(dú)立的工具箱函數(shù)目標(biāo)函數(shù)用函數(shù)句柄傳入這樣換測(cè)試函數(shù)時(shí)完全不用改主程序。也可以把每次重復(fù)試驗(yàn)的最佳適應(yīng)度存到矩陣?yán)镒詈笥孟渚€圖直觀比較算法穩(wěn)定性。這些小的工程習(xí)慣能讓你后面寫論文或者做技術(shù)報(bào)告時(shí)省很多事。本文還有配套的精品資源點(diǎn)擊獲取