一、预备知识
1. 分布
2. 随机游走
二、设计思想
1. 设计思想概括
2. 布谷鸟行为分析
三、理想化规则
四、实现过程/基本流程
五、Matlab实现
1. 代码
2. 输出
(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
(1) 定义
在任意维度的空间里,一个点随机地向任意方向前进任意长度的距离。
(2) 举例
① Levy飞行
一类非高斯随机过程,其平稳增量服从莱维稳定分布。在飞行过程中,步长较小的短距离行走与偶尔较大步长的长距离行走相互交替,有利于增加种群多样性、扩大搜索范围,不至于陷入局部最优。每一步完全随机且各向同性,步长分布重尾分布。
② 布朗运动
步长分布正态分布。
模拟布谷鸟的Levy飞行和巢寄生机制/寄生式育雏
(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,直至达到最大迭代次数或者满足终止条件,则算法终止。
%% 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
(1)结果输出:迭代次数+最小适应度值+最优解+算法运行时间
(2)图像输出:“迭代次数-适应度值”散点图