帮我将这个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.gene = [0.0] * 2 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.random() + 90.0) * (y - x) / 33956.0) + x)
def fit(x1, x2, i): if i == 1: return (math.sin(10 * PI * x1) + (x2 - 1)**2) * math.cos(2 * PI * x2) else: return x1 + x2
def initPop(): pop.generan = 0 for indv in pop.indv: indv.gene[0] = ranF(-1, 2) indv.gene[1] = ranF(-1, 1)
def dou2ZD(x, lowBef, upBef, lowAft, upAft): return lowAft + (x - lowBef) * (upAft - lowAft) / (upBef - lowBef)
def calFit(): for indv in pop.indv: indv.fitness = fit(indv.gene[0], indv.gene[1], 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) temp = pop.indv[j].gene[0] pop.indv[j].gene[0] = pop.indv[k].gene[0] pop.indv[k].gene[0] = temp temp = pop.indv[j].gene[1] pop.indv[j].gene[1] = pop.indv[k].gene[1] pop.indv[k].gene[1] = temp
def changeM(ind): r = random.randint(0, 1) ind[r] += random.uniform(-0.1, 0.1)
def mutation(): for i in range(NUMIND): if random.random() > mutaPro: continue else: changeM(pop.indv[i].gene)
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: {}, {}\n".format(pop.bestInd.gene, 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/chvr 著作权归作者所有。请勿转载和采集!