【智能算法】蝴蝶优化算法(BOA)原理及实现

在这里插入图片描述


1.背景

2019年,Arora等人受到蝴蝶捕食自然行为影响,提出了蝴蝶优化算法(Butterfly optimization algorithm,BOA)。

2.算法原理

2.1算法思想

蝴蝶会释放一定的气味浓度(跟适应度函数有关),气味浓度会吸引蝴蝶飞行。当蝴蝶从一个位置移动到另一个位置时其适应度将相应地变化。

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分别代表蝴蝶上下位置边界。
气味浓度
f = c I a f=cI^{a} f=cIa
其中, f , c , I , a f,c,I,a f,c,I,a分别表示蝴蝶气味强度,感知因子,刺激强度(适应度)和控制常数。论文对这里的解释是:自然界中的昆虫随着刺激度增强,敏感度会变得越低,因此 a = 0.1 a=0.1 a=0.1 I I I进行压缩。另一方面,根据 S t e v e n s Stevens Stevens幂律,为了区分气味间的区别,用感知因子 c c c表述。
探索阶段
{ x i t + 1 = x i t + ( r 2 × g ∗ − x i t ) × f i , r a n d < p x i t + 1 = x i t + ( r 2 × x j t − x k t ) × f i , o t h e r w i s e \begin{cases}{x_i}^{t+1}={x_i}^t+\left(r^2\times g^*-{x_i}^t\right)\times f_i, rand<p \\ {x_i}^{t+1}={x_i}^t+\left(r^2\times{x_j}^t-{x_k}^t\right)\times f_i,otherwise \end{cases} {xit+1=xit+(r2×gxit)×fi,rand<pxit+1=xit+(r2×xjtxkt)×fi,otherwise
这里采用采用的全局搜索和局部搜索机制,这里用控制参数 p p p控制。其中, g ∗ g^{*} g表示目前最优蝴蝶位置。
伪代码
在这里插入图片描述

3.代码实现

% 蝴蝶算法
function [fmin,best_pos,Convergence_curve, History_pos, History_best]=BOA(n,N_iter,Lb,Ub,dim,fobj)
%input
%n 种群数量
%dim 问题维数
%Lb 变量上边界最大值
%Ub 变量下边界最小值
%fobj 适应度函数
%N_iter 最大迭代次数
%output
%best_pos 最优位置
%fmin 最优适应度值
%Convergence_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体
%% 控制参数
p=0.8;
power_exponent=0.1;
sensory_modality=0.01;
%% 初始化种群
Sol = zeros(n, dim);
for i = 1:dim
    Sol(:,i) = rand(n, 1) * (Ub(i) - Lb(i)) + Lb(i);
end
%% 计算适应度
for i=1:n
    Fitness(i)=fobj(Sol(i,:));
end
%% 记录
[fmin,I]=min(Fitness);
best_pos=Sol(I,:);
S=Sol; 
%% 迭代
for t=1:N_iter
        for i=1:n 
          Fnew=fobj(S(i,:));
          FP=(sensory_modality*(Fnew^power_exponent));
          % 全局搜索
          if rand<p    
            dis = rand * rand * best_pos - Sol(i,:);
            S(i,:)=Sol(i,:)+dis*FP;
           else
              % 局部搜索
              epsilon=rand;
              JK=randperm(n);
              dis=epsilon*epsilon*Sol(JK(1),:)-Sol(JK(2),:);
              S(i,:)=Sol(i,:)+dis*FP;                        
          end
           
            % 边界处理
            S(i,:)=simplebounds(S(i,:),Lb,Ub);
            Fnew=fobj(S(i,:)); 
            
            if (Fnew<=Fitness(i))
                Sol(i,:)=S(i,:);
                Fitness(i)=Fnew;
            end
           
           if Fnew<=fmin
                best_pos=S(i,:);
                fmin=Fnew;
           end
         end
            
         Convergence_curve(t,1)=fmin;
         History_pos{t} = Sol;
         History_best{t} = best_pos;
         
         sensory_modality=sensory_modality_NEW(sensory_modality, N_iter);
end
end
%% 
function s=simplebounds(s,Lb,Ub)
  m = length(s);
  for i = 1:m
      if s(i) > Ub(i)
          s(i) = Ub(i);
      end
      if s(i) < Lb(i)
          s(i) = Lb(i);
      end
  end
end
%% 
function y=sensory_modality_NEW(x,Ngen)
    y=x+(0.025/(x*Ngen));
end



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

clear,clc,close all
x=-10:0.1:10;
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 = [10, 10];
lb = [-10, -10];
maxIter = 100;
fobj = @(x) fun(x);

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

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

4.参考文献

【1】Arora S, Singh S. Butterfly optimization algorithm: a novel approach for global optimization[J]. Soft Computing, 2019, 23: 715-734.

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
蝴蝶优化算法(Butterfly Optimization Algorithm, BOA)是一种基于自然界蝴蝶觅食行为而开发的全局优化算法。该算法模拟了蝴蝶群体的觅食过程,通过不断地在搜索空间中飞行和觅食来寻求最佳解。 BOA算法的工作原理如下:首先,随机生成一群蝴蝶,并初始化每只蝴蝶的位置和速度。然后,根据蝴蝶的适应度值,更新每只蝴蝶的速度和位置。蝴蝶根据自身的适应度值和周围蝴蝶的信息进行位置的更新,以期望找到更好的解。算法迭代直到满足停止条件为止。 以下是使用MATLAB实现蝴蝶优化算法的示例代码: ```matlab function [best_position, best_fitness] = BOA(fitness_func, dim, lb, ub, swarm_size, max_iter) % 参数说明: % fitness_func: 适应度函数 % dim: 解的维度 % lb: 解的下界 % ub: 解的上界 % swarm_size: 蝴蝶群体规模 % max_iter: 最大迭代次数 % 初始化蝴蝶位置和速度 position = lb + (ub - lb) * rand(swarm_size, dim); velocity = zeros(swarm_size, dim); % 初始化最佳位置和适应度 best_position = position(1, :); best_fitness = fitness_func(best_position); % 开始迭代 for iter = 1 : max_iter % 更新蝴蝶速度和位置 for i = 1 : swarm_size % 更新速度 velocity(i, :) = velocity(i, :) + rand(1, dim) .* (best_position - position(i, :)); % 限制速度范围 velocity(i, :) = max(velocity(i, :), lb); velocity(i, :) = min(velocity(i, :), ub); % 更新位置 position(i, :) = position(i, :) + velocity(i, :); % 限制位置范围 position(i, :) = max(position(i, :), lb); position(i, :) = min(position(i, :), ub); % 更新最佳位置和适应度 fitness = fitness_func(position(i, :)); if fitness < best_fitness best_fitness = fitness; best_position = position(i, :); end end end end % 示例:求解Ackley函数的最优解 dim = 2; lb = -50; ub = 50; swarm_size = 50; max_iter = 100; fitness_func = @(x) Ackley(x); [best_position, best_fitness] = BOA(fitness_func, dim, lb, ub, swarm_size, max_iter); disp("Best Position: " + num2str(best_position)) disp("Best Fitness: " + num2str(best_fitness)) % Ackley函数 function fitness = Ackley(x) a = 20; b = 0.2; c = 2 * pi; d = size(x, 2); sum1 = sum(x .^ 2, 2); sum2 = sum(cos(c * x), 2); term1 = -a * exp(-b * sqrt(sum1 / d)); term2 = -exp(sum2 / d); fitness = term1 + term2 + a + exp(1); end ``` 上述代码使用了MATLAB的向量化运算,提高了代码执行的效率。通过更改`fitness_func`函数和设置不同的参数,可以应用BOA算法求解其他函数的最优解。 需要注意的是,在实际使用中,BOA算法的性能也受到参数选择的影响,需要根据问题的特点进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小O的算法实验室

谢谢大佬的肯定!

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

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

打赏作者

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

抵扣说明:

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

余额充值