时序预测 | MATLAB实现SSA-ELM麻雀算法优化极限学习机时间序列预测

时序预测 | MATLAB实现SSA-ELM麻雀算法优化极限学习机时间序列预测

效果一览

1
2

3

基本介绍

1.MATLAB实现SSA-ELM麻雀算法优化极限学习机时间序列预测;
2.单变量时间序列预测;
3.运行环境Matlab2018及以上,运行主程序main即可,其余为函数文件无需运行,所有程序放在一个文件夹,data为数据集;
4.SSA-ELM麻雀算法优化极限学习机权值和偏置,命令窗口输出RMSE、MAE、R2、MAPE等评价指标。

程序设计

function [Best_pos, Best_score, curve, avcurve] = SSA(pop, Max_iter, lb, ub, dim, fobj)

%%  参数设置       
ST = 0.8;                    % 预警值
PD = 0.2;                    % 发现者的比列,剩下的是加入者
PDNumber = pop * PD;         % 发现者数量
SDNumber = pop - pop * PD;   % 意识到有危险麻雀数量

%%  判断优化参数个数
if(max(size(ub)) == 1)
   ub = ub .* ones(1, dim);
   lb = lb .* ones(1, dim);  
end

%%  种群初始化
pop_lsat = initialization(pop, dim, ub, lb);
pop_new  = pop_lsat;

%%  计算初始适应度值
fitness = zeros(1, pop);
for i = 1 : pop
   fitness(i) =  fobj(pop_new(i, :));
end

%%  得到全局最优适应度值
[fitness, index]= sort(fitness);
GBestF = fitness(1); 

%%  得到全局最优种群
for i = 1 : pop
    pop_new(i, :) = pop_lsat(index(i), :);
end

GBestX = pop_new(1, :);
X_new  = pop_new;

%%  优化算法
for i = 1: Max_iter

   BestF = fitness(1);
   R2 = rand(1);

   for j = 1 : PDNumber
      if(R2 < ST)
          X_new(j, :) = pop_new(j, :) .* exp(-j / (rand(1) * Max_iter));
      else
          X_new(j, :) = pop_new(j, :) + randn() * ones(1, dim);
      end     
   end
   
   for j = PDNumber + 1 : pop
        if(j > (pop - PDNumber) / 2 + PDNumber)
          X_new(j, :) = randn() .* exp((pop_new(end, :) - pop_new(j, :)) / j^2);
        else
          A = ones(1, dim);
          for a = 1 : dim
              if(rand() > 0.5)
                A(a) = -1;
              end
          end
          AA = A' / (A * A');     
          X_new(j, :) = pop_new(1, :) + abs(pop_new(j, :) - pop_new(1, :)) .* AA';
       end
   end
   
   Temp = randperm(pop);
   SDchooseIndex = Temp(1 : SDNumber); 
   
   for j = 1 : SDNumber
       if(fitness(SDchooseIndex(j)) > BestF)
           X_new(SDchooseIndex(j), :) = pop_new(1, :) + randn() .* abs(pop_new(SDchooseIndex(j), :) - pop_new(1, :));
       elseif(fitness(SDchooseIndex(j)) == BestF)
           K = 2 * rand() -1;
           X_new(SDchooseIndex(j), :) = pop_new(SDchooseIndex(j), :) + K .* (abs(pop_new(SDchooseIndex(j), :) - ...
               pop_new(end, :)) ./ (fitness(SDchooseIndex(j)) - fitness(end) + 10^-8));
       end
   end

%%  边界控制
   for j = 1 : pop
       for a = 1 : dim
           if(X_new(j, a) > ub(a))
              X_new(j, a) = ub(a);
           end
           if(X_new(j, a) < lb(a))
              X_new(j, a) = lb(a);
           end
       end
   end 

%%  获取适应度值
   for j = 1 : pop
    fitness_new(j) = fobj(X_new(j, :));
   end
   
%%  获取最优种群
   for j = 1 : pop
       if(fitness_new(j) < GBestF)
          GBestF = fitness_new(j);
          GBestX = X_new(j, :);
       end
   end
   
%%  更新种群和适应度值
   pop_new = X_new;
   fitness = fitness_new;

%%  更新种群 
   [fitness, index] = sort(fitness);
   for j = 1 : pop
      pop_new(j, :) = pop_new(index(j), :);
   end

%%  得到优化曲线
   curve(i) = GBestF;
   avcurve(i) = sum(curve) / length(curve);
end

%%  得到最优值
Best_pos = GBestX;
Best_score = curve(end);

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/129215161
[2] https://blog.csdn.net/kjm13182345320/article/details/128105718

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/131272083