python实现人工蜂群算法
程序员文章站
2022-06-21 17:32:19
absindividual.pyimport numpy as npimport objfunctionclass absindividual: ''' individual of artific...
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 人工蜂群算法的资料请关注其它相关文章!
上一篇: 2021十大赚钱的短视频app 微视第一,快手极速版上榜
下一篇: 互联网,并未消失