欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Matlab實現(xiàn)黑洞優(yōu)化算法的示例代碼

 更新時間:2022年06月13日 16:58:02   作者:電力系統(tǒng)代碼  
根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生.本文將用Matlab實現(xiàn)這一算法,需要的可以參考一下

前言

應(yīng)用的領(lǐng)域很多。

1.概述

1.1黑洞算法

根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生;但是該方法卻沒有提及如何確定黑洞邊界和如何處理吸收星體的問題. Hatamlou BH算法進行了完善,讓其更加接近于黑洞的自然現(xiàn)狀,使其具有黑洞現(xiàn)象的一般特質(zhì).該方法不但沿襲了原BH算法的一切特性,同時還解決了原BH 算法的黑洞邊界問題和吸收多余星點的問題.

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

BH 算法的思想較為完整地描述了自然界中黑洞現(xiàn)象的一般特性;以BH 算法具有的這些特性為基礎(chǔ),BH算法的尋優(yōu)搜索原理比較簡單,易于實現(xiàn).BH算法主要是模擬實際黑洞現(xiàn)象,在一定搜索空間內(nèi)隨機布置一定數(shù)量的星體,并通過統(tǒng)計學(xué)手段確定和評估搜索空間內(nèi)每一個星體的適應(yīng)度函數(shù),選出一個具有最佳適應(yīng)度值的星體作為黑洞.這個黑洞邊界(以R為半徑)被視為當(dāng)前全局最優(yōu)解所在區(qū)域,而黑洞本身被視為當(dāng)前全局最優(yōu)解;BH 算法中的黑洞具有與自然界黑洞同樣的強吸引能力,在搜索域內(nèi)所有其他星體都將向其靠攏且無法逃逸.星體被黑洞吸引并向黑洞靠攏的公式如下:

式中:xi(t)和xi+1(t+1)分別代表第i個星體在t和 t+1次迭代時的位置;rand表示0,1]之間的隨機數(shù);Am是搜索空間內(nèi)的黑洞位置;N是星體的數(shù)量.

在更替迭代過程中黑洞將進入其邊界以內(nèi)的星體一一吸收.每當(dāng)一個星體被吸收的同時,在搜索空間內(nèi)隨機產(chǎn)生一個新的星體﹐星體的總數(shù)保持不變.黑洞邊界范圍計算公式如下:

式中:fBH是黑洞的適應(yīng)度函數(shù)值;fi是第i個星體的適應(yīng)度函數(shù)值.

在被黑洞吸引的過程中,如果有一個星體i的適應(yīng)度函數(shù)值fi優(yōu)于黑洞的適應(yīng)度函數(shù)值fBH則說明該黑洞所處位置并非最優(yōu),需要黑洞和星體互換位置.然后算法將以新生成的黑洞為中心繼續(xù)運行下去,其他星體將通過位置更替公式(1)重新涌向新的黑洞位置,并被其吸收.

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

根據(jù)上述分析,得出黑洞算法的實現(xiàn)步驟:

步驟1初始化參數(shù),在搜索空間內(nèi)隨機選取一定數(shù)量星體;

步驟2計算每個星體的適應(yīng)度函數(shù)值;

步驟3選擇一個具有最佳適應(yīng)度值的星體作為黑洞;

步驟4根據(jù)式(1)更改每個星體的位置;

步驟5如果星體最優(yōu)適應(yīng)度函數(shù)值優(yōu)于黑洞的適應(yīng)度函數(shù)值,則交換二者位置;

步驟6 如果一個星體在黑洞的邊界范圍內(nèi),那么這個星體將被吸收﹐黑洞的邊界半徑由式(2)計算,同時,在搜索空間內(nèi)隨機產(chǎn)生一個新的星體;

步驟7當(dāng)系統(tǒng)達到最大迭代次數(shù),或者出現(xiàn)一個最好的適應(yīng)度值時,程序停止運行,否則返回步驟4.

2.Matlab代碼實現(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);    % 問題的維度。
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)化算法
%--------------------------------------------------------------------------
% 在搜索空間中初始化具有隨機位置的恒星群。
% 開始。
%   對于每一顆星,評估目標(biāo)函數(shù)。
%   選擇具有最佳適應(yīng)值的最佳恒星作為黑洞。
%   根據(jù)公式更改每顆恒星的位置。
%   如果一顆恒星到達一個比黑洞成本更低的位置,交換它們的位置。
%   如果一顆恒星穿過黑洞的視界,在搜索空間中的隨機位置用一顆新恒星替換它。
%   如果滿足終止標(biāo)準(zhǔn)(最大迭代次數(shù)或足夠好的適應(yīng)度),則退出循環(huán)。
% 結(jié)束循環(huán)
%--------------------------------------------------------------------------
 
ObjFunction=options.ObjFunction; % 目標(biāo)函數(shù)的命名
n=options.n;    % 該問題的維度
uk=options.uk;   % 在第k維上界。
lk=options.lk;  % 在第k的下界。
m=options.m; % m:樣本點數(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
    %% 如果恒星到達一個比黑洞成本低的位置,交換它們的位置
    ObjFunctionValue=feval(ObjFunction,x);
    nEval=nEval+size(x,1);
    %如果一顆恒星越過黑洞的事件視界,則在搜索空間中隨機位置用一顆新恒星代替
    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實現(xiàn)黑洞優(yōu)化算法的示例代碼的詳細內(nèi)容,更多關(guān)于Matlab黑洞優(yōu)化算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++使用fdk-aac實現(xiàn)將音頻PCM編碼成aac

    C++使用fdk-aac實現(xiàn)將音頻PCM編碼成aac

    mp4的音頻流通常是aac編碼,我們做音視頻采集的時候就需要將,采集的音頻PCM編碼成aac,本文就來為大家介紹一下C++如何使用fdk-aac實現(xiàn)將音頻PCM編碼成aac吧
    2023-11-11
  • c++中冒號(:)和雙冒號(::)的使用說明

    c++中冒號(:)和雙冒號(::)的使用說明

    以下是對c++中冒號和雙冒號的用法進行了介紹,需要的朋友可以過來參考下
    2013-07-07
  • 一篇帶你了解C語言--位操作詳情

    一篇帶你了解C語言--位操作詳情

    這篇文章主要介紹了關(guān)于C語言位運算的簡單示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • c++如何分割字符串示例代碼

    c++如何分割字符串示例代碼

    因為c++字符串沒有split函數(shù),所以字符串分割單詞的時候必須自己手寫,也相當(dāng)于自己實現(xiàn)一個split函數(shù)吧!下面跟小編一起來看看如何實現(xiàn)這個功能。
    2016-08-08
  • C++?Boost?Format超詳細講解

    C++?Boost?Format超詳細講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 北郵考研復(fù)試C語言上機題目精選

    北郵考研復(fù)試C語言上機題目精選

    這篇文章主要介紹了北郵考研復(fù)試C語言上機題目精選,摘自2010年北郵CS的復(fù)試,需要的朋友可以參考下
    2015-08-08
  • C語言開發(fā)實現(xiàn)掃雷游戲

    C語言開發(fā)實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言開發(fā)實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言實現(xiàn)簡單的三子棋游戲

    C語言實現(xiàn)簡單的三子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Opencv實現(xiàn)畫筆功能

    Opencv實現(xiàn)畫筆功能

    這篇文章主要為大家詳細介紹了Opencv實現(xiàn)畫筆功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 一文詳解C++關(guān)鍵詞auto的用法

    一文詳解C++關(guān)鍵詞auto的用法

    在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,在 C++11中,auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,本文將給大家詳細的介紹一下C++關(guān)鍵詞auto的用法,需要的朋友可以參考下
    2024-02-02

最新評論