logo资料库

细菌觅食算法matlab实现.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% %*********************细菌觅食算法********************** %%%%%%%%%%%%%%%%%%%-----BFA 算法-----%%%%%%%%%%%%%%%%%%% clear; clc; %-----(1)初始化参数----- bounds = [-5.12 5.12;-5.12 5.12]; % 函数变量范围 p = 2; s = 26; % 细菌的个数 Nc = 50; % 趋化的次数 Ns = 4; % 趋化操作中单向运动的最大步数 C(:,1) = 0.001*ones(s,1); % 翻转选定方向后,单个细菌前进的步长 Nre = 4; Ned = 2; Sr = s/2; % 每代复制(分裂)数 Ped = 0.25; % 细菌驱散(迁移)概率 d_attract = 0.05; ommiga_attract = 0.05; % 吸引剂的释放速度 h_repellant = 0.05; ommiga_repellant = 0.05;% 排斥剂的释放速度 for i = 1:s % 复制操作步骤数 % 驱散(迁移)操作数 % 产生初始细菌个体的位置 % 搜索范围的维度 % 吸引剂的数量 % 排斥剂的数量 P(1,i,1,1,1) = -5.12 + rand*10.24; P(2,i,1,1,1) = -5.12 + rand*10.24; end %------------------细菌趋药性算法循环开始--------------------- %-----(2)驱散(迁移)操作开始----- for l = 1:Ned %-----(3)复制操作开始----- for k = 1:Nre %-----(4)趋化操作(翻转或游动)开始----- for j = 1:Nc %-----(4.1)对每一个细菌分别进行以下操作----- for i = 1:s %-----(4.2)计算函数 J(i,j,k,l),表示第 i 个细菌在第 l 次驱散第 k 次 %----------复制第 j 次趋化时的适应度值----- J(i,j,k,l) = Cost(P(:,i,j,k,l)); %-----(4.3)修改函数,加上其它细菌对其的影响----- Jcc = sum(-d_attract*exp(-ommiga_attract*((P(1,i,j,k,l)-... P(1,1:26,j,k,l)).^2+(P(2,i,j,k,l)-P(2,1:26,j,k,l)).^2))) +... sum(h_repellant*exp(-ommiga_repellant*((P(1,i,j,k,l)-... P(1,1:26,j,k,l)).^2+(P(2,i,j,k,l)-P(2,1:26,j,k,l)).^2))); J(i,j,k,l) = J(i,j,k,l) + Jcc; %-----(4.4)保存细菌目前的适应度值,直到找到更好的适应度值取代之
----- 位置----- Jlast = J(i,j,k,l); %-----(4.5)翻转,产生一个随机向量 C(i),代表翻转后细菌的方向----- Delta(:,i) = (2*round(rand(p,1))-1).*rand(p,1); % PHI 表示翻转后选择的一个随机方向上前进 PHI = Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i)); %-----(4.6)移动,向着翻转后细菌的方向移动一个步长,并且改变细菌的 P(:,i,j+1,k,l) = P(:,i,j,k,l) + C(i,k)*PHI; %-----(4.7)计算细菌当前位置的适应度值----- J(i,j+1,k,l) = Cost(P(:,i,j+1,k,l)); %-----(4.8)游动----- m = 0; % 给游动长度计数器赋初始值 while(m < Ns) % 未达到游动的最大长度,则循环 m = m + 1; % 新位置的适应度值是否更好?如果更好,将新位置的适应度值 % 存储为细菌 i 目前最好的适应度值 if(J(i,j+1,k,l) < Jlast) Jlast = J(i,j+1,k,l); %保存更好的适应度值 % 在该随机方向上继续游动步长单位,修改细菌位置 P(:,i,j+1,k,l) = P(:,i,j+1,k,l) + C(i,k)*PHI; % 重新计算新位置上的适应度值 J(i,j+1,k,l) = Cost(P(:,i,j+1,k,l)); else end % 否则,结束此次游动 m = Ns; end J(i,j,k,l) = Jlast; % 更新趋化操作后的适应度值 end % 如果 i
[Jhealth,sortind] = sort(Jhealth); % 按健康函数值升序排列函数 P(:,:,1,k+1,l) = P(:,sortind,Nc+1,k,l); C(:,k+1) = C(sortind,k); %-----(6.2)将代价小的一半细菌分裂成两个,代价大的一半细菌死亡----- for i = 1:Sr % 健康值较差的 Sr 个细菌死去,Sr 个细菌分裂成两个子细菌,保持个体总数 的 s 一致性 end P(:,i+Sr,1,k+1,l) = P(:,i,1,k+1,l); C(i+Sr,k+1) = C(i,k+1); %-----(7)如果 k rand) P(1,m,1,1,1) = -5.12 + rand*10.24; P(2,m,1,1,1) = -5.12 + rand*10.24; P(:,m,1,1,l+1) = P(:,m,1,Nre+1,l); % 未驱散的细菌 else end end end % 如果 l
% % x=fix(100*rand(2,1)); % % % % % % % fposition=p*q+(x(1)+1.42513)^2+(x(2)+.80032)^2; p=0;q=0; for k=1:5 p=p+k*cos((k+1)*x(1)+k); q=q+k*cos((k+1)*x(2)+k); end
分享到:
收藏