【智能算法】引力搜索算法(GSA)原理及实现

在这里插入图片描述


1.背景

2009年,Esmat Rashedi等人受到万有引力定律启发,提出了引力搜索算法(Gravitational Search Algorithm,GSA)。

2.算法原理

2.1算法思想

GSA基于万有引力定律:任何物体之间都有相互吸引力,这个力的大小与各个物体的质量成正比例,而与它们之间的距离的平方成反比。

2.2算法过程

万有引力定律
万有引力定律可以表述为:
F = G M 1 M 2 R 2 F=G\frac{M_{1}M_{2}}{R^{2}} F=GR2M1M2
其中, G G G是引力常数。由于重力减弱的影响,引力常数的实际值取决于宇宙的实际年龄:
G ( t ) = G ( t 0 ) × ( t 0 t ) β , β < 1 G(t)=G(t_{0})\times\left(\frac{t_{0}}{t}\right)^{\beta},\quad\beta<1 G(t)=G(t0)×(tt0)β,β<1
在理论物理中,存在三种质量:

  • 主动引力质量 M a M_a Ma:决定物体产生的引力场的强弱
  • 被动引力质量 M p M_p Mp:决定物体在处于其他引力场时受到的引力大小
  • 惯性质量 M i M_i Mi:用于度量施加外力时运动状态不易改变的程度

因此,质量 i i i受到质量 j j j作用的引力 F i j F_{ij} Fij,与质量 j j j的主动引力质量和质量 i i i的被动引力质量的乘积成正比,与它们之间的距离的平方成反比, 牛顿定律可以重新表述为:
F i j = G M a j × M p i R 2 a i = F i j M i i \begin{aligned}F_{ij}&=G\frac{M_{aj}\times M_{pi}}{R^2}\\a_i&=\frac{F_{ij}}{M_{ii}}\end{aligned} Fijai=GR2Maj×Mpi=MiiFij
加速度,速度和位置更新:
t t t时刻,质量 i i i受到质量 j j j的力为:
F i j d ( t ) = G ( t ) M p i ( t ) × M a j ( t ) R i j ( t ) + ε ( x j d ( t ) − x i d ( t ) ) F_{ij}^{d}(t)=G(t)\frac{M_{pi}(t)\times M_{aj}(t)}{R_{ij}(t)+\varepsilon}(x_{j}^{d}(t)-x_{i}^{d}(t)) Fijd(t)=G(t)Rij(t)+εMpi(t)×Maj(t)(xjd(t)xid(t))
其中,距离 R i j R_{ij} Rij为欧式距离。
GSA中考虑随机特征,这里将质量 i i i在维度 d d d上受到的力随机加权:
F i d ( t ) = ∑ j = 1 , j ≠ i N r a n d j F i j d ( t ) F_{i}^{d}(t)=\sum_{j=1,j\neq i}^{N}rand_{j}F_{ij}^{d}(t) Fid(t)=j=1,j=iNrandjFijd(t)
由牛顿第二定律,加速度有:
a i d ( t ) = F i d ( t ) M i i ( t ) a_{i}^{d}(t)=\frac{F_{i}^{d}(t)}{M_{ii}(t)} aid(t)=Mii(t)Fid(t)
因此,速度和位置更新为:
ν i d ( t + 1 ) = r a n d i × ν i d ( t ) + a i d ( t ) x i d ( t + 1 ) = x i d ( t ) + ν i d ( t + 1 ) \begin{aligned}\nu_i^d(t+1)&=rand_i\times\nu_i^d(t)+a_i^d(t)\\x_i^d(t+1)&=x_i^d(t)+\nu_i^d(t+1)\end{aligned} νid(t+1)xid(t+1)=randi×νid(t)+aid(t)=xid(t)+νid(t+1)
流程图
在这里插入图片描述

3.代码实现

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

代码传送门
在这里插入图片描述

4.参考文献

[1] Rashedi E, Nezamabadi-Pour H, Saryazdi S. GSA: a gravitational search algorithm[J]. Information sciences, 2009, 179(13): 2232-2248.

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引力搜索算法(Gravitational Search Algorithm,GSA)是一种基于引力模拟的优化算法,它模拟天体之间的引力作用,并通过引力和质量的变化来更新搜索代理(代表搜索空间中的潜在解),从而找到优化问题的最佳解。 下面是 Python 实现 GSA 算法的代码: ```python import numpy as np import random # 初始化参数 n = 50 # 搜索代理的数量 m = 2 # 目标问题的维度 G0 = 100 # 引力常数 max_iter = 1000 # 最大迭代次数 eps = 1e-6 # 收敛阈值 # 定义目标函数 def f(x): return (x[0] - 2) ** 2 + (x[1] - 1) ** 2 # 初始化搜索代理位置、速度和质量 X = np.random.rand(n, m) * 10 # 位置范围为 [0,10] V = np.zeros((n, m)) # 初始速度为0 M = np.ones(n) # 质量均为1 # 计算每个搜索代理的适应度值(即目标函数值) fitness = np.array([f(x) for x in X]) # 开始迭代 for it in range(max_iter): # 计算每个搜索代理之间的引力 G = G0 / (it + 1) # 引力常数根据迭代次数递减 dist = np.zeros((n, n)) for i in range(n): for j in range(n): if i != j: dist[i, j] = np.linalg.norm(X[i] - X[j]) # 计算欧几里得距离 F = G * np.tile(M.reshape((-1, 1)), (1, n)) * np.tile(M.reshape((1, -1)), (n, 1)) / (dist ** 2 + eps) # F[i,j] 表示第 i 个搜索代理对第 j 个搜索代理的引力大小 # 计算每个搜索代理所受到的引力和产生的加速度 acc = np.zeros((n, m)) for i in range(n): for j in range(n): if i != j: acc[i] += F[i, j] * (X[j] - X[i]) / (np.linalg.norm(X[j] - X[i]) + eps) # 计算加速度 V = np.random.rand(n, m) * V + acc # 更新速度 X_new = X + V # 更新位置 # 判断新位置是否超出边界 X_new = np.clip(X_new, 0, 10) # 计算新位置的适应度值 fitness_new = np.array([f(x) for x in X_new]) # 计算每个搜索代理的质量 M_new = M.copy() for i in range(n): if fitness_new[i] < fitness[i]: M_new[i] *= 1.2 # 适应度提升时质量增加 else: M_new[i] *= 0.8 # 适应度下降时质量减少 # 更新搜索代理的位置、质量和适应度值 X = X_new.copy() M = M_new.copy() fitness = fitness_new.copy() # 输出最终结果 best_index = np.argmin(fitness) print("最优解:", X[best_index]) print("最优目标值:", fitness[best_index]) ``` 在这个例子中,我们寻找 $f(x)=(x_1-2)^2+(x_2-1)^2$ 的最小值,目标函数的输入是一个 $2$ 维向量 $x=(x_1,x_2)$。算法生成 $50$ 个搜索代理,每个搜索代理的位置和速度被初始化为一个 $m=2$ 维的随机向量。随着迭代的进行,搜索代理之间的引力随着 $G_0/(it+1)$ 的递减而减小。每个搜索代理受到的引力和加速度根据上面的公式计算,然后用当前速度更新位置。更新后的搜索代理位置被修剪到区间 $[0,10]$,以确保它们不超出问题的搜索空间。搜索代理的质量在每个迭代中随适应度值的变化而变化。最终,算法输出找到的最优解和最优目标函数值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小O的算法实验室

谢谢大佬的肯定!

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

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

打赏作者

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

抵扣说明:

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

余额充值