基于布谷鸟搜索算法的函数寻优算法
文章目錄
- 一、理論基礎
- 1、算法原理
- 2、算法流程圖
- 二、Matlab代碼
- 三、參考文獻
一、理論基礎
1、算法原理
布谷鳥采用一種特殊的寄生宿主巢穴的方式孕育繁殖,它將孵育的蛋置入寄生宿主的巢穴,讓寄生宿主孵化布谷鳥蛋。由于布谷鳥幼雛能發出比寄生宿主幼雛更閃亮的叫聲,因此獲得更多的食物,具有更高的存活率。在某些情形下,寄生宿主發現巢穴內不是宿主幼雛,則會遺棄該巢穴,并重新選擇新的巢穴孵育繁殖。Yang X. S.和Deb等人基于上述孵育寄生機理,提出布谷鳥搜索算法。它遵循以下3個理想規則。
規則1. 每只布谷鳥1次有且僅有孵化1個蛋,并隨機選擇1個寄生宿主巢穴存放。
規則2. 在隨機選擇的1個寄生宿主巢穴中,最優的寄生宿主巢穴將被保留至下一代。
規則3. 可利用的寄生宿主巢穴數量是固定的,1個寄生宿主巢穴的宿主發現寄生布谷鳥蛋的概率為PaP_aPa?。
基于上述3個理想規則,可以得到1個宿主巢穴代表1個候選解。因此,布谷鳥算法的基本算法流程包含3部分:首先,在當前候選解的基礎上,以Levy飛行隨機游動生成新的候選解,評價并保留較好的候選解;其次,按照發現概率PaP_aPa?舍棄部分候選解;最后,按照偏好隨機游動方式產生新的候選解并替代舍棄的解,保留較好解后進入下一次進化,直至滿足算法的收斂條件。
設布谷鳥算法進化至第rrr代時第mmm個候選解為Xr,m\boldsymbol{X}_{r,m}Xr,m?,Xr,m=(xr,m(1),xr,m(2),?,xr,m(j),?,xr,m(D)),j∈[1,D]\boldsymbol{X}_{r,m}=(x_{r,m}^{(1)},x_{r,m}^{(2)},\cdots,x_{r,m}^{(j)},\cdots,x_{r,m}^{(D)}),j\in[1,D]Xr,m?=(xr,m(1)?,xr,m(2)?,?,xr,m(j)?,?,xr,m(D)?),j∈[1,D]。采用Levy飛行隨機游動產生新的個體(候選解)Xr+1,m\boldsymbol{X}_{r+1,m}Xr+1,m?更新的表達式為Xr+1,m=Xr,m+(Xr,m?Xr,gb)?(γ0⊕L(β))(1)\boldsymbol{X}_{r+1,m}=\boldsymbol{X}_{r,m}+(\boldsymbol{X}_{r,m}-\boldsymbol{X}_{r,gb})\cdot(\gamma_0\oplus L(\beta))\tag{1}Xr+1,m?=Xr,m?+(Xr,m??Xr,gb?)?(γ0?⊕L(β))(1)其中,Xr,gb\boldsymbol{X}_{r,gb}Xr,gb?為當前搜索到的全局最優解,L(β)L(\beta)L(β)表示Levy飛行隨機游動的路徑,γ0\gamma_0γ0?表示初始搜索步長,⊕\oplus⊕表示點對點乘法,ttt為飛行時間:L(β)~?=t?1?β,0<β≤2(2)L(\beta)\sim\vartheta=t^{-1-\beta},0<\beta≤2\tag{2}L(β)~?=t?1?β,0<β≤2(2)通過數學代換,式(2)等價于:L(β)~?∣ν∣1/β(Γ(1+β)sin(π?β/2)Γ(1+β2)?β?2(β?1)/2)1/β(3)L(\beta)\sim\frac{\vartheta}{|\nu|^{1/\beta}}\left(\frac{\Gamma(1+\beta)sin(\pi\cdot\beta/2)}{\Gamma\left(\frac{1+\beta}{2}\right)\cdot\beta\cdot2^{(\beta-1)/2}}\right)^{1/\beta}\tag{3}L(β)~∣ν∣1/β?????Γ(21+β?)?β?2(β?1)/2Γ(1+β)sin(π?β/2)????1/β(3)其中,Γ(?)\Gamma(\cdot)Γ(?)為伽馬函數,取β=1.5\beta=1.5β=1.5;?,ν\vartheta,\nu?,ν為標準高斯分布隨機數。
在偏好隨機游動方式中,按照發現概率PaP_aPa?舍棄部分候選解后,生成相同數量的新解:Xr+1,m=Xr,m+??(Xr,k?Xr,s)(4)\boldsymbol{X}_{r+1,m}=\boldsymbol X_{r,m}+\phi\cdot(\boldsymbol X_{r,k}-\boldsymbol X_{r,s})\tag{4}Xr+1,m?=Xr,m?+??(Xr,k??Xr,s?)(4)其中,?\phi?為算法的控制縮放系數,滿足?∈U(0,1)\phi\in U(0,1)?∈U(0,1);Xr,k\boldsymbol X_{r,k}Xr,k?和Xr,s\boldsymbol X_{r,s}Xr,s?分別為第rrr代時第kkk個和第sss個隨機候選解。
2、算法流程圖
根據以上分析,布谷鳥搜索算法流程圖如圖1所示。
二、Matlab代碼
以Sphere函數為目標函數,種群規模N=30N=30N=30,發現概率Pa=0.25P_a=0.25Pa?=0.25,維數dim=30dim=30dim=30,上下限為[?100,100][-100,100][?100,100],最大迭代次數Max_iter=1000Max\_iter=1000Max_iter=1000。完整程序如下:
%% 清除環境變量 clear; clc;%% CS參數 % 種群規模(鳥巢數量) N = 30; % 發現概率 pa = 0.25;Max_iter = 1000; % 最大迭代次數 % 邊界 dim = 30; % 維數 Lb = -100*ones(1, dim); % 下限 Ub = 100*ones(1, dim); % 上限% 隨機初始化種群位置 for i = 1:Nnest(i, :) = Lb+(Ub-Lb).*rand(1, dim); end % 初始最優解 fitness = 10^10*ones(N, 1); [fmin, bestnest, nest, fitness] = get_best_nest(nest, nest, fitness);% N_iter = 0; %% 迭代尋優 for iter = 1:Max_iter%% 通過萊維飛行得到新個體beta = 3/2;sigma = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);for i = 1:Ns = nest(i, :);% 用蒙特卡洛方法模擬萊維飛行u = randn(size(s))*sigma;v = randn(size(s));step = u./abs(v).^(1/beta);stepsize = 0.01*step.*(s-bestnest);s=s+stepsize.*randn(size(s));% 邊界處理new_nest(i, :) = simplebounds(s, Lb, Ub);end% 新個體和舊個體適應度值貪婪比較,選取最優個體[fnew, best, nest, fitness] = get_best_nest(nest, new_nest, fitness);% % 更新計數器% N_iter = N_iter+N;% 發現和隨機化new_nest = empty_nests(nest, Lb, Ub, pa) ;% 新個體和舊個體適應度值貪婪比較,選取最優個體[fnew, best, nest, fitness] = get_best_nest(nest, new_nest, fitness);% % 再次更新計數器% N_iter = N_iter+N;% 更新全局最優解if fnew < fminfmin = fnew;bestnest = best;end%% 記錄每代最優解Curve(iter) = fmin;%% 顯示每代優化結果display(['CS:At iteration ', num2str(iter), ' the best fitness is ', num2str(fmin)]); end%% Display all the nests % disp(strcat('Total number of iterations=', num2str(N_iter))); %% 最終結果顯示 disp(['最終位置:' , num2str(bestnest)]); disp(['最終函數值:', num2str(Curve(end))]); %% 繪圖 figure; plot(Curve, 'r', 'lineWidth', 2); % 畫出迭代圖 xlabel('迭代次數', 'fontsize', 12); ylabel('目標函數值', 'fontsize', 12);%% ---------------下面列出了所有子函數------------------ %% 發現最優位置 function [fmin, best, nest, fitness] = get_best_nest(nest, newnest, fitness) for j = 1:size(nest,1)fnew = fobj(newnest(j,:));if fnew <= fitness(j)fitness(j) = fnew;nest(j, :) = newnest(j, :);end end % Find the current best [fmin, K] = min(fitness) ; best = nest(K, :); end %% 通過構造新的個體來替代某些個體 function new_nest = empty_nests(nest, Lb, Ub, pa) % 一小部分更糟的巢穴被發現的概率為pa n = size(nest, 1); % 發現與否——一個狀態向量 K = rand(size(nest)) > pa;% 有偏/選擇隨機游動的新解 stepsize = rand*(nest(randperm(n), :)-nest(randperm(n), :)); new_nest = nest+stepsize.*K; for j = 1:size(new_nest, 1)s = new_nest(j, :);new_nest(j, :) = simplebounds(s, Lb, Ub); end end%% 邊界處理 function s = simplebounds(s,Lb,Ub) % Apply the lower bound ns_tmp = s; I = ns_tmp<Lb; ns_tmp(I) = Lb(I);% Apply the upper bounds J = ns_tmp>Ub; ns_tmp(J) = Ub(J); % Update this new move s = ns_tmp; end%% 目標函數 function z = fobj(u) z=sum(u.^2); end最終位置和最優目標函數值為:
最終位置:0.021557 0.013997 -0.0038913 -0.013907 -0.0087341 -0.0013441 -0.0057873 -0.00091699 -0.00034563 -0.0085162 0.0015167 -0.018136 -0.0040665 -0.023025 -0.0067345 -0.0085958 0.0082373 -0.02232 0.0056112 -0.0089819 -0.0025091 0.013316 0.00094574 -0.00045218 0.012714 -0.011097 0.012178 0.012474 0.010687 -0.0091615 最終函數值:0.0037011進化曲線如圖2所示。
三、參考文獻
[1] Yang X S, Deb S. Engineering Optimisation by Cuckoo Search[J]. International Journal of Mathematical Modelling & Numerical Optimisation, 2010, 1(4): 330-343.
[2] 劉曉東, 孫麗君, 陳天飛. 布谷鳥算法的收斂性分析及性能比較[J]. 計算機科學與探索, 2020, 14(10): 1644-1655.
[3] 傅文淵. 具有萬有引力加速機理的布谷鳥搜索算法[J]. 軟件學報, 2021, 32(5): 1480-1494.
總結
以上是生活随笔為你收集整理的基于布谷鸟搜索算法的函数寻优算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机汉字五笔输入法,《计算机汉字输入五
- 下一篇: 游戏封包模拟器_问道模拟器人物移动封包分