3-BFO_PSO_PID--细菌觅食算法和粒子群算法的混合算法
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 = ; % x min
popmax = ; % x max
Cmin = [-2,-2,-2]; % 最小步长
Cmax = ; % 最大步长
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
%% 记录一组最优值
=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 趋化次数
% 复制操作
= 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',)
plot(fitness_iter,'ro-','linewidth',2)
% loglog(fitness_iter,'ro-','linewidth',2)
axis tight
grid on
figure('color',) % 绘制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
=PID_Fun_1_response(zbest);
elseif(choosed==2)
=PID_Fun_2_response(zbest);
elseif(choosed==3)
=PID_Fun_3_response(zbest);
elseif(choosed==4)
=PID_Fun_4_response(zbest);
end
figure('color',)
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
很优秀的代码 不能用啊,没有适应度函数
页:
[1]