天天看點

用于全局優化的分數階Lèvy飛行蝙蝠算法源碼複現

function [bestX,fMin] = FLFBA()

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 設定預設參數

M = 1000;

pop = 10;

dim = 2;

gama = 0.9; %0.9

alpha = 0.99; %0.99

r0Max = 1; %1

r0Min = 0; %0

AMax = 2; %2

AMin = 0; %0.5

freqMax = 2; %2

freqMin = 0; %0.1

%%%%%%%%%%%%%%%%%%%%%%%

wMax = 0.9; %0.9

wMin = 0.2; %0.2

xsi_init = 0.6; %0.6

n = 2; %2

% 參數設定

lb= -5 * ones(1,dim );   % 最低邊界

ub= 5 * ones(1,dim );    % 最高邊界

alfa=0.632; 

beta=3/2;   % Lèvy飛行軌迹參數

sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*...

    beta*2^((beta-1)/2)))^(1/beta); % Lèvy飛行軌迹參數

Vhist = zeros(10,pop,dim);  % 速度的曆史值儲存清單

vLb = 0.6 * lb; %0.6

vUb = 0.6 * ub; %0.6

r = rand( pop, 1 ) .* 0.2 + 0; 

r0 = rand( pop, 1 ) .* ( r0Max - r0Min ) + r0Min;

A = rand( pop, 1 ) .* ( AMax - AMin ) + AMin;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%Initialization

for i = 1 : pop

    x( i, : ) = lb + (ub - lb) .* rand( 1, dim );

    v( i, : ) = rand( 1, dim );

    fit( i ) = Fobt(x(i,:)');

end

pFit = fit; % 個體最優适應度值

pX = x;     % 個體最優位置

[ fMin, bestIndex ] = min( fit );  % fMin表示全局最優

                   % bestX表示fMin對應的位置

bestX = x( bestIndex, : );

Vhist(1,:,:)= v;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 疊代開始

for iteration = 1 : M

    %%%%%%%%%%%%%%%%%%%%%% 疊代參數%%%%%%%%%%%%%%%%%%%%%%%%%%%

    freq = rand( pop, dim ) .* ( freqMax - freqMin ) + freqMin;

    w = (wMax - wMin) * ( M - iteration )/(1.0 * M) + wMin; %Inertia weight

    xsi1 = 1 + ((xsi_init-1)*((M-iteration)/M)^n);

    xsi2 = 1-xsi1;

    meanA = mean( A );

    meanP = mean(pX);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    for i = 1 : pop

        if rand < 0.5 %0.5

            q1 = randi([1 pop]);

            q2 = randi([1 pop]);

            X1 = pX(q1,:);

            X2 = pX(q2,:);

            newX=kill_bat(pX(i,:),X1,X2); % Eq(24-25)

            [pX(i,:),pFit(i)]=select_bat(pX(i,:),newX,pFit(i));

            %%%%%%%%%%%% Levy飛行軌迹 %%%%%%%%%%%%%%%%%%%%%%%%%%%%

            u=randn(1,dim)*sigma;

            VV=randn(1,dim);

            step=u./abs(VV).^(1/beta);

            stepsize = 0.01*step.*randn(1,dim); %0.01

            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            x( i, : ) = pX(i,:) + stepsize .* ... %pX(i,:)

                abs(meanP - x(i,:));    %Eq(26)           

        else   % 使用分數導數

            t1 = randi([1 10]);

            q = randi([1 pop]);

            while q== i

                q = randi([1 pop]);

            end

            %%%%%%%%%%%%%%% fractional derivative %%%%%%%%%%%%%%%%%%

            Vh = reshape(Vhist(:,i,:),10,dim); 

            vout = Frac_Diff_Der(alfa,Vh,t1); %Eq(27)

            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            v(i,:) = w.* vout + freq(i,:) .* xsi1 .*(bestX-x(i,:))+...

                freq(i,:).* xsi2 .*(pX(i,:)-x(q,:)); %Eq(22) 

            v(i,:) = Bounds(v(i,:),vLb,vUb);

            x(i,:) = x(i,:) + v(i,:);

            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        end

        % 局部搜尋

        if rand > r(i)

            %%%%%%%%%%%%%%%% 另外一種Levy飛行軌迹 %%%%%%%%%%%%%%%%%%%%

            u=randn(1,dim)*sigma;

            VV=randn(1,dim);

            step=u./abs(VV).^(1/beta);

            stepsize = 0.01*step;

            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            randnValueA = stepsize .*randn(1,dim).* ...

                (abs(A(i)-meanA)+realmin);

            x(i,:) = bestX .* (1+randnValueA); %Eq(32)

        end

        x(i,:) = Bounds(x(i,:),lb,ub);

        fit(i) = Fobt(x(i,:)');

    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 更新個人最優适應度值和全局最優個體

    for i = 1 : pop

        if fit( i ) < pFit( i )

            pFit( i ) = fit( i );

            pX( i, : ) = x( i, : );

        end

        if( pFit( i ) < fMin && rand < A(i) )

            fMin = pFit( i );

            bestX = pX( i, : );

            A(i) = A(i) * alpha;

            r(i) = r0(i) * ( 1 - exp( -gama * iteration ) );

        end

    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    Vhist(2:10,:,:) = Vhist(1:9,:,:);

    Vhist(1,:,:) = v;

    fbest = fMin; %#ok<NASGU>

    FunMin(iteration) = fMin;

end

% End of the main program

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 以下函數與主程式相關

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Application of simple limits/bounds

function s = Bounds( s, Lb, Ub)

% 簡單極限/界限的應用

temp = s;

I = temp < Lb;

temp(I) = Lb(I);

% 應用上界向量

J = temp > Ub;

temp(J) = Ub(J);

% 更新此移動

s = temp;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [X,fits]=select_bat(X,newX,fits)

% 評價所有個體

   fnew= Fobt(newX');

    if fnew<=fits

        fits =fnew;

        X=newX;

    end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 function newX=kill_bat(X,X1,X2)

 % 一小部分更差的點以一定機率被發現

 stepsize=rand*(X1-X2);

 newX=X+stepsize;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [vout] = Frac_Diff_Der(alfa,V,r)

switch(r)

    case 1

        vout = alfa*V(1,:);

    case 2

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:);

    case 3 

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:);

    case 4

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:);

    case 5

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:);

    case 6

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:)+...

            (1/factorial(6))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*V(6,:);

    case 7

       vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:)+...

            (1/factorial(6))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*V(6,:)+ ...

            (1/factorial(7))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*V(7,:);

    case 8

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:)+...

            (1/factorial(6))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*V(6,:)+ ...

            (1/factorial(7))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*V(7,:)+...

            (1/factorial(8))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*V(8,:);

    case 9 

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:)+...

            (1/factorial(6))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*V(6,:)+ ...

            (1/factorial(7))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*V(7,:)+...

            (1/factorial(8))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*V(8,:)+...

            (1/factorial(9))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*(7-alfa)*V(9,:);

    case 10

        vout = alfa*V(1,:)+(1/factorial(2))*V(2,:)+...

            (1/factorial(3))*alfa*(1-alfa)*V(3,:)+ ...

            (1/factorial(4))*alfa*(1-alfa)*(2-alfa)*V(4,:)+ ...

            (1/factorial(5))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*V(5,:)+...

            (1/factorial(6))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*V(6,:)+ ...

            (1/factorial(7))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*V(7,:)+...

            (1/factorial(8))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*V(8,:)+...

            (1/factorial(9))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*(7-alfa)*V(9,:)+...

            (1/factorial(10))*alfa*(1-alfa)*(2-alfa)*(3-alfa)*...

            (4-alfa)*(5-alfa)*(6-alfa)*(7-alfa)*(8-alfa)*V(10,:);

    otherwise

                disp('Incorrect order, must be between 1 and 10');

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù

 function y = Fobt(x)

 npar = length(x);

 z = 0;

  for i =2:npar

      z = z+x(i)^2;

  end

  y = x(1)^2+1000000 * z;

參考文獻:(2020) "Fractional Lèvy flight bat algorithm for global optimisation", Int. J. Bio-Inspired Computation, Vol. 15, No. 2, pp.100–112

繼續閱讀