zoukankan      html  css  js  c++  java
  • 和声搜索算法-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实现

  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/biaoyu/p/4857932.html
Copyright © 2011-2022 走看看