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


    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不同。。

  • 相关阅读:
    jQuery Timer 实现的新邮件提醒
    在 jquery repeater 中添加设置日期,下拉,复选框等控件
    jquery repeater 完成 QQ 邮箱邮件分组显示功能
    Ajax 与 WebService 之间日期等数据类型的转换
    通过 Parameter 对象添加 Ajax 请求时的参数
    在 jQuery Repeater 进行验证更新等操作时提示消息
    jquery repeater 模仿 Google 展开页面预览子视图
    在 jQuery Repeater 中检索过滤数据
    功能完善的 jquery validator 完成用户注册的验证
    在 Repeater 中绑定转化 JSON 格式的字段
  • 原文地址:https://www.cnblogs.com/gaowenxingxing/p/11821682.html
Copyright © 2020-2023  润新知