萤火虫优化算法(基本算法)

firefly algorithm

萤火虫优化算法是模拟自然界中萤火虫总是朝着发光最亮的萤火虫的位置进行移动的算法。(一般的群智能算法就是模拟该生物的生存行为的(觅食,求偶,迁徙。。。)
换句话说:
萤火虫算法(Firefly Algorithm,FA)是一种模仿萤火虫之间信息交流,相互吸引集合,警戒危险。算法的原理简单,但实现过程较为复杂,而且算法的提出时间不长(2008年剑桥学者(Xin-She Yang,挺牛逼的,提出了很多的算法,这些人的脑子都是怎么长得。。。?都是地球人,为啥别人那么优秀
),算法的改进、优化处于初级阶段,国内外相应的应用研究已经有了一定的成果(一般的NP-hard问题,工程优化,调度问题等等,反正,很多。
萤火虫算法中,每个萤火虫的位置代表了一个待求问题的可行解,而萤火虫的亮度表示该萤火虫位置的适应度,亮度越高的萤火虫个体在解空间内的位置越好。萤火虫个体之间,高亮度的萤火虫会吸引低亮度的萤火虫。在解空间(搜索空间)内,每个萤火虫会像着亮度比自己高萤火虫飞行来搜寻更优的位置。亮度越大对其他的萤火虫的吸引度越大。同时,萤火虫之间光的传播介质会吸收光,降低光的亮度,影响光的传播,所以萤火虫之间的吸引度会随着空间距离成反比,即两只萤火虫之间的吸引度会随着这两只萤火虫之间距离的增大而减小。

算法中的两个要素是亮度和吸引度,萤火虫位置越优,
亮度越大,吸引亮度小的萤火虫向自己移动;萤火虫之间距
离越近,吸引度越大,移动距离越长。
算法的相关描述如下:
(1)萤火虫亮度:

[I_{i} propto frac{1}{Jleft(x_{i} ight)}, 1 leq i leq n ]


(2.) 萤火虫之间的相对吸引度:

[eta=eta_{0} imes e^{-m_{0}} ]

[r_{i j}=left|x_{i}-x_{j} ight|=sqrt{sum_{k=1}^{d}left(x_{i k}-x_{j k} ight)^{2}} ]

其中, d为所求解问题的维数。
(3)萤火虫 i 被比其明亮的萤火虫 j 吸引而移动,其位置更新公式为:

[x_{i}^{k+1}=x_{i}+etaleft(x_{j}-x_{i} ight)+alpha varepsilon_{i} ]


这个是之前看的一篇文献上面的,我感觉写的很简洁,比原作者写的好一些,原作者的代码很清楚但是论文的结构我看起来很费劲。。

Reference

[1]刘晓明,沈明玉,侯整风.基于Levy飞行的萤火虫模糊聚类算法[J/OL].计算机应用:1-8[2019-11-08].http://kns.cnki.net/kcms/detail/51.1307.TP.20190822.0958.008.html.
[2]Firefly Algorithms for Multimodal Optimization(springer)上面的

%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YOEA112
% Project Title: Implementation of Firefly Algorithm (FA) in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
% 
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
% 
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
clc;
clear;
close all;
%% Problem Definition
CostFunction=@(x) Rosenbrock(x);        % Cost Function
nVar=5;                 % Number of Decision Variables
VarSize=[1 nVar];       % Decision Variables Matrix Size
VarMin=-10;             % Decision Variables Lower Bound
VarMax= 10;             % Decision Variables Upper Bound
%% Firefly Algorithm Parameters
MaxIt=1000;         % Maximum Number of Iterations
nPop=25;            % Number of Fireflies (Swarm Size)
gamma=1;            % Light Absorption Coefficient
beta0=2;            % Attraction Coefficient Base Value
alpha=0.2;          % Mutation Coefficient
alpha_damp=0.98;    % Mutation Coefficient Damping Ratio
delta=0.05*(VarMax-VarMin);     % Uniform Mutation Range
m=2;
if isscalar(VarMin) && isscalar(VarMax)
    dmax = (VarMax-VarMin)*sqrt(nVar);
else
    dmax = norm(VarMax-VarMin);
end
%% Initialization
% Empty Firefly Structure
firefly.Position=[];
firefly.Cost=[];
% Initialize Population Array
pop=repmat(firefly,nPop,1);
% Initialize Best Solution Ever Found
BestSol.Cost=inf;
% Create Initial Fireflies
for i=1:nPop
   pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
   pop(i).Cost=CostFunction(pop(i).Position);
   
   if pop(i).Cost<=BestSol.Cost
       BestSol=pop(i);
   end
end
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% Firefly Algorithm Main Loop
for it=1:MaxIt
    
    newpop=repmat(firefly,nPop,1);
    for i=1:nPop
        newpop(i).Cost = inf;
        for j=1:nPop
            if pop(j).Cost < pop(i).Cost
                rij=norm(pop(i).Position-pop(j).Position)/dmax;
                beta=beta0*exp(-gamma*rij^m);
                e=delta*unifrnd(-1,+1,VarSize);
                %e=delta*randn(VarSize);
                
                newsol.Position = pop(i).Position ...
                                + beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
                                + alpha*e;
                
                newsol.Position=max(newsol.Position,VarMin);
                newsol.Position=min(newsol.Position,VarMax);
                
                newsol.Cost=CostFunction(newsol.Position);
                
                if newsol.Cost <= newpop(i).Cost
                    newpop(i) = newsol;
                    if newpop(i).Cost<=BestSol.Cost
                        BestSol=newpop(i);
                    end
                end
                
            end
        end
    end
    
    % Merge
    pop=[pop
         newpop];  %#ok
    
    % Sort
    [~, SortOrder]=sort([pop.Cost]);
    pop=pop(SortOrder);
    
    % Truncate
    pop=pop(1:nPop);
    
    % Store Best Cost Ever Found
    BestCost(it)=BestSol.Cost;
    
    % Show Iteration Information
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
    
    % Damp Mutation Coefficient
    alpha = alpha*alpha_damp;
    
end
%% Results
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;

这个是matlab代码,不是r的,但是我貌似用的是R的格式。。。我回头查一下R的怎么使用
提示一下,这个是基本的代码,我没放测试函数,测试函数一般基本的是23个,这个是开源的,可以自己编写一个运行一下,我一般是把23个放到一起,基本思路是一样的,只不过是每个人的style不同。。

原文地址:https://www.cnblogs.com/gaowenxingxing/p/11821682.html