class GA(object): def __init__(self, xRate=0.7, mutationRate=0.005, lifeCount=50, geneLength=100, judge=lambda lf, av: 1, save=lambda: 1, mkLife=lambda: None, xFunc=None, mFunc=None): self.xRate = xRate self.mutationRate = mutationRate self.mutationCount = 0 self.generation = 0 self.lives = [] self.bounds = 0.0 # 得分总数 self.best = None self.lifeCount = lifeCount self.geneLength = geneLength self.__judge = judge self.save = save self.mkLife = mkLife # 默认的产生生命的函数 self.xFunc = (xFunc, self.__xFunc)[xFunc == None] # 自定义交叉函数 self.mFunc = (mFunc, self.__mFunc)[mFunc == None] # 自定义变异函数 for i in range(lifeCount): self.lives.append(Life(self, self.mkLife())) def __xFunc(self, p1, p2): # 默认交叉函数 r = random.randint(0, self.geneLength) gene = p1.gene[0:r] + p2.gene[r:] return gene def __mFunc(self, gene): # 默认突变函数 r = random.randint(0, self.geneLength - 1) gene = gene[:r] + ("0", "1")[gene[r:r] == "1"] + gene[r + 1:] return gene def __bear(self, p1, p2): # 根据父母 p1, p2 生成一个后代 r = random.random() if r < self.xRate: # 交叉 gene = self.xFunc(p1, p2) else: gene = p1.gene r = random.random() if r < self.mutationRate: # 突变 gene = self.mFunc(gene) self.mutationCount += 1 return Life(self, gene) def __getOne(self): # 根据得分情况,随机取得一个个体,机率正比于个体的score属性 r = random.uniform(0, self.bounds) for lf in self.lives: r -= lf.score if r <= 0: return lf def __newChild(self): # 产生新的后代 return self.__bear(self.__getOne(), self.__getOne()) def judge(self, f=lambda lf, av: 1): # 根据传入的方法 f ,计算每个个体的得分 lastAvg = self.bounds / float(self.lifeCount) self.bounds = 0.0 self.best = Life(self) self.best.setScore(-1.0) for lf in self.lives: lf.score = f(lf, lastAvg) if lf.score > self.best.score: self.best = lf self.bounds += lf.score def next(self, n=1): # 演化至下n代 while n > 0: # self.__getBounds() self.judge(self.__judge) newLives = [] newLives.append(Life(self, self.best.gene)) # 将最好的父代加入竞争 # self.bestHistory.append(self.best) while (len(newLives) < self.lifeCount): newLives.append(self.__newChild()) self.lives = newLives self.generation += 1 # print("gen: %d, mutation: %d, best: %f" % (self.generation, self.mutationCount, self.best.score)) self.save(self.best, self.generation) n -= 1
class GA(object): # initialization def __init__(self, xRate=0.7, mutationRate=0.005, lifeCount=50, geneLength=50, judge=lambda lf, av: 1, save=lambda: 1, mkLife=lambda: None, xFunc=None, mFunc=None): self.xRate = xRate self.mutationRate = mutationRate self.mutationCount = 0 self.generation = 0 self.lives = [] self.bounds = 0.0 self.best = None self.lifeCount = lifeCount self.geneLength = geneLength self.__judge = judge self.save = save self.mkLife = mkLife self.xFunc = (xFunc, self.__xFunc)[xFunc == None] self.mFunc = (mFunc, self.__mFunc)[mFunc == None] # Creating a life set for i in range(lifeCount): self.lives.append(Life(self, self.mkLife())) # Default cross function def __xFunc(self, p1, p2): r = random.randint(0, self.geneLength) gene = p1.gene[0:r] + p2.gene[r:] return gene # Default mutation function def __mFunc(self, gene): r = random.randint(0, self.geneLength - 1) gene = gene[:r] + ("0", "1")[gene[r:r] == "1"] + gene[r + 1:] return gene # Produce offspring def __bear(self, p1, p2): # cross r = random.random() if r < self.xRate: gene = self.xFunc(p1, p2) else: gene = p1.gene # mutation r = random.random() if r < self.mutationRate: gene = self.mFunc(gene) self.mutationCount += 1 # Return to the living body return Life(self, gene) # According to the score situation, randomly obtain an individual, the probability is proportional to the individual's score attribute def __getOne(self): # Roulette r = random.uniform(0, self.bounds) for lf in self.lives: r -= lf.score if r <= 0: return lf # Generate new offspring def __newChild(self): return self.__bear(self.__getOne(), self.__getOne()) # According to the incoming method f, find the optimal life and life set points def judge(self, f=lambda lf, av: 1): # The average score lastAvg = self.bounds / float(self.lifeCount) self.bounds = 0.0 self.best = Life(self) self.best.setScore(-1.0) for lf in self.lives: lf.score = f(lf, lastAvg) if lf.score > self.best.score: self.best = lf self.bounds += lf.score # Evolution to the next n generation def next(self, n=1): while n > 0: # Evaluation group self.judge(self.__judge) # New life collection newLives = [] newLives.append(Life( self, self.best.gene)) # Join the best parents in the competition # Generating new life set individuals while (len(newLives) < self.lifeCount): newLives.append(self.__newChild()) # Update new life set self.lives = newLives self.generation += 1 self.save(self.best, self.generation) n -= 1
class GA(object): # 初始化 def __init__(self, xRate = 0.7, mutationRate = 0.005, lifeCount = 50, geneLength = 50, judge = lambda lf, av: 1, save = lambda: 1, mkLife = lambda: None, xFunc = None, mFunc = None): self.xRate = xRate # 交叉率 self.mutationRate = mutationRate # 突变率 self.mutationCount = 0 # 突变次数 self.generation = 0 # 进化代数 self.lives = [] # 生命集合 self.bounds = 0.0 # 得分总数 self.best = None # 最优解 self.lifeCount = lifeCount # 生命个数 self.geneLength = geneLength # 基因长度 self.__judge = judge # 评价函数 self.save = save # 保存函数 self.mkLife = mkLife # 默认的产生生命的函数 self.xFunc = (xFunc, self.__xFunc)[xFunc == None] # 自定义交叉函数 self.mFunc = (mFunc, self.__mFunc)[mFunc == None] # 自定义变异函数 # 创造生命集 for i in range(lifeCount): self.lives.append(Life(self, self.mkLife())) # 默认交叉函数 def __xFunc(self, p1, p2): r = random.randint(0, self.geneLength) gene = p1.gene[0:r] + p2.gene[r:] return gene # 默认突变函数 def __mFunc(self, gene): r = random.randint(0, self.geneLength - 1) gene = gene[:r] + ("0", "1")[gene[r:r] == "1"] + gene[r + 1:] return gene # 产生后代 def __bear(self, p1, p2): # 交叉 r = random.random() if r < self.xRate: gene = self.xFunc(p1, p2) else: gene = p1.gene # 突变 r = random.random() if r < self.mutationRate: gene = self.mFunc(gene) self.mutationCount += 1 # 返回生命体 return Life(self, gene) # 根据得分情况,随机取得一个个体,机率正比于个体的score属性 def __getOne(self): # 轮盘 r = random.uniform(0, self.bounds) for lf in self.lives: r -= lf.score; if r <= 0: return lf # 产生新的后代 def __newChild(self): return self.__bear(self.__getOne(), self.__getOne()) # 根据传入的方法f,求得最优生命体和生命集总分 def judge(self, f = lambda lf, av: 1): # 平均分 lastAvg = self.bounds / float(self.lifeCount) self.bounds = 0.0 self.best = Life(self) self.best.setScore(-1.0) for lf in self.lives: lf.score = f(lf, lastAvg) if lf.score > self.best.score: self.best = lf self.bounds += lf.score # 演化至下n代 def next(self, n = 1): while n > 0: # 评估群体 self.judge(self.__judge) # 新生命集 newLives = [] newLives.append(Life(self, self.best.gene)) # 将最好的父代加入竞争 # 产生新的生命集个体 while (len(newLives) < self.lifeCount): newLives.append(self.__newChild()) # 更新新的生命集 self.lives = newLives self.generation += 1 self.save(self.best, self.generation) n -= 1
class GA(object): def __init__(self, xRate=0.7, mutationRate=0.005, lifeCount=50, geneLength=100, judge=lambda lf, av: 1, save=lambda: 1, mkLife=lambda: None, xFunc=None, mFunc=None): self.xRate = xRate self.mutationRate = mutationRate self.mutationCount = 0 self.generation = 0 self.lives = [] self.bounds = 0.0 # 得分总数 self.best = None self.lifeCount = lifeCount self.geneLength = geneLength self.__judge = judge self.save = save self.mkLife = mkLife # 默认的产生生命的函数 self.xFunc = (xFunc, self.__xFunc)[xFunc == None] # 自定义交叉函数 self.mFunc = (mFunc, self.__mFunc)[mFunc == None] # 自定义变异函数 for i in range(lifeCount): self.lives.append(Life(self, self.mkLife())) def __xFunc(self, p1, p2): # 默认交叉函数 r = random.randint(0, self.geneLength) gene = p1.gene[0:r] + p2.gene[r:] return gene def __mFunc(self, gene): # 默认突变函数 r = random.randint(0, self.geneLength - 1) gene = gene[:r] + ("0", "1")[gene[r:r] == "1"] + gene[r + 1:] return gene def __bear(self, p1, p2): # 根据父母 p1, p2 生成一个后代 r = random.random() if r < self.xRate: # 交叉 gene = self.xFunc(p1, p2) else: gene = p1.gene r = random.random() if r < self.mutationRate: # 突变 gene = self.mFunc(gene) self.mutationCount += 1 return Life(self, gene) def __getOne(self): # 根据得分情况,随机取得一个个体,机率正比于个体的score属性 r = random.uniform(0, self.bounds) for lf in self.lives: r -= lf.score; if r <= 0: return lf def __newChild(self): # 产生新的后代 return self.__bear(self.__getOne(), self.__getOne()) def judge(self, f=lambda lf, av: 1): # 根据传入的方法 f ,计算每个个体的得分 lastAvg = self.bounds / float(self.lifeCount) self.bounds = 0.0 self.best = Life(self) self.best.setScore(-1.0) for lf in self.lives: lf.score = f(lf, lastAvg) if lf.score > self.best.score: self.best = lf self.bounds += lf.score def next(self, n=1): # 演化至下n代 while n > 0: # self.__getBounds() self.judge(self.__judge) newLives = [] newLives.append(Life(self, self.best.gene)) # 将最好的父代加入竞争 # self.bestHistory.append(self.best) while (len(newLives) < self.lifeCount): newLives.append(self.__newChild()) self.lives = newLives self.generation += 1 # print("gen: %d, mutation: %d, best: %f" % (self.generation, self.mutationCount, self.best.score)) self.save(self.best, self.generation) n -= 1