1 简介

2015 年,Hussain Shareef 等基于闪电的机理提出了一种新型的启发式优化算法———闪电搜索算法( lightning search algorithm,LSA) ,该算法具有调节参数少、收敛精度高和全局寻优能力强等优点,已在函数优化、旅行商问题寻优等方面得到应用。

2 部分代码

%{
Lightning Search Algorithm (LSA)

Platform: Matlab 2012a,2013a   


Cite this algorithm as;
[1]. Hussain Shareef , Ahmad Asrul Ibrahim, Ammar Hussein Mutlag, Lightning Search Algorithm, 
Applied Soft Computing 36 (2015) 315?333.


Copyright Notice
Copyright (c) 2015, Hussain Shareef and Ahmad Asrul Ibrahim 
All rights reserved.

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions are 
met:

  * Redistributions of source code must retain the above copyright 
    notice, this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the copyright 
    notice, this list of conditions and the following disclaimer in 
    the documentation and/or other materials provided with the distribution
     
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.


%}


clc
clear all
close all

tic;%start stopwatch
F_index =6; % Function 1-6 % Refer to other test function 7-24 in [1].
[low,up,dim]=test_functions_range(F_index);

N = 20; % population size/number of agents
D = dim; % number of dimension
T = 100; % maximum number of iteration

% Set upper bound & lower bound
if size(up,2)==1
   UB = ones(1,D).*up;
   LB = ones(1,D).*low;
end
if size(up,2)>1
   UB = up;
   LB = low;
end

%randomly create 1st population
for d = 1:D
   Dpoint(:,d)= rand(N,1)*(UB(d)-LB(d))+LB(d);
end

ch_time = 0; % reset
max_ch_time = 10;
fit_old = 10^10*(ones(1,N));
direct = sign(unifrnd(-1,1,1,dim));

for t = 1:T
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   % Evaluate performance
   fit = evaluateF(Dpoint,F_index); 
   Ec = fit;
   
   % update channel
   ch_time = ch_time+1;
   if ch_time >= max_ch_time
      [Ms ds]=sort(Ec,'ascend');
       Dpoint(ds(N),:) = Dpoint(ds(1),:); % Eliminate the worst channel
       Ec(ds(N)) = Ec(ds(1)); % Update  
       ch_time = 0; % reset
   end
   
   % Rangking the fitness value
  [Ms ds]=sort(Ec,'ascend');
   best = Ec(ds(1));
   worst = Ec(ds(N));
   
   Energy = 2.05 - 2*exp(-5*(T-t)/T);% Update energy

   % update direction
   for d = 1:D
       Dpoint_test = Dpoint(ds(1),:);
       Dpoint_test(d) = Dpoint_test(d)+direct(d)*0.005*(UB(d)-LB(d));
       fv_test = evaluateF(Dpoint_test,F_index);
       if fv_test < best % If better, +ve direction
           direct(d) = direct(d);
       else
           direct(d) = -1*direct(d);
       end
   end
   % update position
   for i = 1:N
       dist=Dpoint(i,:)-Dpoint(ds(1),:);
           for d = 1:D
               if Dpoint(i,:)==Dpoint(ds(1),:)
                   Dpoint_temp(d) = Dpoint(i,d)+direct(d)*abs(normrnd(0,Energy));
               else
                   if dist(d)<0
                       Dpoint_temp(d) = Dpoint(i,d)+exprnd(abs(dist(d)));
                   else
                       Dpoint_temp(d) = Dpoint(i,d)-exprnd(dist(d));
                   end
               end
               if (Dpoint_temp(d)>UB(d))||(Dpoint_temp(d)<LB(d))
                   Dpoint_temp(d) = rand(1)*(UB(d)-LB(d))+LB(d); % Re-initialized
               end
           end
           
           fv = evaluateF(Dpoint_temp,F_index);
           if fv < Ec(i)
               Dpoint(i,:) = Dpoint_temp;
               Ec(i) = fv;
               % Focking procedure
               if rand < 0.01
                   for d = 1:D 
                       Dpoint_fock(d) = UB(d)+LB(d)-Dpoint_temp(d);% Focking
                   end
                   fock_fit = evaluateF(Dpoint_fock,F_index); % Evaluate
                   if fock_fit < Ec(i) 
                       Dpoint(i,:) = Dpoint_fock; % Replace the channel
                       Ec(i) = fock_fit;
                   end
               end
           end   
   end
   if best == worst
       break
   end
% record the performance
   fitness(t) = min(fit);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
elapsed_time=toc; % time taken for this algorithm
% select the optimal value
grandmin = min(fitness);
y = fitness;
x = 1:length(y);
plot(x,y,'Linewidth',2)
xlabel('No of Iteration');
ylabel('Fitness Value');
axis([0 max(x) min(y) max(y)]); 
fprintf(1,'Optimal value = %f\n', grandmin);

3 仿真结果

4 参考文献

[1]卢玉婷. 元启发式闪电搜索算法及应用研究[D]. 广西大学, 2019.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,有科研问题可私信交流。

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐