和声搜索算法-python实现
HSIndividual.py
1 import numpy as np 2 import ObjFunction 3 4 5 class HSIndividual: 6 7 ''' 8 individual of harmony search algorithm 9 ''' 10 11 def __init__(self, vardim, bound): 12 ''' 13 vardim: dimension of variables 14 bound: boundaries of variables 15 ''' 16 self.vardim = vardim 17 self.bound = bound 18 self.fitness = 0. 19 20 def generate(self): 21 ''' 22 generate a random chromsome for harmony search algorithm 23 ''' 24 len = self.vardim 25 rnd = np.random.random(size=len) 26 self.chrom = np.zeros(len) 27 for i in xrange(0, len): 28 self.chrom[i] = self.bound[0, i] + \ 29 (self.bound[1, i] - self.bound[0, i]) * rnd[i] 30 31 def calculateFitness(self): 32 ''' 33 calculate the fitness of the chromsome 34 ''' 35 self.fitness = ObjFunction.GrieFunc( 36 self.vardim, self.chrom, self.bound)
HS.py
1 import numpy as np 2 from HSIndividual import HSIndividual 3 import random 4 import copy 5 import math 6 import matplotlib.pyplot as plt 7 8 9 class HarmonySearch: 10 11 ''' 12 the class for harmony search algorithm 13 ''' 14 15 def __init__(self, sizepop, vardim, bound, MAXGEN, params): 16 ''' 17 sizepop: population sizepop 18 vardim: dimension of variables 19 bound: boundaries of variables 20 MAXGEN: termination condition 21 params: algorithm required parameters, it is a list which is consisting of[HMCR, PAR] 22 ''' 23 self.sizepop = sizepop 24 self.vardim = vardim 25 self.bound = bound 26 self.MAXGEN = MAXGEN 27 self.params = params 28 self.population = [] 29 self.fitness = np.zeros((self.sizepop, 1)) 30 self.trace = np.zeros((self.MAXGEN, 2)) 31 32 def initialize(self): 33 ''' 34 initialize the population of hs 35 ''' 36 for i in xrange(0, self.sizepop): 37 ind = HSIndividual(self.vardim, self.bound) 38 ind.generate() 39 self.population.append(ind) 40 41 def evaluation(self): 42 ''' 43 evaluation the fitness of the population 44 ''' 45 for i in xrange(0, self.sizepop): 46 self.population[i].calculateFitness() 47 self.fitness[i] = self.population[i].fitness 48 49 def improvise(self): 50 ''' 51 improvise a new harmony 52 ''' 53 ind = HSIndividual(self.vardim, self.bound) 54 ind.chrom = np.zeros(self.vardim) 55 for i in xrange(0, self.vardim): 56 if random.random() < self.params[0]: 57 if random.random() < self.params[1]: 58 ind.chrom[i] += self.best.chrom[i] 59 else: 60 worstIdx = np.argmin(self.fitness) 61 xr = 2 * self.best.chrom[i] - \ 62 self.population[worstIdx].chrom[i] 63 if xr < self.bound[0, i]: 64 xr = self.bound[0, i] 65 if xr > self.bound[1, i]: 66 xr = self.bound[1, i] 67 ind.chrom[i] = self.population[worstIdx].chrom[ 68 i] + (xr - self.population[worstIdx].chrom[i]) * random.random() 69 else: 70 ind.chrom[i] = self.bound[ 71 0, i] + (self.bound[1, i] - self.bound[0, i]) * random.random() 72 ind.calculateFitness() 73 return ind 74 75 def update(self, ind): 76 ''' 77 update harmony memory 78 ''' 79 minIdx = np.argmin(self.fitness) 80 if ind.fitness > self.population[minIdx].fitness: 81 self.population[minIdx] = ind 82 self.fitness[minIdx] = ind.fitness 83 84 def solve(self): 85 ''' 86 the evolution process of the hs algorithm 87 ''' 88 self.t = 0 89 self.initialize() 90 self.evaluation() 91 best = np.max(self.fitness) 92 bestIndex = np.argmax(self.fitness) 93 self.best = copy.deepcopy(self.population[bestIndex]) 94 self.avefitness = np.mean(self.fitness) 95 self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness 96 self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness 97 print("Generation %d: optimal function value is: %f; average function value is %f" % ( 98 self.t, self.trace[self.t, 0], self.trace[self.t, 1])) 99 while self.t < self.MAXGEN - 1: 100 self.t += 1 101 ind = self.improvise() 102 self.update(ind) 103 best = np.max(self.fitness) 104 bestIndex = np.argmax(self.fitness) 105 if best > self.best.fitness: 106 self.best = copy.deepcopy(self.population[bestIndex]) 107 self.avefitness = np.mean(self.fitness) 108 self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness 109 self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness 110 print("Generation %d: optimal function value is: %f; average function value is %f" % ( 111 self.t, self.trace[self.t, 0], self.trace[self.t, 1])) 112 print("Optimal function value is: %f; " % self.trace[self.t, 0]) 113 print "Optimal solution is:" 114 print self.best.chrom 115 self.printResult() 116 117 def printResult(self): 118 ''' 119 plot the result of abs algorithm 120 ''' 121 x = np.arange(0, self.MAXGEN) 122 y1 = self.trace[:, 0] 123 y2 = self.trace[:, 1] 124 plt.plot(x, y1, 'r', label='optimal value') 125 plt.plot(x, y2, 'g', label='average value') 126 plt.xlabel("Iteration") 127 plt.ylabel("function value") 128 plt.title("Harmony search algorithm for function optimization") 129 plt.legend() 130 plt.show()
运行程序:
1 if __name__ == "__main__": 2 3 bound = np.tile([[-600], [600]], 25) 4 hs = HS(60, 25, bound, 5000, [0.9950, 0.4]) 5 hs.solve()
ObjFunction见简单遗传算法-python实现。
作者:Alex Yu
出处:http://www.cnblogs.com/biaoyu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。