您好,登錄后才能下訂單哦!
這篇文章主要介紹“Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法”文章能幫助大家解決問(wèn)題。
根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機(jī)制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生;但是該方法卻沒(méi)有提及如何確定黑洞邊界和如何處理吸收星體的問(wèn)題. Hatamlou BH算法進(jìn)行了完善,讓其更加接近于黑洞的自然現(xiàn)狀,使其具有黑洞現(xiàn)象的一般特質(zhì).該方法不但沿襲了原BH算法的一切特性,同時(shí)還解決了原BH 算法的黑洞邊界問(wèn)題和吸收多余星點(diǎn)的問(wèn)題.
BH 算法的思想較為完整地描述了自然界中黑洞現(xiàn)象的一般特性;以BH 算法具有的這些特性為基礎(chǔ),BH算法的尋優(yōu)搜索原理比較簡(jiǎn)單,易于實(shí)現(xiàn).BH算法主要是模擬實(shí)際黑洞現(xiàn)象,在一定搜索空間內(nèi)隨機(jī)布置一定數(shù)量的星體,并通過(guò)統(tǒng)計(jì)學(xué)手段確定和評(píng)估搜索空間內(nèi)每一個(gè)星體的適應(yīng)度函數(shù),選出一個(gè)具有最佳適應(yīng)度值的星體作為黑洞.這個(gè)黑洞邊界(以R為半徑)被視為當(dāng)前全局最優(yōu)解所在區(qū)域,而黑洞本身被視為當(dāng)前全局最優(yōu)解;BH 算法中的黑洞具有與自然界黑洞同樣的強(qiáng)吸引能力,在搜索域內(nèi)所有其他星體都將向其靠攏且無(wú)法逃逸.星體被黑洞吸引并向黑洞靠攏的公式如下:
式中:xi(t)和xi+1(t+1)分別代表第i個(gè)星體在t和 t+1次迭代時(shí)的位置;rand表示0,1]之間的隨機(jī)數(shù);Am是搜索空間內(nèi)的黑洞位置;N是星體的數(shù)量.
在更替迭代過(guò)程中黑洞將進(jìn)入其邊界以內(nèi)的星體一一吸收.每當(dāng)一個(gè)星體被吸收的同時(shí),在搜索空間內(nèi)隨機(jī)產(chǎn)生一個(gè)新的星體﹐星體的總數(shù)保持不變.黑洞邊界范圍計(jì)算公式如下:
式中:fBH是黑洞的適應(yīng)度函數(shù)值;fi是第i個(gè)星體的適應(yīng)度函數(shù)值.
在被黑洞吸引的過(guò)程中,如果有一個(gè)星體i的適應(yīng)度函數(shù)值fi優(yōu)于黑洞的適應(yīng)度函數(shù)值fBH則說(shuō)明該黑洞所處位置并非最優(yōu),需要黑洞和星體互換位置.然后算法將以新生成的黑洞為中心繼續(xù)運(yùn)行下去,其他星體將通過(guò)位置更替公式(1)重新涌向新的黑洞位置,并被其吸收.
根據(jù)上述分析,得出黑洞算法的實(shí)現(xiàn)步驟:
步驟1初始化參數(shù),在搜索空間內(nèi)隨機(jī)選取一定數(shù)量星體;
步驟2計(jì)算每個(gè)星體的適應(yīng)度函數(shù)值;
步驟3選擇一個(gè)具有最佳適應(yīng)度值的星體作為黑洞;
步驟4根據(jù)式(1)更改每個(gè)星體的位置;
步驟5如果星體最優(yōu)適應(yīng)度函數(shù)值優(yōu)于黑洞的適應(yīng)度函數(shù)值,則交換二者位置;
步驟6 如果一個(gè)星體在黑洞的邊界范圍內(nèi),那么這個(gè)星體將被吸收﹐黑洞的邊界半徑由式(2)計(jì)算,同時(shí),在搜索空間內(nèi)隨機(jī)產(chǎn)生一個(gè)新的星體;
步驟7當(dāng)系統(tǒng)達(dá)到最大迭代次數(shù),或者出現(xiàn)一個(gè)最好的適應(yīng)度值時(shí),程序停止運(yùn)行,否則返回步驟4.
clear all clc close all %% 初始化參數(shù) d=5; % 維度 options.lk=-32*ones(1,d); % 下限 options.uk=32*ones(1,d); % 上限 options.m=50; % 種群數(shù)量 options.MAXITER=500; % 最大迭代次數(shù) options.n=length(options.uk); % 問(wèn)題的維度。 options.ObjFunction=@Ackley; % 調(diào)用目標(biāo)函數(shù) options.Display_Flag=1; % 在迭代中顯示結(jié)果的標(biāo)志 options.run_parallel_index=0; options.run=10; if options.run_parallel_index stream = RandStream('mrg32k3a'); parfor index=1:options.run set(stream,'Substream',index); RandStream.setGlobalStream(stream) [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options); bestX_M(index,:)=bestX; Fbest_M(index)=bestFitness; fbest_evolution_M(index,:)=bestFitnessEvolution; end else rng('default') for index=1:options.run [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options); bestX_M(index,:)=bestX; Fbest_M(index)=bestFitness; fbest_evolution_M(index,:)=bestFitnessEvolution; end end %% 可視化 [a,b]=min(Fbest_M); figure plot(1:options.MAXITER,fbest_evolution_M(b,:)) xlabel('迭代次數(shù)') ylabel('適應(yīng)度值') fprintf(' MIN=%g MEAN=%g MEDIAN=%g MAX=%g SD=%g \n',... min(Fbest_M),mean(Fbest_M),median(Fbest_M),max(Fbest_M),std(Fbest_M))
function [F, lb, ub, FGO] = Ackley(x) %% 目標(biāo)函數(shù)值 if (nargin==0) F=[]; d=2; % 維度 lb=-32*ones(1,d); % 下限 ub=32*ones(1,d); % 上限 FGO=0; % 總體最優(yōu)值 else n=size(x,2); for ix=1:size(x,1) x0=x(ix,:); F(ix) = -20*exp(-0.2*sqrt(1/n*sum(x0.^2)))-... exp(1/n*sum(cos(2*pi*x0)))+20+exp(1); end end
function [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options) %-------------------------------------------------------------------------- % 黑洞優(yōu)化算法 %-------------------------------------------------------------------------- % 在搜索空間中初始化具有隨機(jī)位置的恒星群。 % 開(kāi)始。 % 對(duì)于每一顆星,評(píng)估目標(biāo)函數(shù)。 % 選擇具有最佳適應(yīng)值的最佳恒星作為黑洞。 % 根據(jù)公式更改每顆恒星的位置。 % 如果一顆恒星到達(dá)一個(gè)比黑洞成本更低的位置,交換它們的位置。 % 如果一顆恒星穿過(guò)黑洞的視界,在搜索空間中的隨機(jī)位置用一顆新恒星替換它。 % 如果滿足終止標(biāo)準(zhǔn)(最大迭代次數(shù)或足夠好的適應(yīng)度),則退出循環(huán)。 % 結(jié)束循環(huán) %-------------------------------------------------------------------------- ObjFunction=options.ObjFunction; % 目標(biāo)函數(shù)的命名 n=options.n; % 該問(wèn)題的維度 uk=options.uk; % 在第k維上界。 lk=options.lk; % 在第k的下界。 m=options.m; % m:樣本點(diǎn)數(shù) MAXITER=options.MAXITER; % 最大迭代次數(shù) nEval=0; [x,xBH,iBH,ObjFunctionValue]=Initialize(options); nEval=nEval+size(x,1); for iteration =1:MAXITER %% 根據(jù)公式改變每顆星的位置。 for i = 1 : m if i ~= iBH landa=rand; for k = 1 : n if landa<0.5 x(i,k)=x(i,k) + rand*(xBH(k)- x(i,k)); else x(i,k)=x(i,k) + rand*(xBH(k)- x(i,k)); end end end end %% 如果恒星到達(dá)一個(gè)比黑洞成本低的位置,交換它們的位置 ObjFunctionValue=feval(ObjFunction,x); nEval=nEval+size(x,1); %如果一顆恒星越過(guò)黑洞的事件視界,則在搜索空間中隨機(jī)位置用一顆新恒星代替 R=ObjFunctionValue(iBH)/sum(ObjFunctionValue); % R=exp(-n*ObjFunctionValue(iBH)/sum(ObjFunctionValue)) for i = 1 : m Distance(i)=norm(xBH- x(i,:)); end [x,ObjFunctionValue]=NewStarGeneration(x,Distance,R,options,iBH,ObjFunctionValue); [x]=bound(x,lk,uk); [xBH,iBH]=argmin(x,ObjFunctionValue,options); %-------------------------------------------------------------------------------- bestFitnessEvolution(iteration)=ObjFunctionValue(iBH); %-------------------------------------------------------------------------------- if options.Display_Flag==1 fprintf('迭代次數(shù)N為 %g 最優(yōu)適應(yīng)度為 %g\n',iteration,ObjFunctionValue(iBH)) end end bestX=xBH; bestFitness=ObjFunctionValue(iBH); end function [x,xBH,iBH,ObjFunctionValue]=Initialize(options) ObjFunction=options.ObjFunction; % the name of the objective function. n=options.n; % n: dimension of the problem. uk=options.uk; % up: upper bound in the kth dimension. lk=options.lk; % lp: lower bound in the kth dimension. m=options.m; % m: number of sample points for i = 1 : m for k = 1 : n landa=rand; x(i,k) = lk(k) + landa*(uk(k) - lk(k)); end end % x(end+1,:)=x0; ObjFunctionValue=feval(ObjFunction,x); [index1,index2]=sort(ObjFunctionValue); x=x(index2(1:m),:); xBH=x(1,:); iBH=1; ObjFunctionValue=ObjFunctionValue(index2(1:m)); end function [xb,ib,xw,iw]=argmin(x,f,options) [minf,ib]=min(f); xb=x(ib,:); [maxf,iw]=max(f); xw=x(iw,:); end function [x,ObjFunctionValue]=NewStarGeneration(x,Distance,R,options,iBH,ObjFunctionValue) ObjFunction=options.ObjFunction; n=options.n; uk=options.uk; lk=options.lk; index=find(Distance<R); for i=1:length(index) if index(i) ~= iBH for k = 1 : n x(i,k) = lk(k) + rand*(uk(k) - lk(k)); end ObjFunctionValue(i)=feval(ObjFunction,x(i,:)); end end end function [x]=bound(x,l,u) for j = 1:size(x,1) for k = 1:size(x,2) % 如果上限越界 if x(j,k) > u(k), x(j,k) = u(k); end % 如果下限越界 if x(j,k) < l(k), x(j,k) = l(k); end end end end
關(guān)于“Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。