鸟群算法
鸟群算法。。。。。% ------------------------------------------------------------------------
% Bird Swarm Algorithm (BSA) (demo)
% Programmed by Xian-Bing Meng
% Updated at Jun 19, 2015.
% Email: x.b.meng12@gmail.com
%
% This is a simple demo version only implemented the basic idea of BSA for
% solving the unconstrained problem, namely Sphere function.
%
% The details about BSA are illustratred in the following paper.
% Xian-Bing Meng, et al (2015): A new bio-inspXred optimisation algorithm:
% Bird Swarm Algorithm, Journal of Experimental & Theoretical
% Artificial Intelligence, DOI: 10.1080/0952813X.2015.1042530
%
% The parameters in BSA are presented as follows.
% FitFunc % The objective function
% M % Maxmimal generations (iterations)
% pop % Population size
% dim % Dimension
% FQ % The frequency of birds' flight behaviours
% c1 % Cognitive accelerated coefficient
% c2 % Social accelerated coefficient
% a1, a2 % Two paramters which are related to the indirect and direct
% effect on the birds' vigilance bahaviors.
%
% Using the default value, BSA can be executed using the following code.
% [ bestX, fMin ] = BSA
% ------------------------------------------------------------------------
% Main programs
function [ bestX, fMin ] = BSA( FitFunc, M, pop, dim, FQ, c1, c2, a1, a2 )
% Display help
help BSA.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% set the default parameters
if nargin < 1
FitFunc = @Sphere;
M = 1000;
pop = 30;
dim = 20;
FQ = 10;
c1 = 1.5;
c2 = 1.5;
a1 = 1;
a2 = 1;
end
% set the parameters
lb= -100*ones( 1,dim ); % Lower bounds
ub= 100*ones( 1,dim ); % Upper bounds
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Initialization
for i = 1 : pop
x( i, : ) = lb + (ub - lb) .* rand( 1, dim );
fit( i ) = FitFunc( x( i, : ) );
end
pFit = fit; % The individual's best fitness value
pX = x; % The individual's best position corresponding to the pFit
[ fMin, bestIndex ] = min( fit );% fMin denotes the global optimum
% bestX denotes the position corresponding to fMin
bestX = x( bestIndex, : );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Start the iteration.
for iteration = 1 : M
prob = rand( pop, 1 ) .* 0.2 + 0.8;%The probability of foraging for food
if( mod( iteration, FQ ) ~= 0 )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Birds forage for food or keep vigilance
sumPfit = sum( pFit );
meanP = mean( pX );
for i = 1 : pop
if rand < prob(i)
x( i, : ) = x( i, : ) + c1 * rand.*(bestX - x( i, : ))+ ...
c2 * rand.*( pX(i,:) - x( i, : ) );
else
person = randiTabu( 1, pop, i, 1 );
x( i, : ) = x( i, : ) + rand.*(meanP - x( i, : )) * a1 * ...
exp( -pFit(i)/( sumPfit + realmin) * pop ) + a2 * ...
( rand*2 - 1) .* ( pX(person,:) - x( i, : ) ) * exp( ...
-(pFit(person) - pFit(i))/(abs( pFit(person)-pFit(i) )...
+ realmin) * pFit(person)/(sumPfit + realmin) * pop );
end
x( i, : ) = Bounds( x( i, : ), lb, ub );
fit( i ) = FitFunc( x( i, : ) );
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
FL = rand( pop, 1 ) .* 0.4 + 0.5; %The followed coefficient
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Divide the bird swarm into two parts: producers and scroungers.
= min( pFit );
= max( pFit );
choose = 0;
if ( minIndex < 0.5*pop && maxIndex < 0.5*pop )
choose = 1;
end
if ( minIndex > 0.5*pop && maxIndex < 0.5*pop )
choose = 2;
end
if ( minIndex < 0.5*pop && maxIndex > 0.5*pop )
choose = 3;
end
if ( minIndex > 0.5*pop && maxIndex > 0.5*pop )
choose = 4;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if choose < 3
for i = (pop/2+1) : pop
x( i, : ) = x( i, : ) * ( 1 + randn );
x( i, : ) = Bounds( x( i, : ), lb, ub );
fit( i ) = FitFunc( x( i, : ) );
end
if choose == 1
x( minIndex,: ) = x( minIndex,: ) * ( 1 + randn );
x( minIndex, : ) = Bounds( x( minIndex, : ), lb, ub );
fit( minIndex ) = FitFunc( x( minIndex, : ) );
end
for i = 1 : 0.5*pop
if choose == 2 || minIndex ~= i
person = randi( [(0.5*pop+1), pop ], 1 );
x( i, : ) = x( i, : ) + (pX(person, :) - x( i, : )) * FL( i );
x( i, : ) = Bounds( x( i, : ), lb, ub );
fit( i ) = FitFunc( x( i, : ) );
end
end
else
for i = 1 : 0.5*pop
x( i, : ) = x( i, : ) * ( 1 + randn );
x( i, : ) = Bounds( x( i, : ), lb, ub );
fit( i ) = FitFunc( x( i, : ) );
end
if choose == 4
x( minIndex,: ) = x( minIndex,: ) * ( 1 + randn );
x( minIndex, : ) = Bounds( x( minIndex, : ), lb, ub );
fit( minIndex ) = FitFunc( x( minIndex, : ) );
end
for i = (0.5*pop+1) : pop
if choose == 3 || minIndex ~= i
person = randi( , 1 );
x( i, : ) = x( i, : ) + (pX(person, :) - x( i, : )) * FL( i );
x( i, : ) = Bounds( x( i, : ), lb, ub );
fit( i ) = FitFunc( x( i, : ) );
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Update the individual's best fitness vlaue and the global best one
for i = 1 : pop
if ( fit( i ) < pFit( i ) )
pFit( i ) = fit( i );
pX( i, : ) = x( i, : );
end
if( pFit( i ) < fMin )
fMin = pFit( i );
bestX = pX( i, : );
end
end
end
% End of the main program
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The following functions are associated with the main program
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This function is the objective function
function y = Sphere( x )
y = sum( x .^ 2 );
% Application of simple limits/bounds
function s = Bounds( s, Lb, Ub)
% Apply the lower bound vector
temp = s;
I = temp < Lb;
temp(I) = Lb(I);
% Apply the upper bound vector
J = temp > Ub;
temp(J) = Ub(J);
% Update this new move
s = temp;
%--------------------------------------------------------------------------
% This function generate "dim" values, all of which are different from
%the value of "tabu"
function value = randiTabu( min, max, tabu, dim )
value = ones( dim, 1 ) .* max .* 2;
num = 1;
while ( num <= dim )
temp = randi( , 1, 1 );
if( length( find( value ~= temp ) ) == dim && temp ~= tabu )
value( num ) = temp;
num = num + 1;
end
end代码+pdf下载:https://pan.baidu.com/s/1yp-WWOM4gcKjWWTzmnvK9Q
页:
[1]