海鸥优化算法(Seagull Optimization Algorithm,SOA)

2023-11-07 13:30

本文主要是介绍海鸥优化算法(Seagull Optimization Algorithm,SOA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1 算法思想
  • 2 算法步骤
  • 3 求解函数最值(Python实现)
  • 4 算法进阶
    • 直接改进SOA
    • 融合别的智能优化算法来改进SMA
    • SMA及其改进的应用

原论文:
[1]Gaurav Dhiman, Vijay Kumar. Seagull optimization algorithm: Theory and its applications for large-scale industrial engineering problems. Knowledge-Based Systems. 2019(165), 169-196.

1 算法思想

借鉴生物行为
海鸥的迁徙和攻击行为。海鸥根据季节更替进行迁徙,迁徙飞行时海鸥会避免相互碰撞;海鸥会攻击猎物,攻击时呈螺旋形的运动形态;在一个群体中,海鸥朝着最佳位置的方向前进。

2 算法步骤

  1. 初始化参数;
  2. 初始化种群位置;
  3. 计算适应度值并保留全局最优位置;
  4. 迁徙,全局搜索:
    抽象海鸥的迁徙行为主要有三步,第一要满足避免碰撞条件(这样可以确保种群多样性);第二要计算最佳位置的方向;第三要根据该方向移动到新的位置。
    第一,计算不与相邻海鸥碰撞的新位置 C s ( t ) C_s(t) Cs(t)
    C s ( t ) = A × P s ( t ) A = f c − ( t × f c M a x i t e r a t i o n ) C_s(t)=A×P_s(t) \\ A = f_c-(t×\frac{f_c}{Max_{iteration}}) Cs(t)=A×Ps(t)A=fc(t×Maxiterationfc)
    其中, P s ( t ) P_s(t) Ps(t)为当前位置;t为当前迭代次数;A为海鸥在搜索空间中的运动行为; f c f_c fc为控制A变化频率的函数,从2线性递减到0; M a x i t e r a t i o n Max_{iteration} Maxiteration为最大迭代次数。
    第二,计算最佳位置的方向 M s ( t ) M_s(t) Ms(t)
    M s ( t ) = B × ( P b e s t ( t ) − P s ( t ) ) B = 2 × A 2 × r M_s(t)=B×(P_{best}(t)-P_s(t)) \\ B=2×A^2×r Ms(t)=B×(Pbest(t)Ps(t))B=2×A2×r
    其中, P b e s t ( t ) P_{best}(t) Pbest(t)为当前最佳位置; P s ( t ) P_s(t) Ps(t)为当前位置;B为平衡全局与局部搜索能力的随机数;r为[0,1]内的随机数。
    第三,根据该方向移动到新位置 D s ( t ) D_s(t) Ds(t)
    D s ( t ) = ∣ C s ( t ) + M s ( t ) ∣ D_s(t)=|C_s(t)+M_s(t)| Ds(t)=Cs(t)+Ms(t)
  5. 攻击猎物,局部搜索:
    海鸥攻击猎物时在空中进行螺旋运动,抽象到三维空间中为:
    { x = r c o s ( θ ) y = r s i n ( θ ) z = r θ r = u × e θ v \left\{ \begin{aligned} & x=rcos(\theta) \\ & y=rsin(\theta) \\ & z=r\theta \\ & r=u×e^{\theta v} \end{aligned} \right. x=rcos(θ)y=rsin(θ)z=rθr=u×eθv
    其中,r为螺旋半径,会越来越小; θ \theta θ为[0, 2π]内的随机角度值;u和v是两个决定螺旋形状的参数,轨迹模拟出来大概是这个样子:
    在这里插入图片描述

海鸥攻击猎物后的新位置 P s ( t ) P_s(t) Ps(t)
P s ( t ) = D s ( t ) × x × y × z + P b e s t ( t ) P_s(t)=D_s(t)×x×y×z+P_{best}(t) Ps(t)=Ds(t)×x×y×z+Pbest(t)
6. 判断是否满足终止条件,若不满足,返回步骤3。

3 求解函数最值(Python实现)

求解下列函数的最小值:
f ( x 1 , x 2 ) = x 1 2 + x 2 2 f(x_1,x_2)=x_1^2+x_2^2 f(x1,x2)=x12+x22
标准答案是0,函数长这个样子:
在这里插入图片描述
主函数:

import numpy as np
from matplotlib import pyplot as plt
import SOA'''适应度函数'''
def fun(X):Results = np.sum(X ** 2)return Results'''主函数 '''
#设置参数
pop = 30 #种群数量
MaxIter = 200 #最大迭代次数
dim = 2 #维度
lb = -10*np.ones(dim) #下边界
ub = 10*np.ones(dim)#上边界
#适应度函数选择
fobj = fun
GbestScore,GbestPositon,Curve = SOA.SOA(pop,dim,lb,ub,MaxIter,fobj) # 调用SOA函数
print('最优适应度值:',GbestScore)
print('最优解:',GbestPositon)

SOA.py:

import numpy as np
import copy'''海鸥优化算法'''
'''
输入:
pop:种群数量
dim:每个个体的维度
lb:个体下边界,维度为[1,dim]
ub:个体上边界,维度为[1,dim]
MaxIter:最大迭代次数
fun:适应度函数接口
输出:
GbestScore:最优解对应的适应度值
GbestPositon:最优解
Curve:画迭代图用
'''
def SOA(pop, dim, lb, ub, MaxIter, fun):# 1.初始化参数Curve = np.zeros([MaxIter, 1])  # 画迭代图用CS = np.zeros([pop, dim])  # 海鸥迁徙过程用到的三个变量,CS为满足避免碰撞条件的位置MS = np.zeros([pop, dim])  # MS为最佳位置的方向DS = np.zeros([pop, dim])  # DS为最终迁徙完得到的新位置fc = 2  # ???论文中的fc从2线性递减到0,可以控制变量A的变化频率,第4.1步用u = 1  # 螺旋形状的相关参数,第5步用v = 1  # 螺旋形状的相关参数,第5步用# 2.根据种群数量与边界来初始化种群位置X = initialization(pop, ub, lb, dim)  # 初始化种群# 3.计算适应度值并保留全局最优值fitness = CaculateFitness(X, fun)  # 计算适应度值fitness, sortIndex = SortFitness(fitness)  # 对适应度值排序,得到排序后的适应度值和对应的索引X = SortPosition(X, sortIndex)  # 根据排序后的索引对种群排序GbestScore = copy.copy(fitness[0])  # 此时fitness的第一个值为最好的适应度值GbestPositon = np.zeros([1, dim])GbestPositon[0, :] = copy.copy(X[0, :])  # 此时X的第一个值为最好的个体X_new = copy.copy(X)for i in range(MaxIter):# print("第"+str(i)+"次迭代")Pbest = X[0, :]for j in range(pop):# 4.1计算Cs,得到避免碰撞的位置,保持种群多样性,全局搜索A = fc - (i * (fc / MaxIter))CS[j, :] = X[j, :] * A# 4.2计算Ms,得到最佳位置的方向rd = np.random.random()B = 2 * (A ** 2) * rdMS[j, :] = B * (Pbest - X[j, :])# 4.3计算Ds,到达新位置DS[j, :] = np.abs(CS[j, :] + MS[j, :])# 5.海鸥进行螺旋运动攻击猎物,局部搜索# 螺旋形状theta = np.random.random()r = u * np.exp(theta * v) # theta为[0,1]x = r * np.cos(theta * 2 * np.pi) # theta为[0,2π]y = r * np.sin(theta * 2 * np.pi) # theta为[0,2π]z = r * theta # theta为[0,1]# 攻击猎物后的位置X_new[j, :] = x * y * z * DS[j, :] + PbestX = BorderCheck(X_new, ub, lb, pop, dim)  # 边界检查fitness = CaculateFitness(X, fun)  # 计算适应度值fitness, sortIndex = SortFitness(fitness)  # 对适应度值排序,拿到索引X = SortPosition(X, sortIndex)  # 根据索引对种群排序if (fitness[0] <= GbestScore):  # 更新全局最优GbestScore = copy.copy(fitness[0])GbestPositon[0, :] = copy.copy(X[0, :])Curve[i] = GbestScorereturn GbestScore, GbestPositon, Curve

运行结果:
最优适应度值: [6.28823104e-226]
最优解: [[-1.77578646e-113 1.77054045e-113]]
可以看到答案非常接近最优适应度值0。

4 算法进阶

  1. 在标准测试函数、CEC2014测试函数中表现一般;
  2. 标准工程优化设计问题上SOA优势很大;
  3. 螺旋行为与鲸鱼优化算法有些相似;
  4. 原文中的公式与作者上传的源码里的公式有差异;
  5. 在迭代前期收敛速度很慢,容易陷入局部最优值;
  6. 虽然当前个体确实没有和其他个体存在位置冲突,但是在螺旋飞行的过程中难免会存在个体碰撞,全局搜索能力不如想象的好;
  7. 优化Quadric函数(F3)存在问题,与全局最优相差上万;
  8. 优化Rosenbrock函数(F5)效果不好,与全局最优相差4;
  9. 优化Rastrigin函数Griewank(F9,11,16,18)效果好,能找到全局最优;

直接改进SOA

文献改进策略
王培崇,尹欣洁,李丽荣.一种具有学习机制的海鸥优化算法[J].郑州大学学报(工学版),2022,43(06):8-14.反向学习
龙文,徐明,羊洋.用于函数优化和特征选择的翻筋斗觅食海鸥优化算法[J/OL].计算机应用研究:1-7[2022-10-19].翻筋斗觅食策略
严爱军,胡开成.提高海鸥优化算法寻优能力的改进策略及其应用[J/OL].信息与控制:1-11[2022-10-19].并行搜索+反向学习+马尔可夫过程
王娟,秦江涛.混沌映射与t-分布变异策略改进的海鸥优化算法[J].计算机应用研究,2022,39(01):170-176+182.tent混沌映射+t分布变异
王宁,何庆.融合黄金正弦与sigmoid连续化的海鸥优化算法[J].计算机应用研究,2022,39(01):157-162+169.sigmoid连续化
秦维娜,张达敏,尹德鑫,蔡朋宸.一种基于非线性惯性权重的海鸥优化算法[J].小型微型计算机系统,2022,43(01):10-14.非线性惯性权重+莱维飞行机制
毛清华,王迎港.融合改进Logistics混沌和正弦余弦算子的自适应t分布海鸥算法[J/OL].小型微型计算机系统:1-9[2022-10-19].Logistics混沌映射+t分布变异

融合别的智能优化算法来改进SMA

文献融合的智能优化算法
王宁,何庆.融合黄金正弦与sigmoid连续化的海鸥优化算法[J].计算机应用研究,2022,39(01):157-162+169.黄金正弦
丁飞,江铭炎.基于改进狮群算法和BP神经网络模型的房价预测[J].山东大学学报(工学版),2021,51(04):8-16.狮群算法LSO
毛清华,王迎港.融合改进Logistics混沌和正弦余弦算子的自适应t分布海鸥算法[J/OL].小型微型计算机系统:1-9[2022-10-19].正余弦

SMA及其改进的应用

文献应用
龙文,徐明,羊洋.用于函数优化和特征选择的翻筋斗觅食海鸥优化算法[J/OL].计算机应用研究:1-7[2022-10-19].特征选择
丁飞,江铭炎.基于改进狮群算法和BP神经网络模型的房价预测[J].山东大学学报(工学版),2021,51(04):8-16.BP神经网络+房价预测
Improved seagull optimization algorithm of partition and XGBoost of prediction for fuzzy time series forecasting of COVID-19 daily confirmedxgboost+时间序列预测
王瑞. 基于改进海鸥优化算法的智能工厂柔性作业车间调度问题研究[D].燕山大学,2021.作业车间调度问题
程亚南,王晓峰,刘凇佐,刘子琳,张九龙.一种求解TSP问题的海鸥算法[J].现代电子技术,2022,45(07):112-116.旅行商问题

参考书籍:范旭,《Python智能优化算法——从原理到代码实现与应用》第一版,电子工业出版社。

这篇关于海鸥优化算法(Seagull Optimization Algorithm,SOA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363927

相关文章

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO