基于曲线自适应和模拟退火的蝗虫优化算法-附代码

该文提出了一种结合曲线自适应和模拟退火的蝗虫优化算法(SA-CAGOA),旨在解决基础蝗虫算法的局部最优问题和收敛速度。通过引入余弦和圆弧自适应策略改进参数更新,增强全局搜索能力。同时,利用模拟退火的Metropolis准则,允许接受较差解以跳出局部极值。算法在迭代过程中动态调整搜索范围,提高优化性能。实验结果展示了SA-CAGOA的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于曲线自适应和模拟退火的蝗虫优化算法


摘要:针对蝗虫优化算法容易陷入局部极值点、收敛速度慢、精度较差等缺点,提出曲线自适应和模拟退火蝗虫优化算法。首先,引入曲线自适应代替蝗虫优化算法关键参数的线性自适应,提高了算法的全局搜索能力;其次,在此基础上引入模拟退火算法,对蝗虫算法的劣势解具有一定概率的接收,使算法具有跳出局部最优,实现全局最优的能力。自适应缩小模拟退火中蝗虫位置随机解的范围,有利于进一步提高蝗虫算法的开发能力。

1.蝗虫优化算法

基础蝗虫优化算法的具体原理参考,我的博客:https://blog.youkuaiyun.com/u011835903/article/details/107694862

2. 基于曲线自适应和模拟退火的蝗虫优化算法(SA-CAGOA)

2.1 基于曲线自适应的蝗虫优化算法(CAGOA)

本文提出的 CAGOA 中主要采用两种曲线自适应策略,即余弦自适应(式(4))和圆弧自适应(式(5))。式(4)和(5)分别替代蝗虫优化算法中的线性自适应更新参数 c 的方法,从而形成两种新的 CAGOA,分别简称为 CAGOA1 和 CAGOA2。参数 c 影响着蝗虫的搜索范围,参数由大到小对应蝗虫算法由全局搜索到局部搜索的转变。曲线自适应和线性自适应的不同之处在于参数 c 的下降趋势,线性自适应以相同速率减小,而余弦自适应调整策略在开始和结束时下降速率会很小,下降缓慢,有助于增强蝗虫在开始时的全局搜索和后期的局部搜索能力。除此之外,余弦自适应参数 c 的值在前期比线性自适应的值大,可以加大蝗虫的搜索范围,增强蝗虫勘探能力;后期参数的值比线性自适应小,可以减小蝗虫的搜索范围,增强蝗虫探索能力。
c = { c o s ( π × l / m a x _ i t e r + c m a x ) × ( c m a x + c m i n ) / 2 ( c m a x − l ) / m a x _ i t e r ) 2 (4,5) c=\left\{\begin{array}{l} cos(\pi \times l/max\_iter+c_{max})\times(c_{max}+c_{min})/2 \\ (c_{max}-l)/max\_iter)^2 \end{array}\right. \tag{4,5} c={cos(π×l/max_iter+cmax)×(cmax+cmin)/2(cmaxl)/max_iter)2(4,5)

2.2 Metropolis 准则

模拟退火算法采用 Metropolis 接收准则 ,以一定概率接收较差的解,使算法能够跳出局部最优,避免陷入局部搜索。假设物体在状态 i i i下的内能为 E ( i ) E(i) E(i),状态 j j j下的内能为 E ( j ) E(j) E(j)。物体在某一温度 T T T下从状态 i i i 转移到状态 j j j,如果内能 E ( j ) < E ( i ) E(j) < E(i) E(j)E(i),则接收 j j j 为当前状态;否则,若概率 P i , j T P^T_{i,j} PijT 大于[0,1)的随机数,则仍接收状态 j j j 为当前状态,若概率 P i , j T P^T_{i,j} PijT小于[0,1)的随机数,则保留状态 i i i为当前状态。 P i , j T P^T_{i,j} PijT定义 如下:
P i j T = { 1 E ( j ) ⩽ E ( i ) e ( − E ( j ) − E ( i ) K T )  others  (6) P_{i j}^{T}=\left\{\begin{array}{ll} 1 & E(j) \leqslant E(i) \\ e^{\left(-\frac{E(j)-E(i)}{K T}\right)} & \text { others } \end{array}\right. \tag{6} PijT={1e(KTE(j)E(i))E(j)E(i) others (6)
其中: E ( i ) E(i) E(i) E ( j ) E(j) E(j)分别表示固体在状态 i i i j j j下的内能; K K K 为波尔兹曼常数。

2.3 模拟退火蝗虫随机位置

模拟退火在搜索过程引入了随机因素,在模拟退火中蝗虫的随机位置公式如下:
x i + 1 = 1 2 ( x i − u b − l b l 2 + ( u b − l b ) × 2 l 2 ×  rand  ) (7) x_{i+1}=\frac{1}{2}\left(x_{i}-\frac{u b-l b}{l^{2}}+\frac{(u b-l b) \times 2}{l^{2}} \times \text { rand }\right) \tag{7} xi+1=21(xil2ublb+l2(ublb)×2× rand )(7)
其中: x i x_i xi 是蝗虫当前位置解; x i + 1 x_{i+1} xi+1 为蝗虫随机的下个位置解; L L L是蝗虫的迭代次数; u b 、 l b ub、lb ublb 分别为蝗虫位置的上界和下界; r a n d rand rand是 0 到 1 的随机数。式(7)中蝗虫随机位置范围随蝗虫迭代次数的增加而减小,这有利于提高蝗虫后期的开发能力。

2.4 SA-CAGOA 的实现步骤

a)随机生成个 N 蝗虫的初始化种群、初始化种群位置 X i X_i Xi 、参数 c m a x 、 c m i n c_{max} 、c_{min} cmaxcmin 和最大迭代次数 m a x i t e r a t i o n max_{iteration} maxiteration;
b)计算种群每个个体的适应度值,并保存适应度值最好个体的值到变量 fitness;
c)用式(4)或(5)更新参数 c c c;
d)用式(3)更新蝗虫的位置并计算每个蝗虫的适应度值;
e)设置初始温度 T 0 T_0 T0 ,结束温度 T T T,退火系数 r r r;
f)在得到蝗虫解的邻域内用式(7)随机选择新解,计算两
个解的适应度值,并根据 Metropolis 准则更新解;
g)若步骤 f)中得到的蝗虫适应度有更好的值,则更新变量 fitness;
h)判断算法是否达到终止条件,若达到,则终止循环返回结果 fitness,否则转到步骤 c)。
在上述的实现步骤 c)中,当使用式(4)更新参数 c,即采用余弦自适应策略时,形成的最终优化算法这里简称为 SA-CA-GOA1;而当使用式(5)更新参数 c,即采用圆弧自适应策略时,则形成的最终优化算法这里简称为 SA-CAGOA2。

3.实验结果

请添加图片描述

4.参考文献

[1]李洋州,顾磊.基于曲线自适应和模拟退火的蝗虫优化算法[J].计算机应用研究,2019,36(12):3637-3643.

5.Matlab代码

6.python代码

### 蝗虫优化算法 (Grasshopper Optimization Algorithm, GOA) #### 1. 算法原理 蝗虫优化算法是一种元启发式仿生优化算法,其灵感来源于蝗虫群体在觅食过程中的协作行为。该算法通过模拟蝗虫个体之间的吸引力排斥力来指导种群的移动方向,从而实现目标函数的优化[^1]。 GOA 中的关键在于定义每只蝗虫的位置更新公式: \[ X_i^{t+1} = X_{best} + \sum_{j=1,j\neq i}^n s(r)\left(\frac{f}{L}\right)(x_j-x_i) \] 其中: - \(s(r)\) 表示社会交互强度; - \(r\) 是两只蝗虫间的距离; - \(f\) \(L\) 分别表示引力系数斥力系数; - \(X_{best}\) 是当前最优解位置。 这些参数共同决定了种群如何从初始状态逐步逼近全局最优解[^3]。 --- #### 2. MATLAB 实现代码 以下是基于 MATLAB 的简单实现版本: ```matlab function [BestPosition,BestScore]=GOA(SearchAgents_no,Max_iter,lb,ub,dim,fobj) % 初始化变量 c_max = 1; c_min = 0.00001; Positions = rand(SearchAgents_no,dim).*(ub-lb)+lb; Fitness = zeros(SearchAgents_no , 1); for i = 1:SearchAgents_no Fitness(i)= fobj(Positions(i,:)); end [~, best_index] = min(Fitness); BestPosition = Positions(best_index,:); BestScore = Fitness(best_index); Convergence_curve=zeros(Max_iter,1); for t = 1:Max_iter % 更新 c 值 c = c_max-(t/Max_iter)*(c_max-c_min); for i = 1:SearchAgents_no Force = zeros(1,dim); for j = 1:SearchAgents_no if i ~= j distance = abs(Positions(j,:) - Positions(i,:)); s = c * ((ub - lb)/2) .* exp(-distance ./((ub - lb)/10)) .* cos(2*pi*distance / ((ub - lb)/10)); Force = Force + s.*(Positions(j,:) - Positions(i,:))/norm(distance); end end New_Position = BestPosition + Force; New_Position = max(New_Position, lb); New_Position = min(New_Position, ub); if fobj(New_Position)<Fitness(i) Positions(i,:) = New_Position; Fitness(i) = fobj(New_Position); if Fitness(i) < BestScore BestScore = Fitness(i); BestPosition = Positions(i,:); end end end Convergence_curve(t) = BestScore; end figure('name','GOA convergence curve'); plot(Convergence_curve,'LineWidth',2);xlabel('Iteration');ylabel('Best Score'); grid on; ``` --- #### 3. Python 实现代码 下面是基于 Python 的实现版本: ```python import numpy as np def GOA(fobj, lb, ub, dim, SearchAgents_no, Max_iter): c_max = 1 c_min = 0.00001 Positions = np.random.uniform(lb, ub, (SearchAgents_no, dim)) Fitness = np.array([fobj(pos) for pos in Positions]) BestIndex = np.argmin(Fitness) BestPosition = Positions[BestIndex].copy() BestScore = Fitness[BestIndex] ConvergenceCurve = [] for t in range(Max_iter): c = c_max - t * (c_max - c_min) / Max_iter for i in range(SearchAgents_no): Force = np.zeros(dim) for j in range(SearchAgents_no): if i != j: dist = np.abs(Positions[j] - Positions[i]) s = c * ((ub - lb) / 2) * \ np.exp(-dist / ((ub - lb) / 10)) * \ np.cos(2 * np.pi * dist / ((ub - lb) / 10)) Force += s * (Positions[j] - Positions[i]) / (np.linalg.norm(dist) + 1e-8) New_Position = BestPosition + Force New_Position = np.clip(New_Position, lb, ub) if fobj(New_Position) < Fitness[i]: Positions[i] = New_Position.copy() Fitness[i] = fobj(New_Position) if Fitness[i] < BestScore: BestScore = Fitness[i] BestPosition = Positions[i].copy() ConvergenceCurve.append(BestScore) import matplotlib.pyplot as plt plt.plot(range(len(ConvergenceCurve)), ConvergenceCurve, 'r') plt.title("GOA Convergence Curve") plt.xlabel("Iterations"); plt.ylabel("Best Score") plt.show() return BestPosition, BestScore ``` --- #### 4. 改进版算法简介 由于标准 GOA 存在容易陷入局部最优的问题,研究者提出了多种改进方案,例如基于曲线自适应的 CAGOA、结合模拟退火的 SA-GOA 及两者融合的 SA-CAGOA 方法[^2]。这些改进策略显著提升了算法的鲁棒性适用范围。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智能算法研学社(Jack旭)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值