python实现人工蜂群算法


Posted in Python onSeptember 18, 2020

ABSIndividual.py

import numpy as np
import ObjFunction


class ABSIndividual:

  '''
  individual of artificial bee swarm algorithm
  '''

  def __init__(self, vardim, bound):
    '''
    vardim: dimension of variables
    bound: boundaries of variables
    '''
    self.vardim = vardim
    self.bound = bound
    self.fitness = 0.
    self.trials = 0

  def generate(self):
    '''
    generate a random chromsome for artificial bee swarm algorithm
    '''
    len = self.vardim
    rnd = np.random.random(size=len)
    self.chrom = np.zeros(len)
    for i in xrange(0, len):
      self.chrom[i] = self.bound[0, i] + \
        (self.bound[1, i] - self.bound[0, i]) * rnd[i]

  def calculateFitness(self):
    '''
    calculate the fitness of the chromsome
    '''
    self.fitness = ObjFunction.GrieFunc(
      self.vardim, self.chrom, self.bound)

ABS.py

import numpy as np
from ABSIndividual import ABSIndividual
import random
import copy
import matplotlib.pyplot as plt


class ArtificialBeeSwarm:

  '''
  the class for artificial bee swarm algorithm
  '''

  def __init__(self, sizepop, vardim, bound, MAXGEN, params):
    '''
    sizepop: population sizepop
    vardim: dimension of variables
    bound: boundaries of variables
    MAXGEN: termination condition
    params: algorithm required parameters, it is a list which is consisting of[trailLimit, C]
    '''
    self.sizepop = sizepop
    self.vardim = vardim
    self.bound = bound
    self.foodSource = self.sizepop / 2
    self.MAXGEN = MAXGEN
    self.params = params
    self.population = []
    self.fitness = np.zeros((self.sizepop, 1))
    self.trace = np.zeros((self.MAXGEN, 2))

  def initialize(self):
    '''
    initialize the population of abs
    '''
    for i in xrange(0, self.foodSource):
      ind = ABSIndividual(self.vardim, self.bound)
      ind.generate()
      self.population.append(ind)

  def evaluation(self):
    '''
    evaluation the fitness of the population
    '''
    for i in xrange(0, self.foodSource):
      self.population[i].calculateFitness()
      self.fitness[i] = self.population[i].fitness

  def employedBeePhase(self):
    '''
    employed bee phase
    '''
    for i in xrange(0, self.foodSource):
      k = np.random.random_integers(0, self.vardim - 1)
      j = np.random.random_integers(0, self.foodSource - 1)
      while j == i:
        j = np.random.random_integers(0, self.foodSource - 1)
      vi = copy.deepcopy(self.population[i])
      # vi.chrom = vi.chrom + np.random.uniform(-1, 1, self.vardim) * (
      #   vi.chrom - self.population[j].chrom) + np.random.uniform(0.0, self.params[1], self.vardim) * (self.best.chrom - vi.chrom)
      # for k in xrange(0, self.vardim):
      #   if vi.chrom[k] < self.bound[0, k]:
      #     vi.chrom[k] = self.bound[0, k]
      #   if vi.chrom[k] > self.bound[1, k]:
      #     vi.chrom[k] = self.bound[1, k]
      vi.chrom[
        k] += np.random.uniform(low=-1, high=1.0, size=1) * (vi.chrom[k] - self.population[j].chrom[k])
      if vi.chrom[k] < self.bound[0, k]:
        vi.chrom[k] = self.bound[0, k]
      if vi.chrom[k] > self.bound[1, k]:
        vi.chrom[k] = self.bound[1, k]
      vi.calculateFitness()
      if vi.fitness > self.fitness[fi]:
        self.population[fi] = vi
        self.fitness[fi] = vi.fitness
        if vi.fitness > self.best.fitness:
          self.best = vi
      vi.calculateFitness()
      if vi.fitness > self.fitness[i]:
        self.population[i] = vi
        self.fitness[i] = vi.fitness
        if vi.fitness > self.best.fitness:
          self.best = vi
      else:
        self.population[i].trials += 1

  def onlookerBeePhase(self):
    '''
    onlooker bee phase
    '''
    accuFitness = np.zeros((self.foodSource, 1))
    maxFitness = np.max(self.fitness)

    for i in xrange(0, self.foodSource):
      accuFitness[i] = 0.9 * self.fitness[i] / maxFitness + 0.1

    for i in xrange(0, self.foodSource):
      for fi in xrange(0, self.foodSource):
        r = random.random()
        if r < accuFitness[i]:
          k = np.random.random_integers(0, self.vardim - 1)
          j = np.random.random_integers(0, self.foodSource - 1)
          while j == fi:
            j = np.random.random_integers(0, self.foodSource - 1)
          vi = copy.deepcopy(self.population[fi])
          # vi.chrom = vi.chrom + np.random.uniform(-1, 1, self.vardim) * (
          #   vi.chrom - self.population[j].chrom) + np.random.uniform(0.0, self.params[1], self.vardim) * (self.best.chrom - vi.chrom)
          # for k in xrange(0, self.vardim):
          #   if vi.chrom[k] < self.bound[0, k]:
          #     vi.chrom[k] = self.bound[0, k]
          #   if vi.chrom[k] > self.bound[1, k]:
          #     vi.chrom[k] = self.bound[1, k]
          vi.chrom[
            k] += np.random.uniform(low=-1, high=1.0, size=1) * (vi.chrom[k] - self.population[j].chrom[k])
          if vi.chrom[k] < self.bound[0, k]:
            vi.chrom[k] = self.bound[0, k]
          if vi.chrom[k] > self.bound[1, k]:
            vi.chrom[k] = self.bound[1, k]
          vi.calculateFitness()
          if vi.fitness > self.fitness[fi]:
            self.population[fi] = vi
            self.fitness[fi] = vi.fitness
            if vi.fitness > self.best.fitness:
              self.best = vi
          else:
            self.population[fi].trials += 1
          break

  def scoutBeePhase(self):
    '''
    scout bee phase
    '''
    for i in xrange(0, self.foodSource):
      if self.population[i].trials > self.params[0]:
        self.population[i].generate()
        self.population[i].trials = 0
        self.population[i].calculateFitness()
        self.fitness[i] = self.population[i].fitness

  def solve(self):
    '''
    the evolution process of the abs algorithm
    '''
    self.t = 0
    self.initialize()
    self.evaluation()
    best = np.max(self.fitness)
    bestIndex = np.argmax(self.fitness)
    self.best = copy.deepcopy(self.population[bestIndex])
    self.avefitness = np.mean(self.fitness)
    self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
    self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
    print("Generation %d: optimal function value is: %f; average function value is %f" % (
      self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
    while self.t < self.MAXGEN - 1:
      self.t += 1
      self.employedBeePhase()
      self.onlookerBeePhase()
      self.scoutBeePhase()
      best = np.max(self.fitness)
      bestIndex = np.argmax(self.fitness)
      if best > self.best.fitness:
        self.best = copy.deepcopy(self.population[bestIndex])
      self.avefitness = np.mean(self.fitness)
      self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
      self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
      print("Generation %d: optimal function value is: %f; average function value is %f" % (
        self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
    print("Optimal function value is: %f; " % self.trace[self.t, 0])
    print "Optimal solution is:"
    print self.best.chrom
    self.printResult()

  def printResult(self):
    '''
    plot the result of abs algorithm
    '''
    x = np.arange(0, self.MAXGEN)
    y1 = self.trace[:, 0]
    y2 = self.trace[:, 1]
    plt.plot(x, y1, 'r', label='optimal value')
    plt.plot(x, y2, 'g', label='average value')
    plt.xlabel("Iteration")
    plt.ylabel("function value")
    plt.title("Artificial Bee Swarm algorithm for function optimization")
    plt.legend()
    plt.show()

运行程序:

if __name__ == "__main__":
 
   bound = np.tile([[-600], [600]], 25)
   abs = ABS(60, 25, bound, 1000, [100, 0.5])
   abs.solve()

ObjFunction见简单遗传算法-python实现。

以上就是python实现人工蜂群算法的详细内容,更多关于python 人工蜂群算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python OS模块常用函数说明
May 23 Python
python 文件转成16进制数组的实例
Jul 09 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
pytorch 预训练层的使用方法
Aug 20 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 Python
Python猫眼电影最近上映的电影票房信息
Sep 18 #Python
python实现简单遗传算法
Sep 18 #Python
详解python 支持向量机(SVM)算法
Sep 18 #Python
python利用线程实现多任务
Sep 18 #Python
Pycharm的Available Packages为空的解决方法
Sep 18 #Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 #Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 #Python
You might like
php MySQL与分页效率
2008/06/04 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python3.5的包存放的具体路径
2020/08/16 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
美发活动策划书
2014/01/14 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
小学运动会入场口号
2015/12/24 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python