SCA|可作为有效改进策略的算法——正余弦优化算法(Matlab/Python)

23 篇文章 0 订阅
7 篇文章 0 订阅

在这里插入图片描述

正余弦优化算法(Sine cosine algorithm,SCA)是由Mirjalili [1]在2016年提出,目前WOS上引用量2K+,谷歌学术上4K+。

在这里插入图片描述

不得不说Seyedali Mirjalili真是位大神级的人物(下图是Mirjalili开发的部分算法)

在这里插入图片描述

SCA的核心思想是利用正、余弦函数波动的周期性,在全局范围内探索最优解,使算法逐步收敛。其具有结构简单、参数少、易于实现的特点。其优化性能优于GA、PSO、花授粉等,已被广泛用于数据分类、光谱特征峰定位和电力系统调度等不同领域。

在这里插入图片描述

另一方面,算法的混合来看,混合元启发式算法的主要目标是利用每种算法的优点,以最大限度地减少每种算法的缺点。正是由于SCA模型的简单及其优秀的搜索性能,其更易于算法的混合。

本文主要内容包括:SCA算法原理,SCA算法的改进与利用思路,以及SCA算法的MATLAB和Python代码实现。

00 目录

1 正余弦算法SCA原理

2 改进&利用

3 代码目录

4 算法性能

5 源码获取

01 正余弦算法SCA原理

SCA的独特之处在于使用正弦和余弦波来控制探索和开发搜索空间。下面的数学方程可以描述这个过程:

在这里插入图片描述

Pt ij指示迭代t中的最佳个体位置。此外,有四个随机参数r1,r2,r3和r4。r1控制搜索代理的下一个位置,如果r1小于1,则倾向于开发,如果r1大于1,则倾向于勘探。为了平衡勘探与开发,r1的定义式是线性递减的,其中a一般取2。r2表示向外或向内的移动步长,r2参数的范围是[0,2 π]。r3在0和2之间的范围内,如果r3大于1,则更注重全局最优位置,否则不强调。r4是在0和1之间的随机参数,用以转换正弦和余弦。

其寻优示意图如下:
在这里插入图片描述

图:陈亮, 汤显峰. 改进正余弦算法优化特征选择及数据分类[J]. 计算机应用, 2022, 42(6): 1852-1861.

以上就是SCA的全部理论,很简单吧~

02 改进&利用

根据没有免费的午餐(NFL)定理[2],没有一个算法可以处理所有的优化问题,即每个算法都有其优势和局限性,这也激励着学者提出各种改进的算法来解决不同类型的优化问题,同时也为算法间的混合利用提供了参考。

2.1 改进

SCA在面对复杂问题时仍然存在优化精度低、容易陷入局部极值、收敛速度慢等问题,这里给出一种思路。SCA中,r1用于平衡全局搜索和局部开发能力,但线性递减的策略使得前期递减的过快,全局搜索不充分,后期递减的过慢,无法快速收敛,因此可以设计一种非线性的参数r1以提高其搜索能力。同时,针对其易陷入局部最优的问题,也可以引入如Levy等变异策略。

2.2 利用

SCA模型的正余弦震荡变化特性使其在解空间具有良好的搜索能力,可以直接引入该式替换算法某部分的寻优,或是将其融入算法的更新方程中,如下是一篇文献[A collaboration-based hybrid GWO-SCA optimizer for engineering optimization problems]的思路(将SCA融入GWO中):

原GWO算法

在这里插入图片描述

融入SCA的GWO算法
在这里插入图片描述

03 代码目录

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

代码包含MATLAB和Python,考虑到很多同学获取代码后,MATLAB代码部分有乱码(MATLAB版本问题),可以将MATLAB版本改为2020及以上,或使用乱码解决文件夹中的txt文件即可。

代码都经过作者重新注释,代码更清爽,可读性强。

部分代码:(MATLAB与Python)

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

04算法性能

采用标准测试函数初步检验其寻优性能

在Matlab中,进行CEC2005函数的测试,执行程序结果如下:

在这里插入图片描述

在Python中,进行CEC2005函数的测试,执行程序结果如下:

在这里插入图片描述

05 源码获取

在GZH(KAU的云实验台)后台回复 SCA 即可

参考文献

[1] MIRJALILI S.SCA:A sine cosine algorithm for solving optimization problems[J].Knowledge-Based Systems,2016,96:120-133.

[2] Wolpert DH, Macready WG. No free lunch theorems for optimization. IEEE transactions on evolutionary computation 67–82, 1997.

另:如果有伙伴有待解决的优化问题(各种领域都可),可以发我,我会选择性的更新利用优化算法解决这些问题的文章。

如果这篇文章对你有帮助或启发,可以点击右下角的赞/在看(ง •̀_•́)ง(不点也行),你们的鼓励就是我坚持的动力!

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态分级策略改进余弦算法是一种用于高效计算三角函数值的算法,特别适用于嵌入式系统和低端计算机。下面给出一份用C++实现的代码,注释详细,希望能够帮助您理解该算法。 ```c++ #include <iostream> #include <cmath> using namespace std; const int N = 7; // 分级数,可以根据需要调整 const double PI = acos(-1.0); // 定义π // 分级策略改进算法 double sinImproved(double x) { double ans = 0; double a[N] = {0}; // 存储不同级别的系数 double factor = x; for (int i = 0; i < N; i++) { a[i] = factor; factor *= -x * x / ((2 * i + 2) * (2 * i + 3)); } for (int i = N - 1; i >= 0; i--) { ans += a[i]; } return ans; } // 分级策略改进余弦算法 double cosImproved(double x) { double ans = 0; double a[N] = {0}; // 存储不同级别的系数 double factor = 1; for (int i = 0; i < N; i++) { a[i] = factor; factor *= -x * x / ((2 * i + 1) * (2 * i + 2)); } for (int i = N - 1; i >= 0; i--) { ans += a[i]; } return ans; } int main() { double x = PI / 4; // 要计算的角度,这里取π/4 double sinx = sinImproved(x); // 计算sin(x) double cosx = cosImproved(x); // 计算cos(x) cout << "sin(" << x << ") = " << sinx << endl; cout << "cos(" << x << ") = " << cosx << endl; return 0; } ``` 该程序定义了两个函数`sinImproved`和`cosImproved`,分别用于计算弦和余弦的值。其中,`N`表示分级数,该值越大,计算精度越高,但计算速度越慢。在实际应用中,可以根据需要进行调整。 对于弦函数,首先定义了一个数组`a`,用于存储不同级别的系数。然后,通过迭代计算出每个系数的值,并存储在对应的数组元素中。最后,将所有系数相加,得到弦函数的值。 对于余弦函数,与弦函数类似,也是先定义一个数组`a`,然后通过迭代计算出每个系数的值,并存储在对应的数组元素中。最后,将所有系数相加,得到余弦函数的值。 在主函数中,首先定义要计算的角度`x`,这里取π/4。然后,分别调用`sinImproved`和`cosImproved`函数,计算出弦和余弦的值,并输出结果。 总之,该程序实现了动态分级策略改进余弦算法,通过注释详细解释了算法的实现过程,希望能够对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值