1 importnumpy as np2 from AIAIndividual importAIAIndividual3 importrandom4 importcopy5 importmatplotlib.pyplot as plt6
7
8 classArtificialImmuneAlgorithm:9
10 '''
11 The class for artificial immune algorithm12 '''
13
14 def __init__(self, sizepop, sizemem, vardim, bound, MAXGEN, params):15 '''
16 sizepop: population sizepop17 vardim: dimension of variables18 bound: boundaries of variables19 MAXGEN: termination condition20 params: algorithm required parameters, it is a list which is consisting of [mutation rate, cloneNum]21 '''
22 self.sizepop =sizepop23 self.sizemem =sizemem24 self.MAXGEN =MAXGEN25 self.vardim =vardim26 self.bound =bound27 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 =params39
40 definitialize(self):41 '''
42 initialize the population43 '''
44 for i inxrange(0, self.sizepop):45 ind =AIAIndividual(self.vardim, self.bound)46 ind.generate()47 self.population.append(ind)48 for i inxrange(0, self.sizemem):49 ind =AIAIndividual(self.vardim, self.bound)50 ind.generate()51 self.memories.append(ind)52
53 defevaluatePopulation(self, flag):54 '''
55 evaluation of the population fitnesses56 '''
57 if flag == 1:58 for i inxrange(0, self.sizepop):59 self.population[i].calculateFitness()60 self.popFitness[i] =self.population[i].fitness61 else:62 for i inxrange(0, self.sizemem):63 self.memories[i].calculateFitness()64 self.memfitness[i] =self.memories[i].fitness65
66 defevaluateClone(self, flag):67 '''
68 evaluation of the clone fitnesses69 '''
70 if flag == 1:71 for i inxrange(0, self.sizepop):72 self.clonePopulation[i].calculateFitness()73 self.popCloneFitness[i] =self.clonePopulation[i].fitness74 else:75 for i inxrange(0, self.sizemem):76 self.cloneMemories[i].calculateFitness()77 self.memClonefitness[i] =self.cloneMemories[i].fitness78
79 defsolve(self):80 '''
81 evolution process of artificial immune algorithm82 '''
83 self.t =084 self.initialize()85 self.best =AIAIndividual(self.vardim, self.bound)86 while (self.t
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.fitness105 self.trace[self.t, 1] = (1 - self.avefitness) /self.avefitness106 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 printself.best.chrom114 self.printResult()115
116 defcloneOperation(self, individuals):117 '''
118 clone operation for alforithm immune algorithm119 '''
120 newpop =[]121 sizeInds =len(individuals)122 for i inxrange(0, sizeInds):123 for j in xrange(0, int(self.params[1] *sizeInds)):124 newpop.append(copy.deepcopy(individuals[i]))125 returnnewpop126
127 defselectionOperation(self, flag):128 '''
129 selection operation for artificial immune algorithm130 '''
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] =tmpInd137 self.popFitness[i] =tmpInd.fitness138 else:139 pass
140 newpop =[]141 sizeInds =len(individuals)142 fitness =np.zeros(sizeInds)143 for i inxrange(0, sizeInds):144 fitness[i] =individuals[i].fitness145 sortedIdx = np.argsort(-fitness)146 for i inxrange(0, sizeInds):147 tmpInd =individuals[sortedIdx[i]]148 if tmpInd.fitness >self.population[i].fitness:149 self.population[i] =tmpInd150 self.popFitness[i] =tmpInd.fitness151
152 defmutationOperation(self, individuals):153 '''
154 mutation operation for artificial immune algorithm155 '''
156 newpop =[]157 sizeInds =len(individuals)158 for i inxrange(0, sizeInds):159 newpop.append(copy.deepcopy(individuals[i]))160 r =random.random()161 if r 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 inxrange(0, self.vardim):171 if newpop.chrom[mutatePos] self.bound[1, mutatePos]:174 newpop.chrom[mutatePos] = self.bound[1, mutatePos]175 newpop.calculateFitness()176 returnnewpop177
178 defprintResult(self):179 '''
180 plot the result of the artificial immune algorithm181 '''
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()