遗传算法的思想
遗传算法的主要目的是进化论,即优胜劣汰。假定你有a个参数需要优化,不同参数对结果影响的权重未知,如

讯享网
我可以随机创立n个个体,每个个体中有a个参数,我们将其称之为个体的基因。每个个体的基因都是有编号的、随机的。我们可以通过比较个体基因“转录”出的“蛋白质”(预测值)与真值的偏差衡量一个个体的优劣性。

基因交换与突变
基因交换与突变是生物进化的原因。遗传算法中“交换”即指两个个体间“基因”(即某一段参数值)间发生交换,”突变“即个体某个基因发生数值变化(比如加上一个学习速率与随机值的乘积),两者都能得到新的个体,新的个体再与旧个体的评估值进行比较,旧个体逐一被更加优秀的新个体取代,模型拟合程度就会更高。
代码参考
import numpy.random as npr from math import * class Individual: eval=0.0 chromsome=None def __init__(self,n): self.chromosome=npr.random(n) class NGA: #popu代表生成个体数量,dimension代表个体参数维度,crossoverPro与mutationPro为后面调用的 #交叉与突变概率,maxlterTime迭代次数,evalFunc为评估函数 def __init__(self,popu,dimension,crossoverPro,mutationPro,maxiterTime,evalFunc): self.population=[] for i in range(popu): oneIndividual=Individual(dimension) #生成个体 oneIndividual.eval=evalFunc(oneIndividual.chromosome) #评估个体 self.population.append(oneIndividual) #加到总群中 self.crossoverPro=crossoverPro # 交叉概率 self.mutationPro=mutationPro #变异概率 self.maxiterTime=maxiterTime #最大代数 self.evalFunc=evalFunc # 评估函数, self.popu=popu # 种群中个体的数量 self.dimension=dimension # 优化参数的个数 self.arfa=1.0 # 学习速率 def crossover(self): #交叉 FatherPos=npr.randint(0,self.popu) #定义父母本位置 MotherPos=npr.randint(0,self.popu) if MotherPos==FatherPos: MotherPos=npr.randint(0,self.popu) Father=self.population[FatherPos] Mother=self.population[MotherPos] #选取基因片段 StartPos=npr.randint(self.dimension) GeneLength= npr.randint(self.dimension-StartPos)+1 #基因长度 #产生两个子代 Son1=Individual(self.dimension) Son2=Individual(self.dimension) Son1.chromosome[:StartPos]=Father.chromosome[:StartPos] Son1.chromosome[StartPos:(StartPos+GeneLength)]=Mother.chromosome[StartPos:(StartPos+GeneLength)] Son1.chromosome[(StartPos+GeneLength):]=Father.chromosome[(StartPos+GeneLength):] Son2.chromosome[:StartPos]=Mother.chromosome[:StartPos] Son2.chromosome[StartPos:(StartPos+GeneLength)]=Father.chromosome[StartPos:(StartPos+GeneLength)] Son2.chromosome[(StartPos+GeneLength):]=Mother.chromosome[(StartPos+GeneLength):] #评估子代 Son1.eval=self.evalFunc(Son1.chromosome) Son2.eval=self.evalFunc(Son2.chromosome) self.find() #寻找最差的个体并将其替换 if Son1.eval<self.population[self.worstPos].eval: self.population[self.worstPos]=Son1 elif Son2.eval<self.population[self.worstPos].eval: self.population[self.worstPos]=Son2 def find(self): #找到最差的点 self.population.sort(key=lambda x:x.eval) self.worstPos=len(self.population)-1 self.bestPos=0 #最优个体一定是第一个 def mutaion(self): FatherPos=npr.randint(0,self.popu) #定义父本位置 Father=self.population[FatherPos] Son=Individual(self.dimension) Son.chromosom=Father.chromosome.copy() #复制父本 mutationPos =npr.randint(self.dimension)#;//变异的位置 temp=npr.random()-0.5 #生成变异程度(增大或减小) Son.chromosome[mutationPos]+=self.arfa*temp #arfa是学习速率 Son.eval=self.evalFunc(Son.chromosome) self.find() #寻找最差的个体并将其替换 if Son.eval<self.population[self.worstPos].eval: self.population[self.worstPos]=Son def solve(self): tempTime=self.maxiterTime/10 #总迭代次数分为十份,每一份后学习速率减半 i=0 while i<self.maxiterTime: print("迭代了{}次,还有{}次迭代",i,self.maxiterTime-i) if i%tempTime==0: self.arfa=self.arfa/2.0 temp=npr.random() if temp<self.crossoverPro: #如果判定值小于交换概率,就发生基因交换 self.crossover() temp=npr.random() if temp<self.mutationPro: self.mutaion() self.find() print("系数的值为",self.population[self.bestPos].chromosome) print("该系数对应评估值为",self.population[self.bestPos].eval) i+=1 data=numpy.loadtxt(r'D:\Programming\Python数学建模课程\黑枸杞溶出.txt') t=data[:,0] A=data[:,1] def f(v): global t,A a,k1,k2=v f = a*k1*(numpy.exp(-k1* t)-numpy.exp(-k2*t))/(k2-k1) error=numpy.sum((A-f)2) s=numpy.sum(error2) return s nga=NGA(100,3,0.1,0.1,10000,f) nga.solve()
讯享网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31339.html