收敛因子和黄金正弦指引机制的蝴蝶优化算法-附代码

收敛因子和黄金正弦指引机制的蝴蝶优化算法


摘要:针对蝴蝶优化算法(butterfly optimization algorithm,BOA)中存在的局部开采和全局探索能力不均衡,易陷入局部最优值,收敛精度低等缺陷,提出收敛因子和黄金正弦指引机制的蝴蝶优化算法(convergence factor and gold sinusoidal guidance mechanism of butterfly optimization algorithm,AGSABOA)。受到鲸鱼优化算法的启发将收敛因子融入算法的全局位置更新处,提高算法全局搜索的多样性;结合黄金正弦指引机制,弥补BOA算法迭代后期种群多样性下降,易陷入局部最优的不足。

1.蝴蝶优化算法

基础蝴蝶优化算法的具体原理参考,我的博客:https://blog.csdn.net/u011835903/article/details/107855860

2. 改进蝴蝶优化算法

2.1 收敛因子

为进一步增强 BOA 算法的探索能力和提高收玫精度, 受到鲸鱼优化算法的启发, 将鲸鱼优化算法中非线性收玫 因子 a a a 引入基本蝴蝶优化算法的全局位置更新处, 希望迭 代前期 a a a 值较大以增强全局勘探能力且递减速度较快, 而 迭代后期 a a a 值收玫到较小值且递减速度变缓慢, 以实现前 期快速收玫, 提高算法后期的收玫精度。 a a a 随着迭代次数的 增加由 2 减小到 0 。公式如下
a = 2 − t / t max ⁡ (4) a=2-t / t_{\max } \tag{4} a=2t/tmax(4)
式中: t t t 是当前迭代次数, t max ⁡ t_{\max } tmax 是最大迭代次数。
改进后全局位置更新公式如下
x i t + 1 = a x i t + ( r 2 × g ∗ − x i t ) × f i (5) x_{i}^{t+1}=a x_{i}^{t}+\left(r^{2} \times g^{*}-x_{i}^{t}\right) \times f_{i} \tag{5} xit+1=axit+(r2×gxit)×fi(5)

2.2 黄金正弦指引机制

黄金正弦算法 (golden sine algorithm, Golden-SA) [ 8 ] { }^{[8]} [8]
是 Tanyildizi 提出的新型元启发式算法。根据正弦函数定义 中与单位圆的关系, 遍历单位圆上所有正弦值的行为与优 化算法中搜索代理在搜索空间中进行寻优的原理是一致的, 受此启发产生了黄金正弦算法。在该算法中, 创建随机个 体的数量与每个具有均匀分布的搜索代理的数量相同。与 其它元启发式方法相比, Gold-SA 具有更少的依赖于算法 的参数和运算符, Gold-SA 算法通过使当前解空间更接近 目标值的方式来搜索以在每次迭代中得到更好的搜索空间, 搜索空间被黄金比例系数缩小以便获得更小的解空间而不 是整个解空间, 从而有效提升寻优速度。黄金正弦算法的 具体定义及推导过程请参考文献 [ 8 , 11 , 12 ] [8,11,12] [8,11,12]

Gold-SA 算法的主要过程是其解的更新过程, 首先随 机产生 n n n 个个体的位置, 假设优化问题的每个解对应搜索 空间中对应个体的位置, 并用 x i t x_{i}^{t} xit 表示 D D D 维个体空间中第 i i i 个个体的解向量, x i s = ( x i , 1 , x i , 2 , ⋯   , x i , D ) ( i = 1 , 2 , ⋯   , n ; t = x_{i}^{s}=\left(x_{i, 1}, x_{i, 2}, \cdots, x_{i, D}\right)(i=1,2, \cdots, n ; t= xis=(xi,1,xi,2,,xi,D)(i=1,2,,n;t= 1 , 2 , ⋯   , t max ⁡ ) , t max ⁡ \left.1,2, \cdots, t_{\max }\right), t_{\max } 1,2,,tmax),tmax 是最大迭代次数, g ∗ g^{*} g 是第 t t t 次迭代中的最 优位置, 第 i i i 个个体位置更新公式如式 (6) 所示
x i t + 1 = x i t ∗ ∣ sin ⁡ ( r 1 ) ∣ + r 2 ∗ sin ⁡ ( r 1 ) ∗ ∣ θ 1 ∗ g ∗ − θ 2 ∗ x i t ∣ (6) x_{i}^{t+1}=x_{i}^{t} *\left|\sin \left(r_{1}\right)\right|+r_{2} * \sin \left(r_{1}\right) *\left|\theta_{1} * g^{*}-\theta_{2} * x_{i}^{t}\right|\tag{6} xit+1=xitsin(r1)+r2sin(r1) θ1gθ2xit (6)
式中: r 1 r_{1} r1 r 2 r_{2} r2 是随机数, r 1 r_{1} r1 决定算法在下一次迭代中个体的 移动距离, r 1 ∈ [ 0 , 2 π ] , r 2 r_{1} \in[0,2 \pi], r_{2} r1[0,2π],r2 控制下一次迭代中第 i i i 个个体的 位置更新方向, r 2 ∈ [ 0 , π ] ; θ 1 r_{2} \in[0, \pi] ; \theta_{1} r2[0,π];θ1 θ 2 \theta_{2} θ2 是引人黄金比例系数获得 的系数, 它们缩小了搜索空间, 并且指引个体逐步向最优值 靠近, 提高了算法的收玫速度, 黄金分比例系数 τ \tau τ 是一个无
理数 τ = ( 5 − 1 ) / 2 ≈ 0.618033 , ⋯   , θ 1 = a ∗ τ + b ∗ ( 1 − τ ) \tau =(\sqrt{5}-1) / 2 \approx 0.618033, \cdots, \theta_{1}=a * \tau+b *(1-\tau) τ=(5 1)/20.618033,,θ1=aτ+b(1τ), a a a b b b 的初始值取 − π -\pi π π \pi π, 在迭代过程中, a a a b b b 的值会随着目标函数值的变化而变化, θ 1 \theta_{1} θ1 θ 2 \theta_{2} θ2 的值也随之更新。
本文将黄金正弦算法作为局部算子融人基本 B O A \mathrm{BOA} BOA 中, 在迭代后期对整个 BOA算法进行黄金正弦优化, 能够弥补 算法在迭代后期的收玫速度慢, 收玫精度不高的缺陷, 基 本的 B O A \mathrm{BOA} BOA 算法在局部搜索阶段采用随机游走的方式, 搜索 空间比较广泛; 然而元启发式算法的主要目标是探索被认 为是最佳搜索空间的区域, 并确保尽可能完整地扫描这些 区域, 搜索空间的广泛性是解决问题的主要问题。在解决 问题时缩小搜索空间的效果会显著影响寻优效果, 而在 Gold-SA 算法中的参数 r 1 r_{1} r1 r 2 r_{2} r2 能够有效控制位置更新距离 和方向, 逐步缩小搜索空间, 指引蝴蝶个体迅速向最优个 体靠近, 加快种群中信息交流, 降低算法陷人局部最优值 的可能性, 从而提高算法的收玫速度和寻优精度。本文提 出的融合非线性收玫因子和黄金正弦指引机制的蝴蝶优化 算法(AGSABOA)的具体步骤如下。

请添加图片描述

3.实验结果

请添加图片描述

4.参考文献

[1]高文欣,刘升,肖子雅,于建芳.收敛因子和黄金正弦指引机制的蝴蝶优化算法[J].计算机工程与设计,2020,41(12):3384-3389.

5.Matlab代码

6.Python代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蝴蝶优化算法(Butterfly Optimization Algorithm,简称BOA)是一种基于自然界蝴蝶行为的优化算法,其思想来源于蝴蝶在寻找食物、交配、迁徙等过程中的行为。BOA算法以优化问题的目标函数为优化目标,通过调整参数来寻找最优解。 以下是一个简单的C++代码示例,可以用于实现BOA算法: ```c++ #include <iostream> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; const int N = 20; // 优化问题的维度 const int M = 50; // 种群规模 const int T = 1000; // 迭代次数 const double pi = 3.141592653589793; // 适应度函数 double fitness(double x[]) { double sum = 0.0; for (int i = 0; i < N; i++) { sum += pow(x[i], 2); } return sum; } // 蝴蝶优化算法 void BOA() { srand((unsigned)time(NULL)); // 设置随机数种子 double x[M][N]; // 种群位置矩阵 double v[M][N]; // 种群速度矩阵 double p_best[M][N]; // 个体最优位置矩阵 double g_best[N]; // 全局最优位置向量 double fitness_value[M]; // 种群适应度值向量 double w = 0.9; // 惯性权重因子 double c1 = 2.0; // 学习因子 double c2 = 2.0; // 学习因子 // 初始化种群位置矩阵和速度矩阵 for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { x[i][j] = -100.0 + rand() % 200; v[i][j] = -10.0 + rand() % 20; } } // 迭代优化 for (int t = 0; t < T; t++) { // 计算每个个体的适应度值 for (int i = 0; i < M; i++) { fitness_value[i] = fitness(x[i]); } // 更新个体最优位置矩阵 for (int i = 0; i < M; i++) { if (fitness_value[i] < fitness(p_best[i])) { for (int j = 0; j < N; j++) { p_best[i][j] = x[i][j]; } } } // 更新全局最优位置向量 int index = min_element(fitness_value, fitness_value + M) - fitness_value; for (int j = 0; j < N; j++) { g_best[j] = x[index][j]; } // 更新种群位置矩阵和速度矩阵 for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { v[i][j] = w * v[i][j] + c1 * rand() / RAND_MAX * (p_best[i][j] - x[i][j]) + c2 * rand() / RAND_MAX * (g_best[j] - x[i][j]); x[i][j] += v[i][j]; if (x[i][j] > 100.0) { x[i][j] = 100.0; } else if (x[i][j] < -100.0) { x[i][j] = -100.0; } } } } // 输出全局最优解和目标函数值 cout << "The global optimal solution is: "; for (int j = 0; j < N; j++) { cout << g_best[j] << " "; } cout << endl; cout << "The optimal value of the objective function is: " << fitness(g_best) << endl; } int main() { BOA(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智能算法研学社(Jack旭)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值