布谷鸟搜索算法是一种启发式算法,主要结合布谷鸟的巢寄生性和莱维飞行(Levy)模型。
function[bestnest1,fmin]=myfun(n)
bestnest1=ones(1,3);
if nargin<1,
n= 20;%种群数量
end
%发现概率
pa= 0.25;
%精度
T=10000;
global nd;
%求解维度
nd=2;
Lb= -5ones(1,nd);
%上限
Ub= 5ones(1,nd);
g=ones(Tol,1);
%随机的初始解
for i= 1:n,
nest(i,:)= Lb+ (Ub- Lb).rand(size(Lb));
end
%得到当前最优解
fitness= 10^10ones(n,1);
[fmin,bestnest,nest,fitness]= get_best_nest(nest,nest,fitness);
N_iter= 0;
for i=1:T,
new_nest= get_cuckoos(nest,bestnest,Lb,Ub);
[fnew,best,nest,fitness]= get_best_nest(nest,new_nest,fitness);
%更新计数器
N_iter= N_iter+ n;
%发现并随机选择
new_nest= empty_nests(nest,Lb,Ub,pa);
%评价改解
[fnew,best,nest,fitness]= get_ best_nest(nest,new_nest,fitness);
%再次更新计数器
N_iter= N _ iter+ n;
%找到目前最佳的目标函数
if fnew<fmin
fmin=fnew;
bestnest=best;
end
g(i)= fmin;
end
%显示所有鸟窝
disp([‘Total number of iterations= ‘,num2str(N_iter)]);
disp([‘Best =’,num2str(best),’ fmin=’,num2str(fmin)]);
function nest= get_cuckoos(nest,best,Lb,Ub)
%Levy飞行
n= size(nest,1);
beta= 3/2;
sigma=(gamma(1+beta)sin(pibeta/2)/(gamma((1+beta)/2)beta2((beta-1)/2)))(1/beta);
for j= 1:n,
s= nest(j,:);
%这是实现Levy飞行的一个简单方式,即对于随机步长来说,采用步长为1
u= randn(size(s))sigma;
v= randn(size(s));
step= u./abs(v).^(1/beta);
%在下一方程中,不同的因子(s- best)意味着当解为最优时,他保持不变
stepsize= 0.01step.*(s- best);
%实际的随机步长或飞行
s= s+ stepsize.randn(size(s));
%应用简单的范围/限制
nest(j,:)= simplebounds(s,Lb,Ub);
end
%%找到当前最优位置
function[fmin,best,nest,fitness]= get_best_nest(nest,new_nest,fitness)
%评估所有最优解
for j= 1:size(nest,1),
fnew= fobj(new_nest(j,:));
if fnew<=fitness(j),
fitness(j)= fnew;
nest(j,:)= new_nest(j,:);
end
end
%找到当前最优
[fmin,K]= min(fitness);
best= nest(K,:);
function new_nest= empty_nests(nest,Lb,Ub,pa)
n= size(nest,1);
K= rand(size(nest))>pa;
stepsize= rand(nest(randperm(n)?- nest(randperm(n)?);
new_nest= nest+ stepsize.*K;
function s= simplebounds(s,Lb,Ub)
%运用下限
ns_tmp=s;
I= ns_tmp<Lb;
ns_tmp(I)= Lb(I);
%运用上限
J= ns_tmp>Ub;
ns_tmp(J)= Ub(J);
%更新新的移动
s= ns_tmp;
%目标函数
function z= fobj(x)
z=abs(x(1)2+x(2)2+x(1)+x(2)-8)+abs(x(1)*x(2)+x(1)+x(2)-5);
源代码下载:https://download.csdn.net/download/wangyawei602/10249147