帮我将下面这个python编写的遗传算法由二进制基因编码改成两个实数X1X2基因编码同时实现多点交叉以及两点变异:import mathimport randomimport timeimport copyPI = 31415926NUMIND = 25LENIND = 20FUN = 1crossPro = 09mutaPro = 01class indivi def __init__se
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
global pop pop = popu()
def ranF(x, y): return random.uniform(x, y)
def fit(x1, x2, i): if i == 1: return x1 * math.sin(10 * PI * x1) + x2 * math.cos(2 * PI * x2) + 2.0 else: return x1 + x2
def dou2ZD(x, lowBef, upBef, lowAft, upAft): return lowAft + (x - lowBef) * (upAft - lowAft) / (upBef - lowBef)
def initPop(): pop.generan = 0 for indv in pop.indv: indv.geneX1 = ranF(-1, 2) indv.geneX2 = ranF(-1, 1)
def calFit(): for indv in pop.indv: indv.fitness = fit(indv.geneX1, indv.geneX2, FUN)
def calUp(): 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(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 HalfSear(value, Mid, UpBo, InA) else: return HalfSear(value, LowBo, Mid, InA)
def calSub(pop): poptem = popu() TemFitn = [indv.upLim for indv in pop.indv] for i in range(NUMIND): rnd = ranF(0, 1) NumTemp = HalfSear(rnd, 0, NUMIND, TemFitn) poptem.indv[i] = pop.indv[NumTemp] poptem.generan = pop.generan poptem.bestInd = pop.bestInd pop = poptem
def select(): calUp() calSub(pop)
def crossove(): for i in range(NUMIND//2): if random.random() > crossPro: continue else: j = random.randint(0, NUMIND-1) k = random.randint(0, NUMIND-1) alpha = ranF(0, 1) pop.indv[j].geneX1 = alpha * pop.indv[j].geneX1 + (1 - alpha) * pop.indv[k].geneX1 pop.indv[j].geneX2 = alpha * pop.indv[j].geneX2 + (1 - alpha) * pop.indv[k].geneX2 pop.indv[k].geneX1 = alpha * pop.indv[k].geneX1 + (1 - alpha) * pop.indv[j].geneX1 pop.indv[k].geneX2 = alpha * pop.indv[k].geneX2 + (1 - alpha) * pop.indv[j].geneX2
def mutation(): for i in range(NUMIND): if random.random() > mutaPro: continue else: pop.indv[i].geneX1 = ranF(-1, 2) pop.indv[i].geneX2 = ranF(-1, 1)
def max(): 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])
if name == 'main': random.seed(time.time() % 9) initPop() fp = open("a.txt", "w") if not fp: print("Can't open file") exit(0) while pop.bestInd.fitness <= 3.85027 and pop.generan < 10000: calFit() max() 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)) select() crossove() if pop.generan == 100: mutaPro = 0.3 print("The mutation probability is set to 0.3") mutation() pop.indv[0] = pop.bestInd pop.generan +=1 print("finished") fp.close(
原文地址: https://www.cveoy.top/t/topic/cEuX 著作权归作者所有。请勿转载和采集!