【智能算法】萤火虫算法(FA)原理及实现

在这里插入图片描述


1.背景

2009年,Yang受到萤火虫发光吸引同伴捕食的自然行为影响,提出了萤火虫算法(Firefly Alogorithm, FA)。

2.算法原理

2.1算法思想

萤火虫算法两个重要因素:光强和萤火虫间的吸引度
Yang提出了理想假设:

  • 萤火虫间的吸引度只受光强影响
  • 吸引度与光强呈正比,与距离呈反比
  • 光强表述为目标函数值,即越接近食物位置的萤火虫光强越亮

萤火虫群体中每个个体会受到比自身更亮萤火虫的影响而产生移动,寻找更优解。

2.2算法过程

群体位置初始化:
X = l b + r a n d ∗ ( u b − l b ) X=lb+rand*(ub-lb) X=lb+rand(ublb)
其中, u b , l b ub,lb ub,lb分别代表萤火虫上下位置边界。
萤火虫间的吸引度
β i j = β 0 ∗ e − γ ∗ r i j 2 r i j = ( x i − x j ) 2 \beta_{ij}=\beta_0*e^{-\gamma *r_{ij}^2} \\ r_{ij}=\sqrt{(x_i-x_j)^2} βij=β0eγrij2rij=(xixj)2
其中, β i j , β 0 , γ , r i j \beta_{ij},\beta_0,\gamma,r_{ij} βij,β0,γ,rij分别代表萤火虫 i , j i,j i,j的吸引度,距离为0时的吸引度,光吸收系数和萤火虫 i , j i,j i,j的欧式距离。
朝着更亮的萤火虫移动:
在这里插入图片描述
x i t + 1 = x i t + β i j ( x j t − x i t ) + α ( r a n d − 1 2 ) x_i^{t+1}=x_i^{t}+\beta_{ij}(x_j^{t}-x_i^{t})+\alpha(rand-\frac{1}{2}) xit+1=xit+βij(xjtxit)+α(rand21)
其中, x i t + 1 x_i^{t+1} xit+1代表萤火虫 i i i下一次飞行方向。
伪代码
在这里插入图片描述

3.代码实现

% 萤火虫优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = FA(pop, dim, ub, lb, fobj, maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优萤火虫位置
%% 萤火虫优化算法参数
beta0 = 2; %最大吸引度
gamma = 1; %光强吸收系数
alpha = 0.2; %步长因子
alpha_damp = 0.98; % 步长下降因子
dmax = norm(ub - lb); %空间最大距离
%% 初始化萤火虫位置
X = zeros(pop, dim);
for i = 1:pop
    for j = 1:dim
        X(i,j) = (ub(j) - lb(j)) * rand() + lb(j);
    end
end
%% 初始化适应度值
fitness = zeros(1,pop);
for i = 1:pop
    fitness(i) = fobj(X(i,:));
end
%% 记录全局最优解
[~, index] = min(fitness);
gBestFitness = fitness(index);
gBest = X(index,:);
Xnew = X;
%% 迭代
for t = 1:maxIter
    for i = 1:pop
        for j = 1:pop
            if fitness(j) < fitness(i)
                %计算距离
                rij = norm(X(i,:) - X(j,:))./dmax;
                %计算吸引度
                beta = beta0 * exp(-gamma * rij^2);
                %更新位置
                newSolution = X(i,:) + beta * rand(1,dim).*(X(j,:) - X(i,:)) + alpha.*(rand(1,dim)-1/2);
                %边界检查
                for k = 1:dim
                    if newSolution(k) > ub(k)
                        newSolution(k) = ub(k);
                    end
                    if newSolution(k) < lb(k)
                        newSolution(k) = lb(k);
                    end
                end
                newSFitness = fobj(newSolution);
                %更新萤火虫位置
                if newSFitness < fitness(i)
                    Xnew(i,:) = newSolution;
                    fitness(i) = newSFitness;
                    if newSFitness < gBestFitness
                        gBestFitness = newSFitness;
                        gBest = newSolution;
                    end
                end
            end
        end
    end
    %新位置与历史位置合并
    P = [X;Xnew];
    for i = 1:2*pop
        Pfit(i) = fobj(P(i,:));
    end
    [~, sortIndex] = sort(Pfit); %适应度排序
    X = P(sortIndex(1:pop),:); %取靠前的pop只萤火虫作为下次迭代初始种群
    %记录数据
    Iter_curve(t) = gBestFitness;
    History_pos{t} = X;
    History_best{t} = gBest;
end
Best_pos = gBest;
Best_fitness = gBestFitness;
end

优化问题
以CEC2005测试函数F7为例

clear,clc,close all
x = -1.28:0.02:1.28;
y = x;
L = length(x);
for i = 1:L
    for j = 1:L
        f(i,j) = fun([x(i) y(j)]);
    end
end
surfc(x, y, f, 'LineStyle', 'none', 'FaceAlpha',0.5);

% 设定萤火虫参数
pop = 50;
dim = 2;
ub = [1.28, 1.28];
lb = [-1.28, -1.28];
maxIter = 100;
fobj = @(x) fun(x);

% 求解
[Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = FA(pop, dim, ub, lb, fobj, maxIter);

在这里插入图片描述
在这里插入图片描述

4.参考文献

[1] Yang X S. Firefly algorithms for multimodal optimization[C]//International symposium on stochastic algorithms. Berlin, Heidelberg: Springer Berlin Heidelberg, 2009: 169-178.

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
人工鱼群算法(Artificial Fish Swarm Algorithm,简称AFSA)是一种基于生物鱼群行为的群体智能算法。其基本思想是将鱼群在觅食、迁徙、捕食等行为中所表现出的群体智能特点与数学建模相结合,通过模拟鱼群的行为,以求解优化问题。 AFSA算法的主要步骤如下: 1. 初始化种群:生成一定数量的鱼,每条鱼都有一个随机的位置和速度。 2. 评估适应度:根据适应度函数计算每条鱼的适应度,并记录最优解。 3. 更新位置和速度:根据鱼的当前位置和速度,以及周围邻居鱼的位置和速度,更新鱼的位置和速度。 4. 判断结束条件:如果满足结束条件,则输出最优解;否则,返回第2步。 AFSA算法中,适应度函数的定义往往是问题相关的,不同的问题有不同的适应度函数。AFSA算法中,鱼的位置和速度的更新公式如下: $$x_i(t+1)=x_i(t)+v_i(t)$$ $$v_i(t+1)=v_i(t)+\sum_{j=1}^{N}\omega_j(t)\times [x_j(t)-x_i(t)]+F_i(t)$$ 其中,$x_i(t)$表示第$i$条鱼在$t$时刻的位置,$v_i(t)$表示第$i$条鱼在$t$时刻的速度,$N$表示鱼的邻居数,$\omega_j(t)$表示第$j$条鱼在$t$时刻的权重,$F_i(t)$表示第$i$条鱼在$t$时刻的自由游动。 萤火虫算法(Firefly Algorithm,简称FA)是一种启发式优化算法。其基本思想源于萤火虫的闪烁行为,即萤火虫的亮度和吸引力与其距离的平方成反比。萤火虫算法通过模拟萤火虫的闪烁行为,以求解优化问题。 FA算法的主要步骤如下: 1. 初始化种群:生成一定数量的萤火虫,每个萤火虫都有一个随机的位置和亮度值。 2. 评估适应度:根据适应度函数计算每个萤火虫的适应度,并记录最优解。 3. 更新位置和亮度:根据每个萤火虫的位置和亮度值,以及周围萤火虫的位置和亮度值,更新萤火虫的位置和亮度值。 4. 判断结束条件:如果满足结束条件,则输出最优解;否则,返回第2步。 FA算法中,适应度函数的定义往往是问题相关的,不同的问题有不同的适应度函数。萤火虫的位置和亮度值的更新公式如下: $$x_i(t+1)=x_i(t)+\beta_0\exp(-\gamma r_{ij}^2)(x_j-x_i)+\alpha(rand-0.5)$$ 其中,$x_i(t)$表示第$i$个萤火虫在$t$时刻的位置,$x_j$表示第$j$个萤火虫的位置,$r_{ij}$表示第$i$个萤火虫和第$j$个萤火虫之间的距离,$\beta_0$表示吸引度的初始值,$\gamma$表示吸引度的增长速率,$\alpha$表示步长,$rand$表示一个在$[0,1]$之间均匀分布的随机数。 总的来说,AFSA算法FA算法都是一种基于群体智能的优化算法,其中AFSA算法模拟了鱼群的行为,而FA算法模拟了萤火虫的闪烁行为。它们的优化效果与具体问题的适应度函数、算法参数等有关。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小O的算法实验室

谢谢大佬的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值