Arzie100 发表于 2022-7-18 08:44

优化算法 | 人工蜂群算法(附Python代码)

今天为各位更新人工蜂群算法(Artificial Bee Colony,ABC)的Python代码,之前我们在MATLAB数学建模(十一) | 人工蜂群算法(附MATLAB代码)这篇推文讲解了ABC算法的基本思想,忘记ABC算法的小伙伴可以点击上述链接复习一下。
目录
1.ABC算法基本步骤
2.ABC算法Python代码
3.ABC算法实例验证
<hr/>1.ABC算法基本步骤

1)初始化各蜜源 ; 设定参数https://www.zhihu.com/equation?tex=NP、https://www.zhihu.com/equation?tex=limit 以及最大迭代次数https://www.zhihu.com/equation?tex=maxIt; 计数器初始化https://www.zhihu.com/equation?tex=it%3D1;
2)为蜜源分配一只引领蜂,按式https://www.zhihu.com/equation?tex=v_%7Bi+d%7D%3Dx_%7Bi+d%7D%2B%5Cvarphi%5Cleft%28x_%7Bi+d%7D-x_%7Bj+d%7D%5Cright%29进行搜索,产生新蜜源 ;
3)依据式https://www.zhihu.com/equation?tex=f+i+t_%7Bi%7D%3D+%5Cbegin%7Bcases%7D1+%2F%5Cleft%281%2Bf_%7Bi%7D%5Cright%29%2C+%26+f_%7Bi%7D+%5Cgeqslant+0+%5C%5C+1%2B%5Coperatorname%7Babs%7D%5Cleft%28f_%7Bi%7D%5Cright%29%2C+%26+%5Ctext+%7B+otherwise+%7D%5Cend%7Bcases%7D评价的适应度,根据贪婪选择的方法确定保留的蜜源;
4)由式https://www.zhihu.com/equation?tex=p_%7Bi%7D%3Df+i+t_%7Bi%7D+%2F+%5Csum_%7Bi%3D1%7D%5E%7BN+P%7D+f+i+t_%7Bi%7D计算引领蜂找到的蜜源被跟随的概率;
5)跟随峰采用与引领蜂相同的方式进行搜索,根据贪婪选择的方法确定保留的蜜源;
6)判断蜜源 是否满足被放弃的条件。如满足,对应的引领蜂角色变为侦察蜂,否则直接转到8);
7)侦察蜂根据式https://www.zhihu.com/equation?tex=X_%7Bi%7D%5E%7Bt%2B1%7D%3D%5Cleft%5C%7B%5Cbegin%7Barray%7D%7Bl%7D+L_%7Bd%7D%2B%5Coperatorname%7Brand%7D%280%2C1%29%5Cleft%28U_%7Bd%7D-L_%7Bd%7D%5Cright%29%2C+%5Coperatorname%7Btrial%7D_%7Bi%7D+%5Cgeqslant+%5Ctext+%7B+limit+%7D+%5C%5C+X_%7Bi%7D%5E%7Bt%7D%2C+%5Coperatorname%7Btrial%7D_%7Bi%7D%3C%5Ctext+%7B+limit+%7D+%5Cend%7Barray%7D%5Cright.随机产生新蜜源;
8)https://www.zhihu.com/equation?tex=it%3Dit%2B1; 判断算法是否满足终止条件,若满足则终止,输出最优解,否则转到2)。
更多关于ABC算法详细内容详见MATLAB数学建模(十一) | 人工蜂群算法(附MATLAB代码)。
<hr/>2.ABC算法Python代码

整个ABC算法Python代码共包含两个.py文件,即artificial_bee_colony.py和app.py。**这里需要注意的是,需要各位自行安装ypstruct库,安装方法可以参考https://pypi.org/project/ypstruct/**。
artificial_bee_colony.py文件如下所示:
import numpy as np
from ypstruct import structure

def run(problem, params):
    # 函数信息
    costfunc = problem.costfunc
    nvar = problem.nvar
    varmin = problem.varmin
    varmax = problem.varmax

    # 参数信息
    maxit = params.maxit
    npop = params.npop
    nonlooker = params.nonlooker
    limit = int(np.round(0.6*nvar*npop))
    a = params.a

    # 空的蜂群结构
    empty_bee = structure()
    empty_bee.position = None
    empty_bee.cost = None

    # 临时蜂群结构
    newbee = structure()
    newbee.position = None
    newbee.cost = None

    # 初始化全局最优解
    bestsol = empty_bee.deepcopy()
    bestsol.cost = np.inf

    # 种群初始化
    pop = empty_bee.repeat(npop)

    for i in range(npop):
      pop.position = np.random.uniform(varmin, varmax, nvar)
      pop.cost = costfunc(pop.position)
      if pop.cost < bestsol.cost:
            bestsol = pop.deepcopy()

    # 初始化每个个体的抛弃次数
    count = np.empty(npop)

    # 记录每一代中全局最优个体目标函数值
    bestcost = np.empty(maxit)

    # 人工蜂群算法主循环
    for it in range(maxit):

      # 引领蜂
      for i in range(npop):

            # 随机选择k,不等于i
            K = np.append(np.arange(0,i),np.arange(i+1,npop))
            k = K

            # 定义加速系数
            phi = a * np.random.uniform(-1, 1, nvar)

            # 新的蜜蜂位置
            newbee.position = pop.position + phi * (pop.position - pop.position)

            # 计算新蜜蜂目标函数值
            newbee.cost = costfunc(newbee.position)

            # 通过比较目标函数值,更新第i个蜜蜂的位置
            if newbee.cost < pop.cost:
                pop = newbee.deepcopy()
            else:
                count += 1

      # 计算适应度值和选择概率
      fit = np.empty(npop)
      meancost = np.mean(.cost for i in range(npop)])
      for i in range(npop):
            fit = np.exp(-pop.cost/meancost)   #将目标函数值转换为适应度值

      probs = fit / np.sum(fit)

      # 跟随蜂
      for m in range(nonlooker):

            # 通过轮盘赌的方式选择蜜源
            i = roulette_wheel_selection(probs)

            # 随机选择k,不等于i
            K = np.append(np.arange(0, i), np.arange(i + 1, npop))
            k = K

            # 定义加速系数
            phi = a * np.random.uniform(-1, 1, nvar)

            # 新的蜜蜂位置
            newbee.position = pop.position + phi * (pop.position - pop.position)

            # 计算新蜜蜂目标函数值
            newbee.cost = costfunc(newbee.position)

            # 通过比较目标函数值,更新第i个蜜蜂的位置
            if newbee.cost < pop.cost:
                pop = newbee.deepcopy()
            else:
                count += 1

      # 侦察蜂
      for i in range(npop):
            if count > limit:
                pop.position = np.random.uniform(varmin, varmax, nvar)
                pop.cost = costfunc(pop.position)
                count = 0

      # 更新全局最优解
      for i in range(npop):
            if pop.cost < bestsol.cost:
                bestsol = pop.deepcopy()

      # 存储每一代全局最优解的目标函数值
      bestcost = bestsol.cost

      # 展示迭代信息
      print("Iteration {}: Best Cost = {}".format(it, bestcost))

    # 返回值
    out = structure()
    out.pop = pop
    out.bestsol = bestsol
    out.bestcost = bestcost
    return out

def roulette_wheel_selection(p):
    c = np.cumsum(p)
    r = sum(p) * np.random.rand()
    ind = np.argwhere(r <= c)
    return ind
app.py文件如下所示:
import matplotlib.pyplot as plt
import numpy as np
from ypstruct import structure
import time
import artificial_bee_colony

start = time.time()         #运行开始时刻
# 测试函数
def sphere(x):
    return sum(x**2)

# 问题定义
problem = structure()
problem.costfunc = sphere
problem.nvar = 10
problem.varmin = -100 * np.ones(10)
problem.varmax = 100 * np.ones(10)

# ABC参数
params = structure()
params.maxit = 500
params.npop = 100
params.nonlooker = 100
params.a = 1

# 运行ABC
out = artificial_bee_colony.run(problem, params)
# 运行结果
plt.rcParams['font.sans-serif'] = ['KaiTi']#设置字体为楷体
plt.plot(out.bestcost)
print("最优解:{}".format(out.bestsol))
end = time.time()            # 运行结束时刻
print('运行时间:{}s'.format(end-start))

plt.xlim(0, params.maxit)
plt.xlabel('迭代次数')
plt.ylabel('全局最优目标函数值')
plt.title('人工蜂群算法')
plt.grid(True)
plt.show()
<hr/>3.ABC算法实例验证

测试函数如下:
https://www.zhihu.com/equation?tex=%5Cmin+f%5Cleft+%28+x+%5Cright+%29+%3D%5Csum_%7Bi%3D1%7D%5E%7B10%7D+x_%7Bi%7D%5E2+%5Cquad+-100%5Cle+x_%7Bi%7D+%5Cle+100+%5C%5C
运行app.py文件,运行结果如下:




参考文献
秦全德, 程适, 李丽, 等. 人工蜂群算法研究综述. 2014
<hr/>我们已经推出粉丝QQ交流群,各位小伙伴赶快加入吧!!!
咱们下期再见
近期你可能错过了的好文章

新书上架 | 《MATLAB智能优化算法:从写代码到算法思想》
优化算法 | 灰狼优化算法(文末有福利)
优化算法 | 鲸鱼优化算法
遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码
粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)MATLAB代码
知乎 | bilibili | CSDN:随心390

zifa2003293 发表于 2022-7-18 08:49

QQ交流群是哪个,没有哎

LiteralliJeff 发表于 2022-7-18 08:52

864610774
页: [1]
查看完整版本: 优化算法 | 人工蜂群算法(附Python代码)