基于阈值控制的一种改进鲸鱼算法-附代码

2023-11-09

基于阈值控制的一种改进鲸鱼算法


摘要: 针对鲸鱼算法在迭代后期种群多样性减少问题,本文提出一种基于阈值控制的改进鲸鱼优化算法(简记为TIWOA),将均匀分布空间与伪反向学习策略相结合,对原始种群位置进行初始化,为全局搜索奠定基础;改进了基于正态变异算子的选择种群方案,增加了局部搜索速度;设计了非线性收敛因子,配合改进的基于正弦函数的螺旋位置更新,使算法在迭代后期有更好的全局搜索能力。

1.鲸鱼优化算法

基础鲸鱼算法的具体原理参考,我的博客:https://blog.csdn.net/u011835903/article/details/107559167

2. 改进鲸鱼优化算法

2.1 基于均匀分布空间与伪反向学习策略的种群初始化

对于启发式智能优化算法来说, 初始迭代点的好坏往 往影响着收敛的速度与精度 า า ר 。原始 WOA算法在初始 化种群个体时使用了随机方法, 使用这种随机方法求解一 个多峰函数时, 若生成的初始种群相对集中在某个区域或 者分散在离最优点较远的峰, 则通过算法进行计算, 很可 能得到局部最优解。因此, 在初始点的选择上, 应尽可能 分布在不同维数的各个位置, 最大程度地提取求解函数中 的信息, 保障初始点的多样性。基于以上考虑, 结合对立 学习策略, 提出了一种均匀分布空间的种群个体随机方 法, 尽可能地将初始点均匀分布在可行域的空间里。具体 方法如下:
令求解函数可行域中, 每个维数的上确界集合为 ub = [ u b 1 , u b 2 , ⋯   , u b d ] =\left[u b_{1}, u b_{2}, \cdots, u b_{d}\right] =[ub1,ub2,,ubd], 下确界集合为 l b = [ l b 1 , l b 2 , ⋯   \mathrm{lb}=\left[\mathrm{lb}_{1}, \mathrm{lb}_{2}, \cdots\right. lb=[lb1,lb2,, 1   b d ] \left.1 \mathrm{~b}_{d}\right] 1 bd], 则根据均匀分布空间初始化种群的方法, 第 i i i 只鯨 鱼的第 j j j 维的位置初始化公式如下所示:
X i ′ = ( R N U M i − 1 ) × ( u b j − 1   b j ) N + rand ⁡ ( 0 , u b j − 1   b j N ) (8) X_{i}^{\prime}=\left(\mathrm{RNUM}_{i}-1\right) \times \frac{\left(\mathrm{ub}_{j}-1 \mathrm{~b}_{j}\right)}{N}+\operatorname{rand}\left(0, \frac{\mathrm{ub}_{j}-1 \mathrm{~b}_{j}}{N}\right) \tag{8} Xi=(RNUMi1)×N(ubj1 bj)+rand(0,Nubj1 bj)(8)
R N U M = r a n d p e r m ( N U M ) (9) RNUM =randperm(NUM) \tag{9} RNUM=randperm(NUM)(9)

其中, rand ⁡ ( a , b ) \operatorname{rand}(a, b) rand(a,b) 表示生成 a a a b b b 之间的随机数, N U M = \mathrm{NUM}= NUM= [ N U M 1 , N U M 2 , ⋯   , N U M N ] \left[\mathrm{NUM}_{1}, \mathrm{NUM}_{2}, \cdots, \mathrm{NUM}_{N}\right] [NUM1,NUM2,,NUMN] 表示从 1 到种群个体总数 N N N 的整数组成的数组, 其中 N U M i = i \mathrm{NUM}_{i}=i NUMi=i, randpcrm(NUM) 表 示将数组 NUM 中元萦的顺序随机打乱, 进行重新排列, 重新排列后的数组记为 R N U M = [ R N U M 1 , R N U M N 2 , ⋯   \mathrm{RNUM}=\left[\mathrm{RNUM}_{1}, \mathrm{RNUM} \mathrm{N}_{2}, \cdots\right. RNUM=[RNUM1,RNUMN2,, R N U M N ] \left.\mathrm{RNUM}_{N}\right] RNUMN], 数组 RNUM 依然是由 1 到 N N N 的整数组成。 利用这样的方式, 能够将每个维数的可行域等分成 N N N 个 小区间, 每只鲸鱼个体在随机不重复的在一个小区间上随 机取点, 这样使得初始点在每个维数上的取点更加均匀, 很大程度上减少算法得到局部最优解的概率。
对立学习策略 (opposition-based learning, OBL ) − 177 { }^{-177} 177 是 近年来智能算法领域的一种新技术, 在 PSO 算法等智能 算法中成功应用后, 龙文等 已将该方法用于 W O ∧ W O \wedge WO 算 法, 使得初始点的质量有了明显的提高, 但该方案在作用 域对称时, 对立学习的效果会有所淢弱。因此为了提高对 立学习的能力, 黄元春等在改进标准对立学习策略后, 提 出了伪反向学习策略的种群初始化方案 − 187 { }^{-187} 187, 具体步叕如 T:
在利用均匀分布空间的方法随机得到了第 i i i 只鲸鱼 在可行域内的位置 X i = ( X i 1 , X i 2 , ⋯   , X i d ) , i = 1 , 2 , ⋯ X_{i}=\left(X_{i}^{1}, X_{i}^{2}, \cdots, X_{i}^{d}\right), i=1,2, \cdots Xi=(Xi1,Xi2,,Xid),i=1,2,, N N N, 其中 d d d 为维数, 则第 i i i 只鲸鱼伪反向个体 X ˉ i = ( X ˉ i ⊤ \bar{X}_{i}=\left(\bar{X}_{i}^{\top}\right. Xˉi=(Xˉi, X ˉ i 2 , ⋯   , X ˉ i d \bar{X}_{i}^{2}, \cdots, \bar{X}_{i}^{d} Xˉi2,,Xˉid ) 的计算公式如下:
X ~ i j = u b + l b − X i j , j = 1 , 2 , ⋯   , d (10) \tilde{X}_{i}^{j}=u b+l b-X_{i}^{j}, \quad j=1,2, \cdots, d \tag{10} X~ij=ub+lbXij,j=1,2,,d(10)

X ˉ i j = { rand ⁡ ( M j , X ~ i j ) , X i j ≤ M j rand ⁡ ( X ~ i j , M j ) , X i j > M j (11) \begin{gathered} \bar{X}_{i}^{j}=\left\{\begin{array}{l} \operatorname{rand}\left(M_{j}, \widetilde{X}_{i}^{j}\right), X_{i}^{j} \leq M_{j} \\ \operatorname{rand}\left(\tilde{X}_{i}^{j}, M_{j}\right), X_{i}^{j}>M_{j} \end{array}\right. \end{gathered}\tag{11} Xˉij= rand(Mj,X ij),XijMjrand(X~ij,Mj),Xij>Mj(11)
其中, M j = 0.5 ( u b − l b ) , rand ⁡ ( X ~ i j , M j ) M_{j}=0.5(\mathrm{ub}-\mathrm{lb}), \operatorname{rand}\left(\tilde{X}_{i}^{j}, M_{j}\right) Mj=0.5(ublb),rand(X~ij,Mj) 表示 ( X ~ i j , M j ) \left(\widetilde{X}_{i}^{j}, M_{j}\right) (X ij,Mj) 内 的随机数。由均匀分布空间与伪反向学习策略初始化种群算法步聚如下:

请添加图片描述

2.2 基于正态变异的择优选择

正态变异算子 作为一种常见的智能算法干扰方 式, 在迭代前期会加快捜寻最优解的速度, 在迭代后期, 种 群的个体不断向最优个体集中, 导致种群多样性的减少, 利用正态变异算子可以丰富种群的多样性。通过该变异 方案与搜索包围机制, 螺旋更新位置结合, 可以在提高局 部搜索能力的同时,提高全局搜索范围,极大地提高搜寻 到最优解的概率和精度。
在之前的改进中, 钟明辉 等 将正态变异算子应用 于每次迭代后的最优个体, 本算法中的正态变异算子将推 广到对每个个体, 并且将变异后的个体与原个体的适应度 进行比较, 并且择优选择适应度小的个体代替当前个体进 人下一次迭代。再进过分析, 择优选择的方法会减弱全局 捜索能力, 故在全局搜寻阶段, 直接选择变异后的个体作 为当前个体, 不进行择优选择, 故第 i i i 只鲸鱼的第 j j j 维的 正态变异计算公式如下:
X ˉ i j = X i j + N ( 0 , 1 ) ⋅ X i j (12) \bar{X}_{i}^{j}=X_{i}^{j}+N(0,1) \cdot X_{i}^{j} \tag{12} Xˉij=Xij+N(0,1)Xij(12)
选择变异前后的最优个体作为进人下一次迭代的个体, 其 计算公式如下:
X i + 1 = { f − 1 ( min ⁡ ( f ( X i ) , f ( X ˉ 2 ) ) ) , f ( X i ( t ) ) − f ( X i ( t − s ) ) ≠ 0 X ˉ i , f ( X i ( t ) ) − f ( X i ( t − s ) ) = 0 (13) X_{i+1}=\left\{\begin{array}{c} f^{-1}\left(\min \left(f\left(X_{i}\right), f\left(\bar{X}_{2}\right)\right)\right), \\ f\left(X_{i}(t)\right)-f\left(X_{i}(t-s)\right) \neq 0 \\ \bar{X}_{i}, \quad f\left(X_{i}(t)\right)-f\left(X_{i}(t-s)\right)=0 \end{array}\right. \tag{13} Xi+1= f1(min(f(Xi),f(Xˉ2))),f(Xi(t))f(Xi(ts))=0Xˉi,f(Xi(t))f(Xi(ts))=0(13)
其中, N ( 0 , 1 ) N(0,1) N(0,1) 表示均值为 0 , 方差为 1 的标准正态分布, f ( X ) f(X) f(X) 表示个体 X X X 的适应度, f − 1 ( min ⁡ ( X , Y ) ) f^{-1}(\min (X, Y)) f1(min(X,Y)) 表示选择 适应度最小的 X X X Y , s Y, s Y,s 表示阈值, 阈值的作用是为了检 验算法是否能够继续提高局部捜索的精度。 X i ( t ) X_{i}(t) Xi(t) 䘚示当 前个体第 t \mathrm{t} t 次迭代后的位置, 若 f ( X i ( t ) ) − f ( X i ( t − s ) ) f\left(X_{i}(t)\right)-f\left(X_{i}(t-s)\right) f(Xi(t))f(Xi(ts)) ≠ 0 \neq 0 =0, 表示算法依然在有效的搜寻最优点以及提高局部搜 索的精度; 否则,说明算法在该局部的精度可能达到当前 算法方案的极限, 需要提高局部搜索和全局搜索能力。阈 值的取值林当重要, 若阈值太大, 则订算达到算法的极限 精度时,需要经过 s s s 次迭代后, 才能检测到计算达到该精 度。

2.3 基于正弦函数的螺旋更新位置

W O ∧ W O \wedge WO 算法中,螺旋更新位置是一种不断靠近当前 最优个体, 并且在最优个体附近进行捜索的方法。若陷人 局部最优解, 仅仅通过正态变异算子进行干扰很难跳出局 部最优解, 相对于 W ∧ ∧ \mathrm{W} \wedge \wedge W 算法的收缩包围机制, 根据 ∣ A ∣ |A| A 值可以向最优点进行局部搜索, 或者向随机点进行全局搜 索。根据上述思路, 吴泽忠等提出了一种基于正弦函数螺 旋更新位置的方案 − 137 { }^{-137} 137, 这种方法使得最优点可以向当前 迭代点进行包围搜索, 加强其全局搜索能力, 并且正弦函 数也能提高局部搜索的精度, 但是减弱了前期的收敛速 度。结合以上方案, 在保证收敛速度的前提下, 希望能在 局部搜索时对精度有更好的探索, 则改进的基于正弦函数 的螺旋更新位置计算公式为:
X i j ( t ) = { D ˙ ′ e b l cos ⁡ ( 2 π l ) + X ∗ ( t ) , f ( X ∗ ( t ) ) − f ( X ∗ ( t − s ) ) ≠ 0 D ˙ ′ e b l cos ⁡ ( 2 π l ) + X i j ( t ) + sin ⁡ ( X i j ( t ) ) f ( X ∗ ( t ) ) − f ( X ∗ ( t − s ) ) = 0 (14) X_{i}^{j}(t)=\left\{\begin{array}{r} \dot{D}^{\prime} e^{b l} \cos (2 \pi l)+X^{*}(t), \\ f\left(X^{*}(t)\right)-f\left(X^{*}(t-s)\right) \neq 0 \\ \dot{D}^{\prime} e^{b l} \cos (2 \pi l)+X_{i}^{j}(t)+\sin \left(X_{i}^{j}(t)\right) \\ f\left(X^{*}(t)\right)-f\left(X^{*}(t-s)\right)=0 \end{array}\right. \tag{14} Xij(t)= D˙eblcos(2πl)+X(t),f(X(t))f(X(ts))=0D˙eblcos(2πl)+Xij(t)+sin(Xij(t))f(X(t))f(X(ts))=0(14)
其中, D ˙ ′ = ∣ X i ( t ) − X ∗ ( t ) ∣ \dot{D}^{\prime}=\left|X_{i}(t)-X^{*}(t)\right| D˙=Xi(t)X(t) 表示第 i i i 条鲸鱼到当前最优 个体的直线距离。 s s s 表示阈值, 其数值与公式(13)相同。 当算法依然在有效地提高局部搜索的精度时, 利用基本 woa算法的螺旋更新位置进行搜索; 当在该局部的精度 可能达到当前算法方案的极限时, 利用改进的基于正弦函 数的螺旋更新位置进行搜索。

2.4基于正弦函数的螺旋更新位置

本文提出的 T I W O Λ \mathrm{TIWO \Lambda} TIWOΛ 算法, 通过正态变异算子, 基于 正弦函数的螺旋更新位置两种方案, 提高了后期的局部搜 索能力与全㟃搜索能力。通过实验发现由于前期迭代收 敛较快, 导致了随机搜索方法 (式 (7))更难得到适应度更 优的个体, 所以在前期迭代应使收敛因子 a a a 大于 1 , 并且 快速减少到 1 以下, 故在 TIWOA算法中, 设计了一种收 敛因子 a a a 非线性从 2 减少到 0.5 , a 0.5, a 0.5,a 减小的速度先快后 慢, 这样的设计使得前期能进行全局搜索的同时, 加快局 部捜索的速度,得到改进的非线性收敛因子公式为:
a = { ( t − 1 T − 1 ) 2 + 1 , 1 ≤ t ≤ T 1 2 ( t − T − 1 t max ⁡ − T − 1 ) 2 + 0.5 , T < t ≤ t max ⁡ (15) a= \begin{cases}\left(\frac{t-1}{T-1}\right)^{2}+1, & 1 \leq t \leq T \\ \frac{1}{2}\left(\frac{t-T-1}{t_{\max }-T-1}\right)^{2}+0.5, & T<t \leq t_{\max } \end{cases}\tag{15} a= (T1t1)2+1,21(tmaxT1tT1)2+0.5,1tTT<ttmax(15)

T = f l o o r ( t max ⁡ / 50 ) (16) T=f l o o r\left(t_{\max } / 50\right) \tag{16} T=floor(tmax/50)(16)
其中, floor ( x ) (x) (x) 表示对 x x x 向下取整, 即不大于 x x x 的整数。 这里的 T T T 值为收敛因子 a a a 的分界线,当迭代次数小于 T T T 时, 收敛因子 a > 1 a>1 a>1; 当迭代次数大于 T T T 时, 收敛因子 a < a< a< 1.

2.5 引入阈值判断函数是否达到局部最优解

TIWOA 算法利用阈值 p p p 来判断算法是否达到了局部最优 解, 判断的方式如下:
P = { 1 , f ( X ∗ ( t ) ) − f ( X ∗ ( t − p ) ) ≠ 0 0 , f ( X ∗ ( t ) ) − f ( X ∗ ( t − p ) ) = 0 (17) P= \begin{cases}1, & f\left(X^{*}(t)\right)-f\left(X^{*}(t-p)\right) \neq 0 \\ 0, & f\left(X^{*}(t)\right)-f\left(X^{*}(t-p)\right)=0\end{cases} \tag{17} P={1,0,f(X(t))f(X(tp))=0f(X(t))f(X(tp))=0(17)
其中, P = 1 P=1 P=1 时,算法根据式 (13)、式 (11)的判断条件来执 行对应的等式, 若 P = 0 P=0 P=0 时, 式 (13)、式 (11) 的判断条件强 制失效, 并强行执行情况(2)的方案。这样的改进能够更 好地调整算法方案, 增加迭代速度与求解精度。

请添加图片描述

3.实验结果

请添加图片描述

4.参考文献

[1]黄飞,吴泽忠.基于阈值控制的一种改进鲸鱼算法[J].系统工程,2020,38(02):133-148.

5.Matlab代码

6.Python代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于阈值控制的一种改进鲸鱼算法-附代码 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo

随机推荐