工厂模式改写

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(

帮我将下面这段遗传算法用工厂模式进行改写:import mathimport randomimport timeimport copyPI = 31415926NUMIND = 25FUN = 1crossPro = 09mutaPro = 01class indivi def __init__self selfgeneX1 = 00 selfgeneX2 = 0

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

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