人工免疫算法-python实现

AIAIndividual.py

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

AIA.py

  1 import numpy as np
  2 from AIAIndividual import AIAIndividual
  3 import random
  4 import copy
  5 import matplotlib.pyplot as plt
  6 
  7 
  8 class ArtificialImmuneAlgorithm:
  9 
 10     '''
 11     The class for artificial immune algorithm
 12     '''
 13 
 14     def __init__(self, sizepop, sizemem, vardim, bound, MAXGEN, params):
 15         '''
 16         sizepop: population sizepop
 17         vardim: dimension of variables
 18         bound: boundaries of variables
 19         MAXGEN: termination condition
 20         params: algorithm required parameters, it is a list which is consisting of [mutation rate, cloneNum]
 21         '''
 22         self.sizepop = sizepop
 23         self.sizemem = sizemem
 24         self.MAXGEN = MAXGEN
 25         self.vardim = vardim
 26         self.bound = bound
 27         self.population = []
 28         self.clonePopulation = []
 29         self.memories = []
 30         self.cloneMemories = []
 31         self.popFitness = np.zeros(self.sizepop)
 32         self.popCloneFitness = np.zeros(
 33             int(self.sizepop * self.sizepop * params[1]))
 34         self.memfitness = np.zero(self.sizemem)
 35         self.memClonefitness = np.zero(
 36             int(self.sizemem * self.sizemem * params[1]))
 37         self.trace = np.zeros((self.MAXGEN, 2))
 38         self.params = params
 39 
 40     def initialize(self):
 41         '''
 42         initialize the population
 43         '''
 44         for i in xrange(0, self.sizepop):
 45             ind = AIAIndividual(self.vardim, self.bound)
 46             ind.generate()
 47             self.population.append(ind)
 48         for i in xrange(0, self.sizemem):
 49             ind = AIAIndividual(self.vardim, self.bound)
 50             ind.generate()
 51             self.memories.append(ind)
 52 
 53     def evaluatePopulation(self, flag):
 54         '''
 55         evaluation of the population fitnesses
 56         '''
 57         if flag == 1:
 58             for i in xrange(0, self.sizepop):
 59                 self.population[i].calculateFitness()
 60                 self.popFitness[i] = self.population[i].fitness
 61         else:
 62             for i in xrange(0, self.sizemem):
 63                 self.memories[i].calculateFitness()
 64                 self.memfitness[i] = self.memories[i].fitness
 65 
 66     def evaluateClone(self, flag):
 67         '''
 68         evaluation of the clone fitnesses
 69         '''
 70         if flag == 1:
 71             for i in xrange(0, self.sizepop):
 72                 self.clonePopulation[i].calculateFitness()
 73                 self.popCloneFitness[i] = self.clonePopulation[i].fitness
 74         else:
 75             for i in xrange(0, self.sizemem):
 76                 self.cloneMemories[i].calculateFitness()
 77                 self.memClonefitness[i] = self.cloneMemories[i].fitness
 78 
 79     def solve(self):
 80         '''
 81         evolution process of artificial immune algorithm
 82         '''
 83         self.t = 0
 84         self.initialize()
 85         self.best = AIAIndividual(self.vardim, self.bound)
 86         while (self.t < self.MAXGEN):
 87             # evolution of population
 88             self.cloneOperation(1)
 89             self.mutationOperation(1)
 90             self.evaluatePopulation(1)
 91             self.selectionOperation(1)
 92 
 93             # evolution of memories
 94             self.cloneOperation(2)
 95             self.mutationOperation(2)
 96             self.evaluatePopulation()
 97             self.selectionOperation(2)
 98 
 99             best = np.max(self.popFitness)
100             bestIndex = np.argmax(self.popFitness)
101             if best > self.best.fitness:
102                 self.best = copy.deepcopy(self.population[bestIndex])
103             self.avefitness = np.mean(self.popFitness)
104             self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
105             self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
106             print("Generation %d: optimal function value is: %f; average function value is %f" % (
107                 self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
108             self.t += 1
109 
110         print("Optimal function value is: %f; " %
111               self.trace[self.t - 1, 0])
112         print "Optimal solution is:"
113         print self.best.chrom
114         self.printResult()
115 
116     def cloneOperation(self, individuals):
117         '''
118         clone operation for alforithm immune algorithm
119         '''
120         newpop = []
121         sizeInds = len(individuals)
122         for i in xrange(0, sizeInds):
123             for j in xrange(0, int(self.params[1] * sizeInds)):
124                 newpop.append(copy.deepcopy(individuals[i]))
125         return newpop
126 
127     def selectionOperation(self, flag):
128         '''
129         selection operation for artificial immune algorithm
130         '''
131         if flag == 1:
132             sortedIdx = np.argsort(-self.clonefit)
133             for i in xrange(0, int(self.sizepop*self.sizepop*self.params[1]):
134             tmpInd = individuals[sortedIdx[i]]
135             if tmpInd.fitness > self.population[i].fitness:
136                 self.population[i] = tmpInd
137                 self.popFitness[i] = tmpInd.fitness
138         else:
139             pass
140         newpop = []
141         sizeInds = len(individuals)
142         fitness = np.zeros(sizeInds)
143         for i in xrange(0, sizeInds):
144             fitness[i] = individuals[i].fitness
145         sortedIdx = np.argsort(-fitness)
146         for i in xrange(0, sizeInds):
147             tmpInd = individuals[sortedIdx[i]]
148             if tmpInd.fitness > self.population[i].fitness:
149                 self.population[i] = tmpInd
150                 self.popFitness[i] = tmpInd.fitness
151 
152     def mutationOperation(self, individuals):
153         '''
154         mutation operation for artificial immune algorithm
155         '''
156         newpop = []
157         sizeInds = len(individuals)
158         for i in xrange(0, sizeInds):
159             newpop.append(copy.deepcopy(individuals[i]))
160             r = random.random()
161             if r < self.params[0]:
162                 mutatePos = random.randint(0, self.vardim - 1)
163                 theta = random.random()
164                 if theta > 0.5:
165                     newpop[i].chrom[mutatePos] = newpop[i].chrom[
166                         mutatePos] - (newpop[i].chrom[mutatePos] - self.bound[0, mutatePos]) * (1 - random.random() ** (1 - self.t / self.MAXGEN))
167                 else:
168                     newpop[i].chrom[mutatePos] = newpop[i].chrom[
169                         mutatePos] + (self.bound[1, mutatePos] - newpop[i].chrom[mutatePos]) * (1 - random.random() ** (1 - self.t / self.MAXGEN))
170                 for k in xrange(0, self.vardim):
171                     if newpop.chrom[mutatePos] < self.bound[0, mutatePos]:
172                         newpop.chrom[mutatePos] = self.bound[0, mutatePos]
173                     if newpop.chrom[mutatePos] > self.bound[1, mutatePos]:
174                         newpop.chrom[mutatePos] = self.bound[1, mutatePos]
175                 newpop.calculateFitness()
176         return newpop
177 
178     def printResult(self):
179         '''
180         plot the result of the artificial immune algorithm
181         '''
182         x = np.arange(0, self.MAXGEN)
183         y1 = self.trace[:, 0]
184         y2 = self.trace[:, 1]
185         plt.plot(x, y1, 'r', label='optimal value')
186         plt.plot(x, y2, 'g', label='average value')
187         plt.xlabel("Iteration")
188         plt.ylabel("function value")
189         plt.title("Artificial immune algorithm for function optimization")
190         plt.legend()
191         plt.show()

 运行程序:

1 if __name__ == "__main__":
2 
3     bound = np.tile([[-600], [600]], 25)
4     aia = AIA(100, 25, bound, 100, [0.9, 0.1])
5     aia.solve()

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

原文地址:https://www.cnblogs.com/biaoyu/p/4857916.html