人工蜂群算法是模拟蜂群寻找蜜源过程的一种群体智能优化算法,土耳其学者Karaboga于2005年在前人研究的基础上系统的提出了人工蜂群算法及其改进算法,其适用于处理工程中的高维优化问题。
算法的完整介绍需要引入蜜源和3种蜜蜂,即引领蜂,跟随蜂和侦察蜂。
蜜源(food sources):蜜源代表解空间的解,蜜源花蜜的浓密程度对应着其适应度函数值的好坏,好的蜜源是蜂群追求的目标。
引领蜂(employed bees):也称为采蜜蜂或者雇佣蜂,用于维持算法寻优过程中的优良解,算法的每次迭代引领蜂在它守护的蜜源附近搜索花蜜量更多的蜜源,将蜜源的位置信息和蜜源浓密程度反馈回蜂巢,并返回蜜源守护,等待其它蜜蜂到来。
跟随蜂(onlooker bees):也称为观察蜂,用于在目标蜜源附近进行局部搜索,可以提高算法的收敛速度,跟随蜂收到每个蜜源附近引导蜂反馈回来的信息后,选择一个引领蜂并在附近搜索新蜜源。
侦察蜂(scout bees):侦察蜂用于增强种群多样性,在某个蜜源及其附近的蜂蜜都被开采完后,对应的引领蜂转变身份,变为侦察蜂,在全局范围内随机选择一个新的蜜源守护。
蜜源位置的初始化参照下式在搜索空间随机产生:
在每一次迭代的开始阶段,引领蜂在相应的蜜源iX附近进行一次局部搜索,根据下式搜索,产生新的蜜源,并根据适应度函数值贪婪选择保留下来的蜜源:
当所有的蜜源附近均完成一次局部搜索以后,引领蜂飞回蜂巢,向跟随蜂分享最新的蜜源消息(蜜源位置和花蜜浓密程度),跟随蜂获取蜜源相关信息后,按下式计算每个蜜源附近引领蜂被选中的概率:
然后,跟随蜂依据选择概率模型选择蜜源对应的引领蜂,并在相应蜜源附近进行一次局部搜索,一般采用“轮盘赌”方法。
在若干次迭代后,如果蜜源iX在局部搜索过程中连续limit N次没有更新,说明该蜜源附近已经被开发到一定程度,没有继续开发该蜜源的必要,引领蜂放弃该蜜源,且转变身份为侦察蜂,判断是否转变引领蜂身份的过程如下式:
以最小化的优化问题为例,解的适应度函数值根据下式求得。
主函数部分代码如下:
# -*- coding: utf-8 -*-
"""
@Time : 2022/11/21 21:02
@Author : Xu Yong Kang
"""
##迭代搜索阶段##
for t in range(MaxIter):
'''引领蜂搜索'''
for i in range(pop):
k=np.random.randint(pop) #随机选择一个引领蜂
#若k=i,再次随机选择直到k!=i
while (k==i):
k=np.random.randint(pop)
#交叉搜索以产生新个体
K=(2*np.random.random([1,dim])-1)
Xnew[i,:]=X[i,:]+K*(X[i,:]-X[k,:])
#检查边界
Xnew=BorderCheck(Xnew,ub,lb,pop,dim)
#适应度值计算
newfitness=CaculateFitness(Xnew,fun)
#根据适应度值更新位置,采用‘优胜劣汰’的思想选择更优秀的个体
for i in range(pop):
if newfitness[i]<fitness[i]:
X[i,:]=copy.copy(Xnew[i,:])
fitness[i]=copy.copy(newfitness[i])
else:
#若位置没有更新,则累加器加1
C[i]=C[i]+1
#计算适应度值
F=np.zeros([pop,1])
'''跟随蜂以轮盘赌法进行搜索'''
meancost=np.mean(fitness)
for i in range(pop):
F[i]=np.exp(-fitness[i]/meancost)
P=F/sum(F)
测试函数采用Ackley函数:
def Fun(X):
'''The description of Ackley function'''
dim=X.shape[0]
results=-20*np.exp(-0.2*np.sqrt(np.sum(X**2)/dim))-np.exp(np.sum(np.cos(2*np.pi*X))/dim)+20+np.exp(1)
return results
图像如下:
测试结果:
The best optional value: [3.07709414e-12]
The best solution: [[ 8.05333171e-13 -7.30052576e-13]]
参考文献:
[1]刘超. 人工蜂群算法改进及其在梯级水库优化调度中的应用[D].华中科技大学,2017.