溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法

發(fā)布時(shí)間:2022-06-14 09:47:03 來(lái)源:億速云 閱讀:126 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“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)題。

    1.概述

    1.1黑洞算法

    根據(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)題.

    1.2黑洞搜索優(yōu)化算法

    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ú)法逃逸.星體被黑洞吸引并向黑洞靠攏的公式如下:

    Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法

    式中: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ì)算公式如下:

    Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法

    式中: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)重新涌向新的黑洞位置,并被其吸收.

    1.3黑洞搜索算法的實(shí)現(xiàn)過(guò)程

    根據(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.

    2.Matlab代碼實(shí)現(xiàn)

    2.1主函數(shù)

    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))

    2.2目標(biāo)函數(shù)

    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

    2.3黑洞優(yōu)化算法 

    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

    3.結(jié)果展現(xiàn)

    Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法

    Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法

    關(guān)于“Matlab如何實(shí)現(xiàn)黑洞優(yōu)化算法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI