基于萤火虫(FA)算法的函数寻优算法

一、理论基础

2005年,印度学者K.N.Krishnanand和D.Ghose在IEEE群体智能会议上提出了一种新的群智能优化算法,人工萤火虫群优化(Glowworm Swarm Optimization, GSO)算法。2009年,剑桥学者Xin-She Yang根据自然界中萤火虫的发光行为提出萤火虫算法(Firefly Algorithm, FA)。自这两种萤火虫算法提出以来,各国学者对这两种算法进行了研究、改进和应用。经过几年的发展,在连续空间的寻优过程和一些生产调度方面萤火虫算法具有良好的应用前景。
GSO和FA有相似的方面,但在具体实现方面有一定差异。本文具体介绍FA算法。

二、FA算法

1、算法假设

作者为了简单地描述FA算法,使用以下三个理想化的规则:
(1)所有的萤火虫都是中性的,这样不管它们的性别,一只萤火虫都会被其他萤火虫吸引;
(2)吸引力与它们的亮度成正比,因此对于任何两只闪光的萤火虫,越不明亮的一只会移动到最亮的一个。吸引力与亮度成正比,并且随着距离的增加,两者都会降低。如果没有比特定萤火虫更亮的萤火虫,它会随机移动;
(3)萤火虫的亮度受目标函数的景观影响或决定。对于最大化问题,亮度可以简单地与目标函数的值成比例。其他形式的亮度可以用类似于遗传算法中的适应度函数的方式来定义。

2、算法描述

FA算法的伪代码可以概括为:
在这里插入图片描述

图1 FA算法伪代码

3、算法原理

如上所述,萤火虫算法包含两个要素,即亮度和吸引度。亮度体现了萤火虫所处位置的优劣并决定其移动方向,吸引度决定了萤火虫移动的距离,通过亮度和吸引度的不断更新, 从而实现优化。

(1)亮度

萤火虫的相对荧光亮度为: I = I 0 ⋅   e − γ r i , j (1) I=I_0\boldsymbol· \,e^{-\gamma r_{i,j}}\tag{1} I=I0eγri,j(1)其中, I 0 I_0 I0为萤火虫的最大萤光亮度,与目标函数值相关,目标函数值越优自身亮度越高; γ \gamma γ为光强吸收系数,荧光会随着距离的增加和传播媒介的吸收逐渐减弱; r i , j r_{i,j} ri,j为萤火虫 i i i j j j之间的欧氏距离。

(2)吸引度

萤火虫的吸引度为: β = β 0 ⋅   e − γ r i , j 2 (2) \beta=\beta_0\boldsymbol ·\, e^{-\gamma r_{i,j}^2}\tag{2} β=β0eγri,j2(2)其中, β 0 \beta_0 β0为最大吸引度; γ \gamma γ为光强吸收系数; r i , j r_{i,j} ri,j为萤火虫 i i i j j j之间的欧氏距离。

(3)距离和移动

如果两个萤火虫 i i i j j j的空间位置分别是 x i \boldsymbol x_i xi x j \boldsymbol x_j xj,那么它们之间的距离为:
r i , j = ∣ ∣ x i − x j ∣ ∣ = ∑ k = 1 d ( x i , k − x j , k ) 2 (3) r_{i,j}=||\boldsymbol x_i-\boldsymbol x_j||=\sum_{k=1}^d\sqrt{(x_{i,k}-x_{j,k})^2}\tag{3} ri,j=xixj=k=1d(xi,kxj,k)2 (3)萤火虫 i i i被吸引向萤火虫 j j j移动的位置更新公式如式(4)所示: x i = x i + β ( x j − x i ) + α ( r a n d − 1 2 ) (4) \boldsymbol x_i=\boldsymbol x_i+\beta(\boldsymbol x_j-\boldsymbol x_i)+\alpha (rand-\frac{1}{2})\tag{4} xi=xi+β(xjxi)+α(rand21)(4)其中, x i \boldsymbol x_i xi x j \boldsymbol x_j xj为萤火虫 i i i j j j所处的空间位置; α ∈ [ 0 , 1 ] \alpha∈[0,1] α[0,1]为步长因子; r a n d rand rand [ 0 , 1 ] [0,1] [0,1]上服从均匀分布的随机数。

三、MATLAB程序实现

1、问题描述

Ackley函数表达式如下: f ( x ) = 20 ( 1 − e x p ( − 0.2 1 d ∑ k = 1 d x k 2 ) ) − e x p ( 1 d ∑ i = 1 d c o s ( 2 π x i ) ) + e x p ( 1 ) (5) f(\boldsymbol x)=20\left(1-exp\left(-0.2\sqrt{\frac{1}{d}\sum_{k=1}^dx_k^2}\right)\right)-exp\left(\frac1d\sum_{i=1}^dcos(2\pi x_i)\right)+exp(1) \tag{5} f(x)=201exp0.2d1k=1dxk2 exp(d1i=1dcos(2πxi))+exp(1)(5)其中, d d d是自变量 x \boldsymbol x x的维数, x i ( i = 1 , 2 , ⋯   , d ) x_i(i=1,2,\cdots,d) xi(i=1,2,,d) x \boldsymbol x x的第 i i i个分量。
Ackley函数的三维立体图形如图2所示。
在这里插入图片描述

图2 Ackley函数的三维立体图形

本案例设 d = 5 d=5 d=5

2、程序实现

  • Ackley函数的程序如下:
function z = Ackley(x)
    z = 20*(1-exp(-0.2*sqrt(mean(x.^2))))+exp(1)-exp(mean(cos(2*pi*x)));
end
  • 主函数程序如下:
%% 清空环境变量
clc;
clear;
close all;

%% 问题设定
CostFunction = @(x) Ackley(x); % 目标函数
nVar = 5;               % 变量个数
VarSize = [1 nVar];     % 变量矩阵大小
VarMin = -10;           % 变量下限
VarMax = 10;            % 变量上限

%% FA参数
MaxIt = 1000;         % 最大迭代次数
nPop = 25;            % 萤火虫数量 (种群规模)
gamma = 1;            % 光强吸收系数
beta0 = 1;            % 初始吸引度
alpha = 0.2;          % 步长因子
alpha_damp = 0.98;    % 步长缩减系数
m = 2;                % 距离指数因子
if isscalar(VarMin) && isscalar(VarMax)
    dmax = (VarMax-VarMin)*sqrt(nVar);
else
    dmax = norm(VarMax-VarMin);
end

%% 初始化
% 空的萤火虫结构体
firefly.Position = [];
firefly.Cost = [];
% 初始化种群数组
pop = repmat(firefly, nPop, 1);
% 初始化每代最优解矩阵
BestSol.Cost = inf;
% 产生初始种群
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
% 保存最优值的数组
BestCost = zeros(MaxIt, 1);

%% FA迭代优化
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);     % 吸引度 
                newsol.Position = pop(i).Position ...
                                + beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
                                + alpha*(rand(VarSize)-0.5);
                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
    % 合并
    pop = [pop
         newpop];  %#ok
    % 排序
    [~, SortOrder] = sort([pop.Cost]);
    pop = pop(SortOrder);
    % 截断
    pop = pop(1:nPop);
    % 保存每代最优解
    BestCost(it) = BestSol.Cost;    
    % 显示迭代信息
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]); 
    % 步长缩减
    alpha = alpha*alpha_damp;
end

%% 结果
figure;
% plot(BestCost, 'r', 'LineWidth', 2);
semilogy(BestCost, 'r', 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;

3、结果显示

FA算法迭代进化过程如图3所示。
在这里插入图片描述

图3 FA算法迭代进化过程

四、参考文献

[1] Yang X. Firefly algorithms for multimodal optimization[C]. International Symposium on Stochastic Algorithms. Springer, Berlin, Heidelberg, 2009: 169-178.
[2] 智能算法研学社(Jack旭). 智能优化算法:萤火虫算法-附代码. CSDN博客.

萤火虫算法(Firefly Algorithm,简称FA)是一种基于自然界萤火虫行为的优化算法,用于解决优化问题。MPPT(Maximum Power Point Tracking)是一种用于太阳能光伏系统中的算法,用于追踪太阳能电池板的最大功率点。 萤火虫算法可以应用于MPPT算法中,以实现太阳能电池板的最大功率点追踪。在萤火虫算法中,每个萤火虫代表一个解决方案,其亮度表示解决方案的适应度值。萤火虫通过发出光信号来吸引其他萤火虫,并根据亮度和距离来调整自己的位置。 在MPPT中,萤火虫算法可以用于优化太阳能电池板的工作点,以使其输出功率最大化。通过调整太阳能电池板的工作电压和电流,萤火虫算法可以找到最佳的工作点,以实现最大的功率输出。 以下是萤火虫算法在MPPT中的一个简单示例: ```python import math # 定义萤火虫算法的参数 alpha = 0.5 # 萤火虫吸引度衰减系数 beta = 0.2 # 萤火虫移动步长 gamma = 1 # 萤火虫亮度增加系数 # 定义太阳能电池板的参数 Voc = 20 # 开路电压 Isc = 5 # 短路电流 Vmpp = 17 # 最大功率点电压 Impp = 4 # 最大功率点电流 # 定义萤火虫的初始位置和亮度 x = 0 # 初始电压 y = 0 # 初始电流 brightness = 0 # 初始亮度 # 定义目标函数,即功率函数 def power_function(voltage, current): power = voltage * current return power # 迭代更新萤火虫位置和亮度 for iteration in range(100): # 计算当前位置的功率 current_power = power_function(x, y) # 更新亮度 brightness = gamma * current_power # 移动萤火虫 for i in range(100): # 计算萤火虫之间的距离 distance = math.sqrt((x - i) ** 2 + (y - i) ** 2) # 计算萤火虫之间的吸引度 attraction = brightness / (1 + alpha * distance) # 更新萤火虫位置 x += beta * (i - x) * attraction y += beta * (i - y) * attraction # 限制位置在合理范围内 x = max(0, min(Voc, x)) y = max(0, min(Isc, y)) # 输出最佳工作点 print("最佳工作点电压:", x) print("最佳工作点电流:", y) print("最大功率:", power_function(x, y)) ``` 这是一个简单的萤火虫算法在MPPT中的示例,通过迭代更新萤火虫的位置和亮度,最终找到太阳能电池板的最佳工作点,以实现最大的功率输出。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心️升明月

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值