FAIndividual.py

 1 import numpy as np
 2 import ObjFunction
 3 
 4 
 5 class FAIndividual:
 6 
 7     '''
 8     individual of firefly 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         self.trials = 0
20 
21     def generate(self):
22         '''
23         generate a random chromsome for firefly algorithm
24         '''
25         len = self.vardim
26         rnd = np.random.random(size=len)
27         self.chrom = np.zeros(len)
28         for i in xrange(0, len):
29             self.chrom[i] = self.bound[0, i] + 
30                 (self.bound[1, i] - self.bound[0, i]) * rnd[i]
31 
32     def calculateFitness(self):
33         '''
34         calculate the fitness of the chromsome
35         '''
36         self.fitness = ObjFunction.GrieFunc(
37             self.vardim, self.chrom, self.bound)

FA.py

  1 import numpy as np
  2 from FAIndividual import FAIndividual
  3 import random
  4 import copy
  5 import matplotlib.pyplot as plt
  6 
  7 
  8 class FireflyAlgorithm:
  9 
 10     '''
 11     The class for firefly algorithm
 12     '''
 13 
 14     def __init__(self, sizepop, vardim, bound, MAXGEN, params):
 15         '''
 16         sizepop: population sizepop
 17         vardim: dimension of variables
 18         bound: boundaries of variables
 19         MAXGEN: termination condition
 20         param: algorithm required parameters, it is a list which is consisting of [beta0, gamma, alpha]
 21         '''
 22         self.sizepop = sizepop
 23         self.MAXGEN = MAXGEN
 24         self.vardim = vardim
 25         self.bound = bound
 26         self.population = []
 27         self.fitness = np.zeros((self.sizepop, 1))
 28         self.trace = np.zeros((self.MAXGEN, 2))
 29         self.params = params
 30 
 31     def initialize(self):
 32         '''
 33         initialize the population
 34         '''
 35         for i in xrange(0, self.sizepop):
 36             ind = FAIndividual(self.vardim, self.bound)
 37             ind.generate()
 38             self.population.append(ind)
 39 
 40     def evaluate(self):
 41         '''
 42         evaluation of the population fitnesses
 43         '''
 44         for i in xrange(0, self.sizepop):
 45             self.population[i].calculateFitness()
 46             self.fitness[i] = self.population[i].fitness
 47 
 48     def solve(self):
 49         '''
 50         evolution process of firefly algorithm
 51         '''
 52         self.t = 0
 53         self.initialize()
 54         self.evaluate()
 55         best = np.max(self.fitness)
 56         bestIndex = np.argmax(self.fitness)
 57         self.best = copy.deepcopy(self.population[bestIndex])
 58         self.avefitness = np.mean(self.fitness)
 59         self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
 60         self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
 61         print("Generation %d: optimal function value is: %f; average function value is %f" % (
 62             self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
 63         while (self.t < self.MAXGEN - 1):
 64             self.t += 1
 65             self.move()
 66             self.evaluate()
 67             best = np.max(self.fitness)
 68             bestIndex = np.argmax(self.fitness)
 69             if best > self.best.fitness:
 70                 self.best = copy.deepcopy(self.population[bestIndex])
 71             self.avefitness = np.mean(self.fitness)
 72             self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
 73             self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
 74             print("Generation %d: optimal function value is: %f; average function value is %f" % (
 75                 self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
 76 
 77         print("Optimal function value is: %f; " %
 78               self.trace[self.t, 0])
 79         print "Optimal solution is:"
 80         print self.best.chrom
 81         self.printResult()
 82 
 83     def move(self):
 84         '''
 85         move the a firefly to another brighter firefly
 86         '''
 87         for i in xrange(0, self.sizepop):
 88             for j in xrange(0, self.sizepop):
 89                 if self.fitness[j] > self.fitness[i]:
 90                     r = np.linalg.norm(
 91                         self.population[i].chrom - self.population[j].chrom)
 92                     beta = self.params[0] * 
 93                         np.exp(-1 * self.params[1] * (r ** 2))
 94                     # beta = 1 / (1 + self.params[1] * r)
 95                     # print beta
 96                     self.population[i].chrom += beta * (self.population[j].chrom - self.population[
 97                         i].chrom) + self.params[2] * np.random.uniform(low=-1, high=1, size=self.vardim)
 98                     for k in xrange(0, self.vardim):
 99                         if self.population[i].chrom[k] < self.bound[0, k]:
100                             self.population[i].chrom[k] = self.bound[0, k]
101                         if self.population[i].chrom[k] > self.bound[1, k]:
102                             self.population[i].chrom[k] = self.bound[1, k]
103                     self.population[i].calculateFitness()
104                     self.fitness[i] = self.population[i].fitness
105 
106     def printResult(self):
107         '''
108         plot the result of the firefly algorithm
109         '''
110         x = np.arange(0, self.MAXGEN)
111         y1 = self.trace[:, 0]
112         y2 = self.trace[:, 1]
113         plt.plot(x, y1, 'r', label='optimal value')
114         plt.plot(x, y2, 'g', label='average value')
115         plt.xlabel("Iteration")
116         plt.ylabel("function value")
117         plt.title("Firefly Algorithm for function optimization")
118         plt.legend()
119         plt.show()

运行程序:

1 if __name__ == "__main__":
2 
3     bound = np.tile([[-600], [600]], 25)
4     fa = FA(60, 25, bound, 200, [1.0, 0.000001, 0.6])
5     fa.solve()

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