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