当前位置 : 主页 > 编程语言 > python >

【优化调度】基于粒子群算法解决经济调度附Matlab代码

来源:互联网 收集:自由互联 发布时间:2022-09-29
1 内容介绍 经济负载调度问题是在满足约束的同时以最小的成本将负载分配给工厂。它被制定为一个优化问题,即在满足需求和损失的同时,最大限度地降低所有承诺工厂的总燃料成本

1 内容介绍

经济负载调度问题是在满足约束的同时以最小的成本将负载分配给工厂。它被制定为一个优化问题,即在满足需求和损失的同时,最大限度地降低所有承诺工厂的总燃料成本。这些问题的变体很多,它们以不同的方式模拟目标和约束。

基本经济调度问题在数学上可以描述为最小化受约束的所有承诺工厂的总燃料成本的最小化问题。

【优化调度】基于粒子群算法解决经济调度附Matlab代码_sed

2 部分代码

% pso_Trelea_vectorized.m

% 通用粒子群优化器

% 以查找任何项的最小值或最大值

% 味精矩阵函数


%

% 使用率:

% [选择选项]=PSO(函数名,D)

% 或:

% [选择输出,tr,te]=...

% PSO(functname,D,mv,VarRange,minmax,PSOparams,plotfcn,PSOseedValue)

%

% 输入:

% 函子名 - 要优化的 matlab 函数字符串

% D - 函数输入的 # (问题的维度)

%    

% 可选输入:

% mv - 最大粒子速度,标量或长度为 D 的向量

%(这允许每个组件具有自己的最大速度),

% 默认值 = 4,如果未输入,则设置为 NaN 或输入

%

% 变量范围 - 每个输入变量的范围矩阵,

% 默认值 -100 到 100,格式为:

% [ 最小值1 最大值1

% 最小值2 最大值2

%            ...

% 最小值 最大值 ]

%

% 最小值 = 0,函数最小化(默认值)

% = 1,函数最大化

% = 2,函数以 P(12) 为目标(最小化到遍历的距离)

% PS蛋白酶 - PSO 参数

% P(1) - 更新显示之间的时间,默认值 = 100。如果为 0,

%             no display

%      P(2) - Maximum number of iterations (epochs) to train, default = 2000.

%      P(3) - population size, default = 24

%

%      P(4) - acceleration const 1 (local best influence), default = 2

%      P(5) - acceleration const 2 (global best influence), default = 2

%      P(6) - Initial inertia weight, default = 0.9

%      P(7) - Final inertia weight, default = 0.4

%      P(8) - Epoch when inertial weight at final value, default = 1500

%      P(9)- minimum global error gradient, 

%                 if abs(Gbest(i+1)-Gbest(i)) < gradient over 

%                 certain length of epochs, terminate run, default = 1e-25

%      P(10)- epochs before error gradient criterion terminates run, 

默认值 % = 150(如果 SSE 在 250 个纪元内未更改)

% 然后退出

% P(11)- 误差目标,如果 NaN 则无约束最小值或最大值,则默认值为 NaN

% P(12)- 类型标志(使用哪种 PSO)

% 0 = 带间质的普通 PSO(默认)

% 1,2 = 特雷利类型 1,2

% 3 = 克莱尔克收缩 PSO,类型 1”

% P(13)- PS 已确定,默认值为 0

% = 0 表示初始仓位全部随机

% = 1 表示作为用户输入的初始粒子

%

% 绘图fcn - 绘图函数的可选名称,默认的“主题”,

%自己做,放在这里

%

% PS已摄取值 - 初始粒子位置,取决于 P(13),必须为

如果 P(13) 是 1 或 2,不用于 P(13)=0,则需要

% 为 nXm,其中 n<= ps,并且 m<= D

% 如果 n<ps 和/或 m<D,则剩余值是随机设置的

% 在瓦朗日上

% 输出:

% optOUT - 最佳输入和关联的最小/最大输出功能,形式为:

%        [ bestin1

%          bestin2


如果存在(“PSOSE值”)

tmpsz=size(PSOSEValue);

如果 D <(2)

错误(“PSOSE值列大小必须为D或更小”);

结束

如果 ps < tmpsz(1)

错误(“PSOSE值行长度必须为粒子数或更少”);

结束

结束

 

% 设置绘图标志

如果 (P(1))~=0

情节flg=1;

情节流 =0;

结束


% 预分配变量以加快速度

tr = 一(1,me)*纳纳;


% 负责在此处设置最大速度和位置参数

如果长度(mv)==1

velmaskmin = -mv*一% 最小值,psXD 矩阵

velmaskmax = mv*一(ps,D);% 最大垂直度

elseif 长度(mv)==D


if (迭代贝斯特-错误)^2 <= (gbestval-ergoal)^2

格贝斯特瓦尔 = 伊特贝斯特瓦尔;

gbest = pbest(idx1,:);

% 与训练方案一起使用,用于神经网络训练

% 在每次迭代时将 gbest 分配给净值,这些临时分配

% 主要用于绘图

if strcmp(functname,'pso_neteval(i-250:i,(bestpos(i-250:i,dimcnt))',20);

 %     % pred_coef  = polyfit(200:i,(bestpos(200:i,dimcnt))',20);       

 %      gbest_pred(i,dimcnt) = polyval(pred_coef,i+1);

 %    end

 %    else 

%       gbest_pred(i,:) = zeros(size(gbest));

%    end

  

   %gbest_pred(i,:)=gbest;    

   %assignin('base','gbest_pred',gbest_pred);


 %   % convert to non-inertial frame

 %    gbestoffset = gbest - gbest_pred(i,:);

 %    gbest = gbest - gbestoffset;

 %    pos   = pos + repmat(gbestoffset,ps,1);

 %    pbest = pbest + repmat(gbestoffset,ps,1);

 

     %PSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSO


      % get new velocities, positions (this is the heart of the PSO algorithm)     

      % each epoch get new set of random numbers

       rannum1 = rand([ps,D]); % for Trelea and Clerc types

       rannum2 = rand([ps,D]);       

       if     trelea == 2    

        % from Trelea's paper, parameter set 2

         vel = 0.729.*vel...                              % prev vel

               +1.494.*rannum1.*(pbest-pos)...            % independent

               +1.494.*rannum2.*(repmat(gbest,ps,1)-pos); % social  

       elseif trelea == 1

        % from Trelea's paper, parameter set 1                     

         vel = 0.600.*vel...                              % prev vel

               +1.700.*rannum1.*(pbest-pos)...            % independent

               +1.700.*rannum2.*(repmat(gbest,ps,1)-pos); % social 

       elseif trelea ==3

        % Clerc's Type 1" PSO

         vel = chi*(vel...                                % prev vel

               +ac1.*rannum1.*(pbest-pos)...              % independent

               +ac2.*rannum2.*(repmat(gbest,ps,1)-pos)) ; % social          

       else

        % common PSO algo with inertia wt 

        % get inertia weight, just a linear funct w.r.t. epoch parameter iwe

         if i<=iwe

            iwt(i) = ((iw2-iw1)/(iwe-1))*(i-1)+iw1;

         else

            iwt(i) = iw2;

         end

        % random number including acceleration constants

         ac11 = rannum1.*ac1;    % for common PSO w/inertia

         ac22 = rannum2.*ac2;

         

         vel = iwt(i).*vel...                             % prev vel

               +ac11.*(pbest-pos)...                      % independent

               +ac22.*(repmat(gbest,ps,1)-pos);           % social                  

       end

       

       % limit velocities here using masking

        vel = ( (vel <= velmaskmin).*velmaskmin ) + ( (vel > velmaskmin).*vel );

        vel = ( (vel >= velmaskmax).*velmaskmax ) + ( (vel < velmaskmax).*vel );     

        

       % update new position (PSO algo)    

        pos = pos + vel;

    

       % position masking, limits positions to desired search space

       % method: 0) no position limiting, 1) saturation at limit,

       %         2) wraparound at limit , 3) bounce off limit

        minposmask_throwaway = pos <= posmaskmin;  % these are psXD matrices

        minposmask_keep      = pos >  posmaskmin;     

        maxposmask_throwaway = pos >= posmaskmax;

        maxposmask_keep      = pos <  posmaskmax;

     

        if     posmaskmeth == 1

         % this is the saturation method

          pos = ( minposmask_throwaway.*posmaskmin ) + ( minposmask_keep.*pos );

          pos = ( maxposmask_throwaway.*posmaskmax ) + ( maxposmask_keep.*pos );      

        elseif posmaskmeth == 2

         % this is the wraparound method

          pos = ( minposmask_throwaway.*posmaskmax ) + ( minposmask_keep.*pos );

          pos = ( maxposmask_throwaway.*posmaskmin ) + ( maxposmask_keep.*pos );                

        elseif posmaskmeth == 3

         % this is the bounce method, particles bounce off the boundaries with -vel      

          pos = ( minposmask_throwaway.*posmaskmin ) + ( minposmask_keep.*pos );

          pos = ( maxposmask_throwaway.*posmaskmax ) + ( maxposmask_keep.*pos );


          vel = (vel.*minposmask_keep) + (-vel.*minposmask_throwaway);

          vel = (vel.*maxposmask_keep) + (-vel.*maxposmask_throwaway);

        else

         % no change, this is the original Eberhart, Kennedy method, 

         % it lets the particles grow beyond bounds if psoparams (P)

         % especially Vmax, aren't set correctly, see the literature

        end


     %PSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSOPSO

% check for stopping criterion based on speed of convergence to desired 

   % error   

    tmp1 = abs(tr(i) - gbestval);

    if tmp1 > ergrd

       cnt2 = 0;

    elseif tmp1 <= ergrd

       cnt2 = cnt2+1;

       if cnt2 >= ergrdep

         if plotflg == 1

          fprintf(message,i,gbestval);           

          disp(' ');

          disp(['--> Solution likely, GBest hasn''t changed by at least ',...

              num2str(ergrd),' for ',...

                  num2str(cnt2),' epochs.']);  

          eval(errgoal)

     if ((gbestval<=errgoal) & (minmax==0)) | ((gbestval>=errgoal) & (minmax==1))  


         if plotflg == 1

             fprintf(message,i,gbestval);

             disp(' ');            

             disp(['--> Error Goal reached, successful termination!']);

             

             eval((tr(i)<errgoal) & (gbestval>=errgoal)) | ((tr(i)>errgoal) ...

               & (gbestval <= errgoal))        

         if plotflg == 1

             fprintf(message,i,gbestval);

             disp(' ');            

             disp(['--> Error Goal reached, successful termination!']);            

             

             eval(gbestoffset,ps,1);

 %     pbest = pbest - repmat(gbestoffset,ps,1);

 %     gbest = gbest + gbestoffset;

  


end  % end epoch loop


%% clear temp outputs

% eval(find(~isnan(tr)))];

 

 return

3 运行结果

【优化调度】基于粒子群算法解决经济调度附Matlab代码_scala_02

4 参考文献

[1]芮钧, 陈守伦. MATLAB粒子群算法工具箱求解水电站优化调度问题[J]. 中国农村水利水电, 2009(1):3.

[2]解玖霞. 基于粒子群算法的主动配电网经济优化调度[J]. 电气技术, 2017(9):4.

部分理论引用网络文献,若有侵权联系博主删除。


网友评论