
获取更多资讯,赶快关注上面的公众号吧!
第三十一章 引力搜索算法(Gravitational Search Algorithm,GSA)
2009,伊朗的Esmat Rashedi等人基于万有引力定律和粒子间相互作用提出了一种新型的优化算法——引力搜索算法(Gravitational Search Algorithm,GSA)。在该算法中,在提出的算法中,搜索代理是基于牛顿引力和运动定律相互作用的粒子集合。算法源代码可以关注公众号,后台回复"GSA或引力"获取。
万有引力定律
万有引力,全称为"万有引力定律"(law of universal gravitation),为物体间相互作用的一条定律,1687年为牛顿所发现。任何物体之间都有相互吸引力,这个力的大小与各个物体的质量成正比例,而与它们之间的距离的平方成反比。如果用M1、M2表示两个物体的质量,R表示它们间的距离,则物体间相互吸引力为
F=(GM1M2)/R²(1)
G称为万有引力常数也可简称为引力常数。
牛顿第二定律说的是,当一个力F作用于一个粒子时,其加速度a仅取决于该力和其质量M:
a=F/M(2)
此外,由于引力递减的影响,引力常数的实际值取决于宇宙的实际年龄,下面给出了引力常数随着年龄的递减方程:
G(t)=G(t0)×(tt0)β,β<1(3)
在理论物理学中,存在三种质量:
- 主动引力质量Ma:决定物体产生的引力场的强弱;
- 被动引力质量M−P:决定物体在处于其他引力场时受到的引力大小;
- 惯性质量Mi:用于度量施加外力时运动状态不易改变的程度。
根据以上描述,可以重写牛顿定律。质量j作用于质量i的引力Fij与主动引力质量j和被动引力质量i的乘积成正比,与它们的距离平方成反比。ai与Fij成正比,与i的惯性质量成反比,即
Fij=GR2Maj×Mpi(4)
ai=MiiFij(5)
其中Maj和Mpi分别表示粒子i的主动引力质量和粒子j的被动引力质量。Mii为粒子i的惯性质量。
GSA
在GSA中,代理即为物体,其性能由它们的质量进行度量。所有这些物体都受到引力的吸引,这个引力导致所有物体都朝着质量更重的物体运动。较重的质量——对应于好的解——比较轻的解移动得更慢,这保证了对算法进行利用。
每个质量(代理)有4个属性:位置,惯性质量,主动引力质量和被动引力质量。随着时间的推移,质量期望被最大质量吸引,而这个最大质量就表达了搜索空间中的一个最优解。
GSA可以看成是一个孤立的质量系统,各个质量满足以下定律:
- 引力定律:每个粒子吸引其他粒子,两个粒子之间的引力成与质量的乘积成正比,而与它们之间的距离R成反比。在这里使用R代替R2,因为根据实验结果,R比R2在所有实验情况下能提供更好的结果。
- 运动定律:任何质量的速度变化或加速度等于作用在系统上的力除以惯性质量。
下面,考虑一个具有N个代理(质量)的系统,第i个代理的位置定义为:
Xi=(xi1,…,xid,…,xin) for i=1,2,…,N(6)
其中,xid表示第i个代理在第d个维度上的位置。
在某一时刻t,将质量j作用于质量i的力定义为:
Fijd(t)=G(t)Rij(t)+εMpi(t)×Maj(t)(xjd(t)−xid(t))(7)
其中,Maj为代理j的主动引力质量,Mpi为代理i的被动引力质量。G(t)为t时刻的引力常量。ε为一很小的常量,Rij(t)为代理i和j之间的欧式距离:
Rij(t)=∥Xi(t),Xj(t)∥2(8)
为了在算法中引入随机特征,假设作用于代理i维度d上的总力为其他代理施加的力在第d维度上的随机加权和:
Fid(t)=j=1,j=i∑NrandjFijd(t)(9)
其中randj为[0,1]之间的随机数。
因此,根据运动定律,代理i在时刻t,第d维上的加速度aid(t)为:
aid(t)=Mii(t)Fid(t)(10)
那么,代理i的下一速度被认为是部分当前速度加上其加速度,从而可以得到其速度和位置计算公式:
vid(t+1)=randi×vid(t)+aid(t)(11)
xid(t+1)=xid(t)+vid(t+1)(12)
其中randi为[0,1]内的均匀随机变量。
算法开始时先对引力常数G进行初始化,然后随着时间递减以控制搜索精度:
G(t)=G(G0,t)(13)
引力质量和惯性质量均通过适应度评估计算得到,质量越大代理越优,代理吸引力越强,行走的也越慢。假设引力质量和惯性质量是等效的,则质量按下式进行更新:
Mai=Mpi=Mii=Mi,i=1,2,…,N(14)
mi(t)=best(t)−worst(t)fiti(t)−worst(t)(15)
Mi(t)=∑j=1Nmj(t)mi(t)(16)
在探索和利用之间实现良好折衷的一种方法是在(9)中,随着时间的推移减少agent的数量。因此,建议只有一组质量较大的agent对其他代理施加其力。
为了避免陷入局部最优,算法必须在开始时使用探索。随着迭代的推移,探索逐渐减弱而利用逐渐增强。为了通过控制探索和利用来提高GSA的性能,只有Kbest个最优代理才能吸引其他代理。Kbest是时间的函数,初始值为K0,随时间减小。以这种方式,开始时,所有的代理都施加力,随着时间的推移,Kbest线性地减少,最后只有一个代理施加于其他代理。因此,等式(9)可以修改为:
Fid(t)=j∈Kbest,j=i∑randjFijd(t)(17)
其中Kbest为前K个最优代理。

算法中的各个参数可以参考源代码中的设置,赶快关注公众号,后台回复"GSA或引力"吧。