1 简介
为了解决布谷鸟搜索算法寻优精度不高,收敛速度慢,后期搜索活力不足以及处理高维优化问题时存在维间干扰等缺陷,提出了逐维反向学习策略的动态适应布谷鸟算法.首先,对选择更新后的解进行逐维反向学习,减少维间干扰,扩大种群多样性;然后,使用精英保留方式评价该结果,提高算法寻优能力;最后,充分利用当前解的信息进行动态适应的缩放因子控制,引导解快速收敛,提升算法搜索活力.实验结果表明,该算法相比较于标准布谷鸟搜索算法,寻优精度,收敛速度以及后期搜索活力有所提高,与其他改进算法相比也具有一定的竞争优势.
布谷鸟算法的基本原理就是把蛋所寄生的巢穴位置映射为算法种群空间中的解,以寄生巢穴位置的优劣作为算法的适应度值。为了模拟布谷鸟的繁衍机制,算法设定了三个理想规则:
a) 每只布谷鸟只产一个蛋,并随机放入所选择的寄主鸟类的巢穴中;
b) 每次进化都保留最优蛋的巢穴到下一代; c) 可用的寄主巢穴数量固定,且寄主鸟类以概率 R∈( 0,1) 发现布谷鸟放的蛋。
2 部分代码
function [fmin, bestnest, Curve] = CS(nest, N, Max_iter, Lb, Ub, dim, fobj)
%% CS参数
% 发现概率
pa = 0.25;
% 初始最优解
fitness = 10^10*ones(N, 1);
[fmin, bestnest, nest, fitness] = get_best_nest(nest, nest, fitness);
% N_iter = 0;
%% 迭代寻优
for iter = 1:Max_iter
%% 通过莱维飞行得到新个体
beta = 3/2;
sigma = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
for i = 1:N
s = nest(i, :);
% 用蒙特卡洛方法模拟莱维飞行
u = randn(size(s))*sigma;
v = randn(size(s));
step = u./abs(v).^(1/beta);
stepsize = 0.01*step.*(s-bestnest);
s=s+stepsize.*randn(size(s));
% 边界处理
new_nest(i, :) = simplebounds(s, Lb, Ub);
end
% 新个体和旧个体适应度值贪婪比较,选取最优个体
[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
%% 记录每代最优解
Curve(iter) = fmin;
%% 显示每代优化结果
display(['CS:At iteration ', num2str(iter), ' the best fitness is ', num2str(fmin)]);
end
%% Display all the nests
% disp(strcat('Total number of iterations=', num2str(N_iter)));
%% 最终结果显示
disp(['最终位置:' , num2str(bestnest)]);
disp(['最终函数值:', num2str(Curve(end))]);
% %% 绘图
% figure;
% plot(Curve, 'r', 'lineWidth', 2); % 画出迭代图
% xlabel('迭代次数', 'fontsize', 12);
% ylabel('目标函数值', 'fontsize', 12);
%% ---------------下面列出了所有子函数------------------
%% 发现最优位置
function [fmin, best, nest, fitness] = get_best_nest(nest, newnest, fitness)
for j = 1:size(nest,1)
fnew = fobj(newnest(j,:));
if fnew <= fitness(j)
fitness(j) = fnew;
nest(j, :) = newnest(j, :);
end
end
% Find the current best
[fmin, K] = min(fitness) ;
best = nest(K, :);
end
%% 通过构造新的个体来替代某些个体
function new_nest = empty_nests(nest, Lb, Ub, pa)
% 一小部分更糟的巢穴被发现的概率为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)
% Apply the lower bound
ns_tmp = s;
I = ns_tmp<Lb;
ns_tmp(I) = Lb;
% Apply the upper bounds
J = ns_tmp>Ub;
ns_tmp(J) = Ub;
% Update this new move
s = ns_tmp;
end
end
3 仿真结果
4 参考文献
[1]黄闽茗, 何庆, 文熙. 基于逐维反向学习的动态适应布谷鸟算法[J]. 计算机应用研究, 2020, 37(4):5.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。