工厂类

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(
帮我将下面这段遗传算法封装成工厂模式:import mathimport randomimport timeimport copyPI = 31415926NUMIND = 25FUN = 1crossPro = 09mutaPro = 01class indivi def __init__self selfgeneX1 = 00 selfgeneX2 = 00

原文地址: http://www.cveoy.top/t/topic/cHIZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录