优化问题是科学研究和工程实践领域中的热门问题。智能优化算法大多是受到人类智能、生物群体社会性或自然现象规律的启发,在解空间内进行全局优化。麻雀算法于2020年由薛建凯[1]首次提出,是基于麻雀种群的觅食和反捕食行为的一种新型智能优化算法。
麻雀搜索算法的具体步骤描述以及公式介绍:
构建麻雀种群:
其中,d表示待优化问题的维数,n表示麻雀种群的数量。所有麻雀种群的适应度函数可以表示成如下形式:
其中,Fx表示适应度函数值。
麻雀算法中的麻雀具有两大类分别是发现者和加入者,发现者负责为整个种群寻找食物并为加入者提供觅食的方向,因此,发现者的觅食搜索范围要比加入者的觅食搜索范围大。在每次迭代过程中,发现者按照公式(3)进行迭代。
其中,t表示当前迭代次数,Xij表示第i个麻雀种群在第j维中的位置信息,阿尔法表示的0到1的随机数,itermax表示最大迭代次数,Q表示一个服从正态分布的随机数,L是一个1*d并且元素全为1的矩阵,R2属于0-1表示麻雀种群位置的预警值,ST属于0.5-1表示麻雀种群位置的安全值。
当R2<ST时表示 预警值小于安全值,此时觅食环境中没有捕食者,发现者可以进行广泛搜索操作;当R2>ST时意味着种群中有部分麻雀已经发现捕食者,并向种群中的其他麻雀发出预警,所有麻雀都需要飞往安全区域进行觅食。
在觅食过程中,部分加入者会时刻监视发现者,当发现者发现更好的食物,加入者会与其进行争夺,若成功,会立即获得该发现者的食物,否则加入者按照公式(4)进行位置更新。
其中,XP表示目前发现者所发现的最优位置,Xworst表示当前全局最差的位置,A表示其元素随机赋值为1或-1的1*d的矩阵并且满足一下关系:
L仍然是一个1*d并且元素全为1的矩阵。当i>n/2时这表明第i个加入者没有获得食物,处于饥饿状态,此时需要飞往其他地方进行觅食,以获得更多的能量。
在麻雀种群中,意识到危险的麻雀数量占总数的10%到20%,这些麻雀的位置是随机产生的,按照公式(5)对意识到危险的麻雀的位置进行不断更新。
其中,Xbest表示当前全局最优位置,是服从标准正态分布的随机数用来作为步长控制参数,贝塔是一个属于-1到1的随机数,fi表示当前麻雀个体的适应度值,fg表示全局最佳适应度值,fw表示全局最差适应度值,像左耳朵一样的这个是读"一不洗诺"吗?"一不洗诺"表示一个避免分母为0的常数。当fi>fg时表示此时麻雀处于种群边缘,极易受到捕食者的攻击,当fi=fg时表示处于种群中间的麻雀也受到了危险,此时需要靠近其他麻雀以减少被捕食的风险。
麻雀搜索算法具有较好的全局探索和局部开发的能力,将种群中的所有因素考虑在内,能够使种群中的麻雀向全局最优值移动,迅速的在最优值附近收敛。在优化算法一开始收敛速度就很明显,文献1指出该算法具有稳定性好、全局搜索能力强、参数少的特点,为解决复问题优化提供了一种全新的方法。
代码部分:
SSA代码主体部分
function [fMin , bestX,Convergence_curve ] = SSA(pop, M,c,d,dim,fobj )
%其中:fobj是函数
%捕食者站整个种群规模的百分比 The population size of producers accounts for "P_percent" percent of the total population size
P_percent = 0.2;
%捕食者的人口规模 百分比*中群内个体数量
pNum = round( pop * P_percent ); % The population size of the producers
%下限/界限/向量
lb= c.*ones( 1,dim ); % Lower limit/bounds/ a vector
%上限/界限/向量
ub= d.*ones( 1,dim ); % Upper limit/bounds/ a vector
%Initialization 初始化
for i = 1 : pop%对各异进行遍历
%初始化个体以及适应度函数
x( i, : ) = lb + (ub - lb) .* rand( 1, dim );
fit( i ) = fobj( x( i, : ) ) ;
end
pFit = fit;
%与pfit对应的个人最佳值
pX = x; % The individual's best position corresponding to the pFit
%fMin表示全局最优适应度值
[ fMin, bestI ] = min( fit ); % fMin denotes the global optimum fitness value
%bestX 表示对应于fMin全局最优位置的
bestX = x( bestI, : ); % bestX denotes the global optimum position corresponding to fMin
% Start updating the solutions.
%开始更新解决方案
for t = 1 : M % M为最大迭代次数
[ ans, sortIndex ] = sort( pFit );% Sort.排序
[fmax,B]=max( pFit );
worse= x(B,:);
r2=rand(1);
if(r2<0.8) %st=0.8
for i = 1 : pNum %对于捕食者 % Equation (3)
r1=rand(1);
x( sortIndex( i ), : ) = pX( sortIndex( i ), : )*exp(-(i)/(r1*M));
x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );
end
else
for i = 1 : pNum
x( sortIndex( i ), : ) = pX( sortIndex( i ), : )+randn(1)*ones(1,dim);
x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );
end
end
[ fMMin, bestII ] = min( fit );
bestXX = x( bestII, : );
for i = ( pNum + 1 ) : pop % Equation (4) 对于加入者
A=floor(rand(1,dim)*2)*2-1;
if( i>(pop/2))
x( sortIndex(i ), : )=randn(1)*exp((worse-pX( sortIndex( i ), : ))/(i)^2);
else
x( sortIndex( i ), : )=bestXX+(abs(( pX( sortIndex( i ), : )-bestXX)))*(A'*(A*A')^(-1))*ones(1,dim);
end
x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );
end
c=randperm(numel(sortIndex));
b=sortIndex(c(1:20));
for j = 1 : length(b) % Equation (5) 对于遇到危险的麻雀 其位置随机
if( pFit( sortIndex( b(j) ) )>(fMin) )
x( sortIndex( b(j) ), : )=bestX+(randn(1,dim)).*(abs(( pX( sortIndex( b(j) ), : ) -bestX)));
else
x( sortIndex( b(j) ), : ) =pX( sortIndex( b(j) ), : )+(2*rand(1)-1)*(abs(pX( sortIndex( b(j) ), : )-worse))/ ( pFit( sortIndex( b(j) ) )-fmax+1e-50);
end
x( sortIndex(b(j) ), : ) = Bounds( x( sortIndex(b(j) ), : ), lb, ub );
fit( sortIndex( b(j) ) ) = fobj( x( sortIndex( b(j) ), : ) );
end
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
Convergence_curve(t)=fMin;
end
% 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;
%---------------------------------------------------------------------------------------------------------------------------
调用不同的主体函数:
%%调用不同的函数主体
function [lb,ub,dim,fobj] = Get_Functions_details(F)
switch F
case 'F1'
fobj = @F1;%函数名
lb=-100;%下限
ub=100;%上限
dim=5; %维度
case 'F2'
fobj = @F2;
lb=-10;
ub=10;
dim=5;
case 'F3'
fobj = @F3;
lb=-100;
ub=100;
dim=5;
case 'F4'
fobj = @F4;
lb=-100;
ub=100;
dim=5;
case 'F5'
fobj = @F5;
lb=-30;
ub=30;
dim=5;
case 'F6'
fobj = @F6;
lb=-100;
ub=100;
dim=5;
end
end
% F1调用的函数
function o = F1(x)
o=sum(x.^2);
end
% F2
function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end
% F3
function o = F3(x)
dim=size(x,2);
o=0;
for i=1:dim
o=o+sum(x(1:i))^2;
end
end
% F4
function o = F4(x)
o=max(abs(x));
end
% F5
function o = F5(x)
dim=size(x,2);
o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);
end
% F6
function o = F6(x)
o=sum(abs((x+.5)).^2);
end
主函数:
%%
clear all
clc
%%
SearchAgents_no=100; % Number of search agents
Function_name='F2'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper)
Max_iteration=1000; % Maximum numbef of iterations自迭代次数
% Load details of the selected benchmark function 加载函数的详细信息,分别对应两个函数
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[fMin,bestX,SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj); %种群数量100,最大迭代次数1000,上限、下限、最优值
%%
%Draw objective space 画出坐标系
semilogy(SSA_curve,'Color','r')
axis ([0 1000 0 1 ])
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
%axis tight
grid on
box on
legend('SSA')
display(['The best solution obtained by SSA is : ', num2str(bestX)]);
display(['The best optimal value of the objective funciton found by SSA is : ', num2str(fMin)]);
大家可以根据自己的实际应用在此代码的基础上进行改进。
注:参考文献导不出来,将文献题目与作者列出
[1]一种新型的群智能优化技术的研究与应用:麻雀搜索算法,薛建凯