【智能算法】布谷鸟搜索算法(CS)原理及实现

本文介绍了布谷鸟搜索算法(CuckooSearch)的原理,包括其受布谷鸟繁殖行为启发的寄生特性,以及算法的具体过程,如种群位置初始化、局部和全局探索策略。通过伪代码展示了算法的实现,并以CEC2005测试函数为例说明在实际优化问题中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述


1.背景

2009年,Yang等人受到布谷鸟繁衍自然行为影响,提出了布谷鸟搜索算法(Cuckoo Search,CS)。

2.算法原理

2.1算法思想

布谷鸟繁衍特点寄生,将卵产在其他鸟类的巢穴中。一般情况下,布谷鸟蛋的孵化速度比寄主蛋快。一旦第一只布谷鸟雏鸟孵化,它会迅速推出其他蛋,增加寄主对它的食物供给。研究还指出,杜鹃雏鸟可以模仿寄主雏鸟的叫声,以获取更多被喂食的机会。(适应度越高,蛋获得能量越高)
三条理想化假设

  • 布谷鸟每次产下一枚蛋,随机进入寄主巢穴
  • 具有最优质蛋的巢穴将会被保留(适应度最高)
  • 寄主巢穴固定,有一定概率 P a Pa Pa发现布谷鸟蛋,寄主可以消灭该蛋或放弃旧巢另建新巢

2.2算法过程

群体位置初始化:
x = l b + r a n d ∗ ( u b − l b ) x=lb+rand*(ub-lb) x=lb+rand(ublb)
其中, u b , l b ub,lb ub,lb分别代表布谷鸟上下位置边界。
局部探索
x i t + 1 = x i t + α s ⊗ H ( p a − ϵ ) ⊗ ( x j t − x k t ) x_i^{t+1}=x_i^t+\alpha s\otimes H(p_a-\epsilon)\otimes(x_j^t-x_k^t) xit+1=xit+αsH(paϵ)(xjtxkt)
全局探索
x i t + 1 = x i t + α L ( s , λ ) x_i^{t+1}=x_i^t+\alpha L(s,\lambda) xit+1=xit+αL(s,λ)
其中, L ( s , λ ) L(s,\lambda) L(s,λ)表示Lévy飞行:
L ( s , λ ) = λ Γ ( λ ) sin ⁡ ( π λ / 2 ) π 1 s 1 + λ , ( s ≫ s 0 > 0 ) L(s,\lambda)=\frac{\lambda\Gamma(\lambda)\sin(\pi\lambda/2)}\pi\frac1{s^{1+\lambda}},(s\gg s_0>0) L(s,λ)=πλΓ(λ)sin(πλ/2)s1+λ1,(ss0>0)
Lévy 飞行生成随机数应包括两个步骤:随机方向的选择和服从 Lévy 分布的步长的生成。方向服从均匀分布,步长由Mantegna算法给出:
s = U ∣ V ∣ 1 / λ s=\frac U{|V|^{1/\lambda}} s=V1/λU
其中, U ∼ N ( 0 , σ 2 ) , V ∼ N ( 0 , 1 ) U\sim N(0,\sigma^2),\quad V\sim N(0,1) UN(0,σ2),VN(0,1)。方差表述为:
σ 2 = [ Γ ( 1 + λ ) λ Γ ( ( 1 + λ ) / 2 ) ⋅ sin ⁡ ( π λ / 2 ) 2 ( λ − 1 ) / 2 ] 1 / λ \sigma^2=[\frac{\Gamma(1+\lambda)}{\lambda\Gamma((1+\lambda)/2)}\cdot\frac{\sin(\pi\lambda/2)}{2^{(\lambda-1)/2}}]^{1/\lambda} σ2=[λΓ((1+λ)/2)Γ(1+λ)2(λ1)/2sin(πλ/2)]1/λ
伪代码
在这里插入图片描述

3.代码实现

% 布谷鸟算法                   
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = CS(pop, maxIter,lb,ub,dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
%% 控制参数
pa=0.25; 
%% 初始化种群
nest = zeros(pop, dim);
for i = 1:dim
    nest(:,i) = lb(i) + (ub(i) - lb(i)) * rand(pop, 1);
end
%% 计算适应度
fitness = zeros(1, pop);
for i = 1:pop
    fitness(i) = fobj(nest(i,:));
end
%% 记录
[SortFitness, SortIdx] = sort(fitness);
Best_fitness = SortFitness(1);
Best_pos = nest(SortIdx(1),:);
%% 迭代
for iter=1:maxIter
    % Levy飞行获得新解
     new_nest=get_cuckoos(nest,Best_pos,lb,ub);   
     [fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness, fobj);
    % Pa概率遗弃
      new_nest=empty_nests(nest,lb,ub,pa) ;
    
      [fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness, fobj);
 
    if fnew<Best_fitness
        Best_fitness=fnew;
        Best_pos=best;
    end
    
    Iter_curve(iter) = Best_fitness;
    History_best{iter} = Best_pos;
    History_pos{iter} = new_nest;
end 
end
%% Levy飞行
function nest=get_cuckoos(nest,best,Lb,Ub)
n=size(nest,1);
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);

for j=1:n
    s=nest(j,:);
    % Levy飞行步长求解
    u=randn(size(s))*sigma;
    v=randn(size(s));
    step=u./abs(v).^(1/beta);
     
    stepsize=0.01*step.*(s-best);
    s=s+stepsize.*randn(size(s));
    % 边界限制
   nest(j,:)=simplebounds(s,Lb,Ub);
end
end
%%
function [fmin,best,nest,fitness]=get_best_nest(nest,newnest,fitness,fobj)
for j=1:size(nest,1)
    fnew=fobj(newnest(j,:));
    if fnew<=fitness(j)
       fitness(j)=fnew;
       nest(j,:)=newnest(j,:);
    end
end
[fmin,K]=min(fitness) ;
best=nest(K,:);
end
%% 替换巢
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;
for j=1:size(new_nest,1)
    s=new_nest(j,:);
  new_nest(j,:)=simplebounds(s,Lb,Ub);  
end
end
% 边界限制
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;
end

优化问题
以CEC2005测试函数为例
在这里插入图片描述
在这里插入图片描述

4.参考文献

【1】Yang X S, Deb S. Cuckoo search via Lévy flights[C]//2009 World congress on nature & biologically inspired computing (NaBIC). Ieee, 2009: 210-214.
【2】Mantegna RN. Fast, accurate algorithm for numerical simulation of Lévy stable stochastic process. Phys Rev E 1994;49(5):4677–83.

  • 36
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小O的算法实验室

谢谢大佬的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值