Halcom 发表于 2019-4-14 22:56:57

23-基于BFO的临界水深优化和PID优化

23-基于BFO的临界水深优化和PID优化、改进的BFO算法、PSO算法优化的BFO算法优化的PID参数整定
百度网盘链接:https://pan.baidu.com/s/12Zs78YjBZGa_37u70dzY9w 提取码:o4yh

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

代码如下:
function fitness = PID_Fun(Kpid)
ts=0.001;
sys = tf( , );
dsys = c2d(sys, ts, 'z');
= tfdata( dsys, 'v' );
u_1 = 0; u_2=0;
y_1 = 0; y_2=0;
error_1 = 0;
x = ';
for k=1:300
    timef(k) = k*ts;
    r(k) = 1;
    u(k) = Kpid(1)*x(1)+Kpid(2)*x(2)+Kpid(3)*x(3);
    yout(k) = -den(2)*y_1 -den(3)*y_2 + num(2)*u_1 + num(3)*u_2;
    error(k) = r(k) - yout(k);
    % PID参数返回值
    u_2 = u_1;
    u_1 = u(k);
    y_2 = y_1;
    y_1 = yout(k);
   
    x(1) = error(k);            % Kp
    x(2) = x(2) + error(k)*ts;    % KI
    x(3) = (error(k)-error_1)/ts; % KD
   
    error_1 = error(k);
end
fitness = sum( abs(error) ) + 300*min( abs( error ) );
主函数如下:clc,clear,close all
warning off
format longG
% BFO优化算法 参数
sizepop = 10;            % 种群数量
Nc = 10;                   % 趋化次数
Ns = 2;                  % 游动次数
Nre = 2;                   % 复制次数
Ned = 2;                   % 驱散(迁移)次数
Sr = ceil( sizepop/2 );    % 复制(分裂)次数
Ped = 0.25;                           % 细菌驱散(迁移)概率
wmax = 0.9;
wmin = 0.1;
%% PID参数优化问题
nvar = 3;   % 3个未知量
popmin = -5;popmax = 15; % x
Cmin = -1;% 最小步长
Cmax = 1;   % 最大步长
C(:,:) = 0.1*ones(sizepop,nvar);            % 翻转选定方向后,单个细菌前进的步长
Vmin = -1;
Vmax = 1;
c1 = 1.49;
c2 = 1.49;
% 目标函数
fun = @(x)PID_Fun(x);
%% 初始化种群
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,:) = Vmin + (Vmax-Vmin).*rand(1,nvar);% 速度
end
%% 记录一组最优值
=min(fitness);
zbest=pop(bestindex,:);   % 全局最佳
fitnesszbest=bestfitness; % 全局最佳适应度值
gbest =pop;
fitnessgbest = fitness;
NcSizepop = 0;            % 记录最优适应度值(函数值)
%% 迭代寻优
for i = 1:Ned                   % 驱散(迁移)次数
    for k = 1:Nre               % 复制次数
      
      for m = 1:Nc            % 趋化次数
            for j=1:sizepop   % 种群

                favg = mean(fitness);
                fmin = min(fitness);
                if(fitness(j)<=favg)
                  w=wmin+(wmax-wmin)*(fitness(j)-fmin)./(favg-fmin+eps);
                else
                  w = wmax;
                end
               
                % 翻转
                V(j,:) = w*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,:) + w*V(j,:);
               
                % x
                for ij=1:nvar
                  if pop(j,ij)>popmax
                        pop(j,ij)=popmax;
                  end
                  if pop(j,ij)<popmin
                        pop(j,ij)=popmin;
                  end
                end
               
                % 更新当前适应度值
                fitness(j) = fun(pop(j,:));
                % 游动
                if(fitness(j)<fitnessgbest(j))
                  gbest(j,:) = pop(j,:);
                  fitnessgbest(j) = fitness(j);
                end
                if(fitness(j)<bestfitness)
                  zbest = pop(j,:);
                  bestfitness = fitness(j);
                end
               
            end   % sizepop种群数量
            
            % 记录最优适应度值
            NcSizepop = NcSizepop+1;
            fitness_iter(NcSizepop) = bestfitness;
      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))<bestfitness
                bestfitness = 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)<bestfitness
                bestfitness = fitness(j);
                zbest =pop(j,:);
            end
      end
    end
   
end       % Ned   驱散(迁移)次数
%% 显示
disp('最优解')
disp(['最优解: ', num2str( zbest )])
fprintf('\n')
disp(['最优解对应的目标函数值: ', num2str( bestfitness )])
%% 画图适应度
figure('color',)
plot(fitness_iter,'ro-','linewidth',2)
% loglog(fitness_iter,'ro-','linewidth',2)
axis tight
grid on

%% 响应曲线
= PID_Fun_response(zbest);
figure;hold on;
plot(rint_BFO,'r-','linewidth',2);
plot(yout_BFO,'b.-','linewidth',2);
legend('阶跃控制信号','BFO算法优化的PID控制')
axis()
hold off

参考文献:
【1】粒子群优化在临界水深计算中的应用
【2】基于人群搜索算法的PID控制器参数优化


页: [1]
查看完整版本: 23-基于BFO的临界水深优化和PID优化