【群体智能】布谷鸟搜索算法

目录

一、预备知识

1. 分布

2. 随机游走

二、设计思想

1. 设计思想概括

2. 布谷鸟行为分析

三、理想化规则

四、实现过程/基本流程

五、Matlab实现

1. 代码

2. 输出


一、预备知识

1. 分布

(1)Thin-detailed Distribution:以指数分布为分界线,x趋于无穷时,下降速率更快,如正态分布68-95-99.7

(2)Exponential Distribution:x趋于无穷时,指数分布以指数的速率下降并趋近于0

(3)Heavy-detailed Distribution:x趋于无穷时,下降速率慢于指数分布(离峰值较远的事件也有相当的概率发生)

① Fat-detailed Distribution:罕见的事件发生的概率虽然低,但是也要考虑到,如柯西分布;

② Long-detailed Distribution:如帕累托法则/二八定律

③ Subexponential Distribution

2. 随机游走

(1) 定义

在任意维度的空间里,一个点随机地向任意方向前进任意长度的距离。

(2) 举例

① Levy飞行

一类非高斯随机过程,其平稳增量服从莱维稳定分布。在飞行过程中,步长较小的短距离行走与偶尔较大步长的长距离行走相互交替,有利于增加种群多样性、扩大搜索范围,不至于陷入局部最优。每一步完全随机且各向同性,步长分布重尾分布。

② 布朗运动

步长分布正态分布。

二、设计思想

1. 设计思想概括

模拟布谷鸟的Levy飞行和巢寄生机制/寄生式育雏

2. 布谷鸟行为分析

(1)寄生式育雏

(2)积极的繁殖策略

(3)产蛋时机的把握

(4)Levy飞行:间歇无标度的搜索模式(一系列直线飞行和突然的90°转变)

三、理想化规则

1. 每只布谷鸟每次只下一个蛋, 并将其放入随机选择的巢中;

2. 具有优质蛋的最佳巢会被带到下一代中;

3. 可用的寄生巢数量固定,且宿主以概率Pa发现布谷鸟放的蛋;此时,宿主可以选择换巢或者消灭该蛋<=>n个巢以Pa的概率被新巢(新的随机解)替换。

P:基于上述3条规则,可以认为,鸟寻找鸟窝下单的过程就是在n维空间内寻找解的过程,鸟窝的好坏/蛋是否能被宿主孵化并茁壮成长象征着解的好坏

四、实现过程/基本流程

1. 初始化:目标函数f(x)、鸟巢个数n、最大迭代次数MaxGeneration、最大发现概率Pa,解空间上下界Lb与Ub等;

2. 随机产生初始解x(i)(鸟巢位置),计算相应的初始适应度值F(i),并记录当前的最优函数值;

3. 利用Levy飞行更新解(产生新的鸟蛋),计算相应的适应度值F(j);

4. 比较Fi与Fj适应度值,如果Fj(新解)更小,将该适应度值及鸟蛋所代表的解赋给原来的鸟巢x(i);

5. 判断鸟蛋是否会被发现:用随机数r与最大发现概率Pa比较,若r>Pa,被发现,宿主找新家,鸟巢位置x(i)随机改变,反之,则不变;

6. 对各解(鸟巢位置或者鸟巢中的鸟蛋)进行适应度值排序,保留最优适应度值的解(鸟巢位置或鸟巢中的鸟蛋);

7. 循环步骤3-6,直至达到最大迭代次数或者满足终止条件,则算法终止。

五、Matlab实现

1. 代码

%% CS 主函数

%% 清空工作空间
clear;
close all;
clc;

%% 计时区
tic

%% STEP1 初始化参数
% Number of nests
n = 25;

% Discovery rate of alien eggs/solutions
pa = 0.25;

% Change this if you want to get better results
% Tolerance
Tol = 1.0e-5;  

% Simple bounds of the search domain [-5,5]
% Lower bounds
nd = 2;
Lb = -5 * ones(1,nd);
% Upper bounds
Ub = 5 * ones(1,nd);
fitness = 10^10*ones(n,1);


%% STEP2 随机产生初始解,并计算相应的适应度值
% Random initial solutions
for i = 1:n
    nest(i,:) = Lb + (Ub-Lb) .* rand(size(Lb));
end

% Get the current best

[fmin,bestnest,nest,fitness] = get_best_nest(nest,nest,fitness);

%% STEP3 Levy飞行,开始更新
% Starting iterations
N_iter = 0;
while (fmin > Tol)
    
    % Generate new solutions (but keep the current best)
    new_nest = get_cuckoos(nest,bestnest,Lb,Ub);
    [fnew,best,nest,fitness] = get_best_nest(nest,new_nest,fitness);
    % Update the counter
    N_iter = N_iter + n;
    % Discovery and randomization
    new_nest = empty_nests(nest,Lb,Ub,pa) ;
    
    % Evaluate this set of solutions
    [fnew,best,nest,fitness] = get_best_nest(nest,new_nest,fitness);
    % Update the counter again
    N_iter = N_iter+n;
    % Find the best objective so far
    if fnew < fmin
        fmin = fnew;
        bestnest = best;
    end
    scatter(N_iter,fmin,'p');
    hold on
    
    %trace(N_iter) = fmin;
end
% fmin_c = nonzeros(trace);

%% STEP4 Display 
disp(strcat('Total number of iterations =',num2str(N_iter)));
disp(strcat('最小适应度值:',num2str(fmin)));
disp('最优解:');
disp(bestnest)
%plot(fmin_c,'r-.');

%% 计时区
toc

2. 输出

(1)结果输出:迭代次数+最小适应度值+最优解+算法运行时间

【群体智能】布谷鸟搜索算法_第1张图片

 (2)图像输出:“迭代次数-适应度值”散点图

【群体智能】布谷鸟搜索算法_第2张图片

你可能感兴趣的:(Swarm,Intelligence,人工智能,深度学习,机器学习,其他,经验分享)