Halcom 发表于 2019-8-7 22:10:29

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

kai123 发表于 2020-6-9 09:55:31

很优秀的代码

horaik 发表于 2020-6-15 16:17:04

不能用啊,没有适应度函数
页: [1]
查看完整版本: 3-BFO_PSO_PID--细菌觅食算法和粒子群算法的混合算法