% Dung Beetle Optimizer: (DBO) (demo)
% Programmed by Jian-kai Xue
% Updated 28 Nov.2022.
function [bestX, fMin, Convergence_curve] = DBO(pop, M, c, d, dim, fobj)
P_percent = 0.2; % 执行滚球行为的蜣螂比例
pNum = round(pop * P_percent); % 执行滚球行为的蜣螂数量
lb = c.*ones(1,dim); % 取值下限向量
ub = d.*ones(1,dim); % 取值上限向量
% 种群初始化
for i = 1 : pop
x(i,:) = lb + (ub - lb) .* rand(1,dim);
fit(i) = fobj(x(i,:)) ;
end
pFit = fit;
pX = x;
XX = pX;
[fMin, bestI] = min(fit); % fMin是全局最优适应度值
bestX = x(bestI,:); % bestX是与fMin对应的全局最优解
% 开始迭代,进行个体更新
for t = 1 : M
[fmax, B] = max(fit);
worse = x(B,:);
r2 = rand(1);
% 滚球行为蜣螂的位置更新(分为无障碍物模式和有障碍物模式)
for i = 1 : pNum
if(r2<0.9)
% ①无障碍物模式
a = rand(1,1);
if (a>0.1)
a = 1;
else
a = -1;
end
x(i,:) = pX(i,:)+0.3*abs(pX(i,:)-worse)+a*0.1*(XX(i,:));
else
% ②有障碍物模式
aaa = randperm(180,1);
if (aaa==0 ||aaa==90 ||aaa==180)
x(i,:) = pX(i,:);
end
theta = aaa*pi/180;
x(i,:) = pX(i,:)+tan(theta).*abs(pX(i,:)-XX(i,:));
end
% 越界校正
x(i,:) = Bounds(x(i,:), lb, ub);
fit(i) = fobj(x(i,:));
end
[fMMin, bestII] = min(fit); % fMin是当前的最优适应度值
bestXX = x(bestII,:); % bestXX是当前的最优解
R = 1-t/M;
Xnew1 = bestXX.*(1-R);
Xnew2 = bestXX.*(1+R);
Xnew1 = Bounds(Xnew1, lb, ub);
Xnew2 = Bounds(Xnew2, lb, ub);
% 繁殖行为蜣螂的位置更新
for i = (pNum + 1) : 12
x(i,:) = bestXX+((rand(1,dim)).*(pX(i,:)-Xnew1)+(rand(1,dim)).*(pX(i,:)-Xnew2));
x(i,:) = Bounds(x(i,:), Xnew1, Xnew2);
fit(i) = fobj(x(i,:)) ;
end
Xnew11 = bestX.*(1-R);
Xnew22 = bestX.*(1+R);
Xnew11 = Bounds(Xnew11, lb, ub);
Xnew22 = Bounds(Xnew22, lb, ub);
% 觅食行为小蜣螂的位置更新
for i = 13 : 19
x(i,:) = pX(i,:)+((randn(1)).*(pX(i,:)-Xnew11)+((rand(1,dim)).*(pX(i,:)-Xnew22)));
x(i,:) = Bounds(x(i,:), lb, ub);
fit(i) = fobj(x(i,:));
end
% 偷窃行为蜣螂的位置更新
for j = 20 : pop
x(j,:) = bestX+randn(1,dim).*((abs((pX(j,:)-bestXX)))+(abs((pX(j,:)-bestX))))./2;
x(j,:) = Bounds(x(j,:), lb, ub);
fit(j) = fobj(x(j,:)) ;
end
% 更新个体最优值和全局最优值
XX = pX;
for i = 1 : pop
if (fit(i) < pFit(i))
pFit(i) = fit(i);
pX(i,:) = x(i,:);
end
if( pFit(i) < fMin)
fMin = pFit(i);
bestX = pX(i,:);
end
end
% 迭代曲线记录
Convergence_curve(t) = fMin;
display(['第',num2str(t),'代的适应度值为: ', num2str(fMin)]);
end
% 越界校正函数
function s = Bounds(s, Lb, Ub)
temp = s;
I = temp < Lb;
temp(I) = Lb(I);
J = temp > Ub;
temp(J) = Ub(J);
s = temp;
天`南
- 粉丝: 1290
- 资源: 270
最新资源
- 自考02197概率论与数理统计(二)试卷及答案解释2016-2021
- java毕设项目之游戏分享网站lw(完整前后端+说明文档+mysql).zip
- java毕设项目之ssm助学贷款+jsp(完整前后端+说明文档+mysql+lw).zip
- IBM Instana应用性能监视.pptx
- webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
- 黑马最新Hive存储压缩与优化课程总结
- 商城系统项目源代码全套技术资料.zip
- 番茄图像目标检测数据【已标注,约4,300张数据,YOLO 标注格式】
- 校园生活相关项目源代码全套技术资料.zip
- C语言上机实验_1.pptx
- 基于遗传算法求解TSP问题的研究 50个样本点
- 基于XGBoost的振动数据预警模型与参数优化技术-构建一个基于XGBoost的振动信息数据集预警模型 首先引入算法实现动态阈值设置,然后进行参数优化
- sublimeText 4
- 西红柿叶片缺陷分类数据集【已标注,约500张数据】
- 自考00023《高等数学(工本)》试题及答案及复习资料
- 智能点阵笔项目源代码全套技术资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈