人工蜂群算法

人工蜂群算法是模拟蜂群寻找蜜源过程的一种群体智能优化算法,土耳其学者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.

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值