|
3-BFO_PSO_PID--细菌觅食算法和粒子群算法的混合算法
百度网盘链接:https://pan.baidu.com/s/1S6cq5LqSl3PujfUFPhIzTQ 提取码:u1sj
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
程序如下:
- clc,clear,close all
- warning off
- format longG
- addpath(genpath('./PID_funtion'))
- % BFO优化算法 参数
- Nc = 5; % 趋化次数
- Ns = 4; % 游动次数
- Nre = 4; % 复制次数
- Ned = 4; % 驱散(迁移)次数
- sizepop = 10; % 种群数量
- Sr = ceil( sizepop/2 ); % 复制(分裂)次数
- Ped = 0.25; % 细菌驱散(迁移)概率
- nvar = 3; % 3个未知量
- popmin = [0,0,0]; % x min
- popmax = [30,30,30]; % x max
- Cmin = [-2,-2,-2]; % 最小步长
- Cmax = [2,2,2]; % 最大步长
- C(:,:) = 0.001*ones(sizepop,nvar); % 翻转选定方向后,单个细菌前进的步长
- %% PSO参数
- c1 = 1.4995;
- c2 = 1.4995;
- Vmin = -1;
- Vmax = 1;
- %% 适应度函数,也就是我们的目标函数
- %% 适应度函数
- choosed = 4;
- if choosed==1
- fun = @(x)PID_Fun_1(x);
- elseif(choosed==2)
- fun = @(x)PID_Fun_2(x);
- elseif(choosed==3)
- fun = @(x)PID_Fun_3(x);
- elseif(choosed==4)
- fun = @(x)PID_Fun_4(x);
- end
- %% 初始化种群
- for i=1:sizepop
- pop(i,:) = popmin + (popmax-popmin).*rand(1,nvar); % 初始化个体
- fitness(i) = fun( pop(i,:) ); % 适应度值
- C(i,:) = Cmin + (Cmax-Cmin).*rand(1,nvar); % 步长
- V(i,1:nvar) = 0; % 粒子群速度
- end
- %% 记录一组最优值
- [bestfitness,bestindex]=min(fitness); % 目标值越小越好
- zbest=pop(bestindex,:); % 全局最佳
- fitnesszbest=bestfitness; % 全局最佳适应度值
- gbest=pop; %个体最佳
- fitnessgbest=fitness; %个体最佳适应度值
- NcSizepop = 0; % 记录最优适应度值(函数值)
- %% 迭代寻优
- for i = 1:Ned % 驱散(迁移)次数
- disp(['当前驱散(迁移)次数 i=', num2str(i), ' , 驱散(迁移)次数 Ned=', num2str(Ned)])
- for k = 1:Nre % 复制次数
- disp(['复制次数 k=', num2str(k), ' , 复制次数 Nre=', num2str(Nre)])
- for m = 1:Nc % 趋化次数
- disp(['趋化次数 m=', num2str(m), ' , 趋化次数 Nc=', num2str(Nc)])
- for j=1:sizepop % 种群
-
- % 翻转
- % PSO+BFO
- % 速度更新
- V(j,:) = 0.5*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
- % 越界约束
- for ij = 1:nvar
- if V(j,ij)>Vmax,
- V(j,ij)=Vmax;
- end
- if V(j,ij)<Vmin,
- V(j,ij)=Vmin;
- end
- end
- pop(j,:) = pop(j,:) + C(j,:).*V(j,:);
-
- % 取值范围约束
- pop(j,:) = lb_ub(pop(j,:), popmin, popmax);
-
- % 更新当前适应度值
- fitness(j) = fun(pop(j,:));
- % 游动
- n=0;
- while(n<Ns) % 游动次数
- delta = 2*rand(1,nvar)-0.5;
- newpop = pop(j,:) + C(j,:).*delta./(sqrt( delta*delta' ));
- newpop = lb_ub(newpop,popmin,popmax);
- newfitness = fun(newpop);
- if(newfitness<fitness(j))
- fitness(j) = newfitness;
- pop(j,:) = newpop;
- end
-
- if fitness(j)<fitnessgbest(j)
- fitnessgbest(j) = fitness(j);
- gbest(j,:) = pop(j,:);
- else % 不更新适应度值
- n=Ns;
- end
- end
-
- % 适应度更新
- % 比较 个体间比较
- if fitness(j)<fitnesszbest
- fitnesszbest = fitness(j);
- zbest = pop(j,:);
- end
- end % sizepop 种群数量
-
- % 移动步长更新
- C(j,:) = C(j,:).*exp(-j./sizepop).*sin(pi/Ns);
-
- % 记录最优适应度值
- NcSizepop = NcSizepop+1;
- fitness_iter(NcSizepop) = fitnesszbest;
-
- K_p(1,NcSizepop) = zbest(1);
- K_i(1,NcSizepop) = zbest(2);
- K_d(1,NcSizepop) = zbest(3);
-
- end % Nc 趋化次数
-
- % 复制操作
- [maxF,index] = sort(fitness,'descend'); % 降序排列
- for Nre2 = 1:Sr % 将最大适应度值的Sr个种群,进行更新
- pop(index(Nre2),:) = popmin + (popmax-popmin).*rand(1,nvar);
- fitness(index(Nre2)) = fun(pop(index(Nre2),:));
- C(index(Nre2),:) = Cmin + (Cmax-Cmin).*rand(1,nvar); % 步长
- % 比较 个体间比较
- if fitness(index(Nre2))<fitnesszbest
- fitnesszbest = fitness(index(Nre2));
- zbest = pop(index(Nre2),:);
- end
- end
- end % Nre 复制操作
-
- for j=1:sizepop % 种群
- if Ped>rand
- pop(j,:) = popmin + (popmax-popmin).*rand(1,nvar);
- fitness(j) = fun(pop(j,:));
- % 比较 个体间比较
- if fitness(j)<fitnesszbest
- fitnesszbest = fitness(j);
- zbest = pop(j,:);
- end
- end
- end
-
- end % Ned 驱散(迁移)次数
- %% 显示最优解
- disp('最优解')
- disp(zbest)
- fprintf('\n')
- disp(['最优解Kp=', num2str(zbest(1))])
- disp(['最优解Ki=', num2str(zbest(2))])
- disp(['最优解Kd=', num2str(zbest(3))])
- figure('color',[1,1,1])
- plot(fitness_iter,'ro-','linewidth',2)
- % loglog(fitness_iter,'ro-','linewidth',2)
- axis tight
- grid on
- figure('color',[1,1,1]) % 绘制PID控制器参数变化曲线
- plot(K_p,'b-','LineWidth',2); hold on
- plot(K_i,'k-.','LineWidth',2)
- plot(K_d,'r--','LineWidth',2)
- title('Kp、Ki、Kd 优化曲线','fontsize',10);
- xlabel('迭代次数','fontsize',10); ylabel('参数值','fontsize',10);
- set(gca,'Fontsize',10);
- legend('Kp','Ki','Kd',1);
- grid on;hold off;
- %% 响应曲线
- % PID响应
- if choosed==1
- [rint, yout]=PID_Fun_1_response(zbest);
- elseif(choosed==2)
- [rint, yout]=PID_Fun_2_response(zbest);
- elseif(choosed==3)
- [rint, yout]=PID_Fun_3_response(zbest);
- elseif(choosed==4)
- [rint, yout]=PID_Fun_4_response(zbest);
- end
- figure('color',[1,1,1])
- plot(rint,'b-','linewidth',2);hold on;
- plot(yout,'r.-','linewidth',2);
- axis tight;grid on;
- hold off;
- legend('输入信号','阶跃响应曲线')
- xlabel('time(s)');
- ylabel('Amp');
- rmpath(genpath('./PID_funtion'))
复制代码 参考:http://halcom.cn/forum.php?mod=viewthread&tid=3614&extra=page%3D1
|
|