帮我将下面这段遗传算法用工厂模式进行改写:import mathimport randomimport timeimport copyPI = 31415926NUMIND = 25FUN = 1crossPro = 09mutaPro = 01class indivi def __init__self selfgeneX1 = 00 selfgeneX2 = 0
工厂模式改写
import math import random import time import copy
PI = 3.1415926 NUMIND = 25 FUN = 1 crossPro = 0.9 mutaPro = 0.1
class indivi: def init(self): self.geneX1 = 0.0 self.geneX2 = 0.0 self.fitness = 0.0
class popu: def init(self): self.indv = [indivi() for n in range(NUMIND)] self.bestInd = indivi() self.generan = 0
class GeneticAlgorithm: def ranF(self, x, y): return random.uniform(x, y)
def fit(self, x1, x2, i):
if i == 1:
return 3*(x1**2 - x2)**2
else:
return x1,x2
def dou2ZD(self, x, lowBef, upBef, lowAft, upAft):
return lowAft + (x - lowBef) * (upAft - lowAft) / (upBef - lowBef)
def initPop(self, pop):
pop.generan = 0
for indv in pop.indv:
indv.geneX1 = self.ranF(0, 1024)
indv.geneX2 = self.ranF(0, 1024)
def calFit(self, pop):
for indv in pop.indv:
indv.geneX1 = self.dou2ZD(indv.geneX1, 0, 1024, -10, 10)
indv.geneX2 = self.dou2ZD(indv.geneX2, 0, 1024, -10, 10)
indv.fitness = self.fit(indv.geneX1, indv.geneX2, FUN)
def calUp(self, pop):
sum = 0.0
for indv in pop.indv:
sum += indv.fitness
pop.indv[0].upLim = pop.indv[0].fitness / sum
for i in range(NUMIND-1):
temp = pop.indv[i+1].fitness / sum
pop.indv[i+1].upLim = temp + pop.indv[i].upLim
if pop.indv[i+1].upLim > 1.0 and (i+1) < (NUMIND-1):
for j in range(NUMIND):
print("generation is:{},fitness={},UpLim={}".format(pop.generan,pop.indv[j].fitness,pop.indv[j].upLim))
print("\nError,{}'s upLim is greater than 1=============\n".format(i+1))
exit(0)
pop.indv[NUMIND-1].upLim = 1
def HalfSear(self, value, LowBo, UpBo, InA):
if LowBo >= UpBo:
return UpBo
Mid = (LowBo + UpBo) // 2
if Mid == 0:
return 0
if value <= InA[Mid] and value > InA[Mid-1]:
return Mid
else:
if value >= InA[Mid]:
return self.HalfSear(value, Mid, UpBo, InA)
else:
return self.HalfSear(value, LowBo, Mid, InA)
def calSub(self, pop):
poptem = popu()
TemFitn = [indv.upLim for indv in pop.indv]
for i in range(NUMIND):
rnd = self.ranF(0, 1)
NumTemp = self.HalfSear(rnd, 0, NUMIND, TemFitn)
poptem.indv[i] = pop.indv[NumTemp]
poptem.generan = pop.generan
poptem.bestInd = pop.bestInd
pop = poptem
return pop
def select(self, pop):
self.calUp(pop)
pop = self.calSub(pop)
return pop
def crossove(self, pop):
for i in range(NUMIND//2):
if random.random() > crossPro:
continue
else:
j = random.randint(0, NUMIND-1)
k = random.randint(0, NUMIND-1)
a = self.ranF(0, 1)
pop.indv[j].geneX1 = a * pop.indv[j].geneX1 + (1 - a) * pop.indv[k].geneX1
pop.indv[j].geneX2 = a * pop.indv[j].geneX2 + (1 - a) * pop.indv[k].geneX2
pop.indv[k].geneX1 = a * pop.indv[k].geneX1 + (1 - a) * pop.indv[j].geneX1
pop.indv[k].geneX2 = a * pop.indv[k].geneX2 + (1 - a) * pop.indv[j].geneX2
return pop
def mutation(self, pop):
for i in range(NUMIND):
if random.random() > mutaPro:
continue
else:
pop.indv[i].geneX1 = self.ranF(0, 1024)
pop.indv[i].geneX2 = self.ranF(0, 1024)
return pop
def max(self, pop):
j = 0
tem = pop.indv[0].fitness
for i in range(1, NUMIND):
if pop.indv[i].fitness > tem:
tem = pop.indv[i].fitness
j = i
pop.bestInd = copy.deepcopy(pop.indv[j])
return pop
if name == 'main': random.seed(time.time() % 9) genetic_algorithm = GeneticAlgorithm() pop = popu() genetic_algorithm.initPop(pop) fp = open("a.txt", "w") if not fp: print("Can't open file") exit(0) while pop.bestInd.fitness <= 40000 and pop.generan < 10000: genetic_algorithm.calFit(pop) pop = genetic_algorithm.max(pop) print("The generation is {}, the best fitness is {}".format(pop.generan, pop.bestInd.fitness)) fp.write("Best Individual: X1={}, X2={}, {}\n".format(pop.bestInd.geneX1, pop.bestInd.geneX2, pop.bestInd.fitness)) pop = genetic_algorithm.select(pop) genetic_algorithm.crossove(pop) if pop.generan == 100: mutaPro = 0.3 print("The mutation probability is set to 0.3") genetic_algorithm.mutation(pop) pop.indv[0] = pop.bestInd pop.generan +=1 print("finished") fp.close(
原文地址: https://www.cveoy.top/t/topic/cHLe 著作权归作者所有。请勿转载和采集!