版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
遗传算法的python实现种群初始化,随机生成一个种群,100-500,将染色体编码defspecies_origin(self):
population=[[]]
foriinrange(self.population_size):
temporary=[]
#染色体暂存器
forjinrange(self.choromosome_length):
temporary.append(random.randint(0,1))
#随机产生一个染色体,由二进制数组成
population.append(temporary)
#将染色体添加到种群中
returnpopulation[1:]deftranslation(self,population):
temporary=[]
foriinrange(len(population)):
total=0
forjinrange(self.choromosome_length):
total+=population[i][j]*(math.pow(2,j))
#从第一个基因开始,每位对2求幂,再求和
#如:0101转成十进制为:1*20+0*21+1*22+0*23=1+0+4+0=5
temporary.append(total)
#一个染色体编码完成,由一个二进制数编码为一个十进制数
returntemporary种群评估,将目标函数值作为个体适应度deffunction(self,population):
temporary=[]
function1=[]
temporary=self.translation(population)
foriinrange(len(temporary)):
x=temporary[i]*self.max_value/(math.pow(2,self.choromosome_length)-10)
function1.append(2*math.sin(x)+math.cos(x))
#这里将sin(x)作为目标函数
returnfunction1选择根据个体适应度,通过轮盘赌从适应度高的个体从当前种群中选择出来deffitness(self,function1):
fitness_value=[]
num=len(function1)
foriinrange(num):
if(function1[i]>0):
temporary=function1[i]
else:
temporary=0.0
#如果适应度小于0,则定为0
fitness_value.append(temporary)
#将适应度添加到列表中
returnfitness_value交叉运算defcrossover(self,population):
#pc是概率阈值,选择单点交叉还是多点交叉,生成新的交叉个体,这里没用
pop_len=len(population)
foriinrange(pop_len-1):
if(random.random()<self.pc):
cpoint=random.randint(0,len(population[0]))
#在种群个数内随机生成单点交叉点
temporary1=[]
temporary2=[]
temporary1.extend(population[i][0:cpoint])
temporary1.extend(population[i+1][cpoint:len(population[i])])
#将tmporary1作为暂存器,暂时存放第i个染色体中的前0到cpoint个基因,
#然后再把第i+1个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面
temporary2.extend(population[i+1][0:cpoint])
temporary2.extend(population[i][cpoint:len(population[i])])
#将tmporary2作为暂存器,暂时存放第i+1个染色体中的前0到cpoint个基因,
#然后再把第i个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面
population[i]=temporary1
population[i+1]=temporary2变异运算终止判断具体代码实现:#-*-coding:utf-8-*-
#目标求解2*sin(x)+cos(x)最大值
importrandom
importmath
importmatplotlib.pyplotasplt
classGA(object):
#初始化种群生成chromosome_length大小的population_size个个体的种群
def__init__(self,population_size,chromosome_length,max_value,pc,pm):
self.population_size=population_size
self.choromosome_length=chromosome_length
#self.population=[[]]
self.max_value=max_value
self.pc=pc
self.pm=pm
#self.fitness_value=[]
defspecies_origin(self):
population=[[]]
foriinrange(self.population_size):
temporary=[]
#染色体暂存器
forjinrange(self.choromosome_length):
temporary.append(random.randint(0,1))
#随机产生一个染色体,由二进制数组成
population.append(temporary)
#将染色体添加到种群中
returnpopulation[1:]
#将种群返回,种群是个二维数组,个体和染色体两维
#从二进制到十进制
#编码input:种群,染色体长度编码过程就是将多元函数转化成一元函数的过程
deftranslation(self,population):
temporary=[]
foriinrange(len(population)):
total=0
forjinrange(self.choromosome_length):
total+=population[i][j]*(math.pow(2,j))
#从第一个基因开始,每位对2求幂,再求和
#如:0101转成十进制为:1*20+0*21+1*22+0*23=1+0+4+0=5
temporary.append(total)
#一个染色体编码完成,由一个二进制数编码为一个十进制数
returntemporary
#返回种群中所有个体编码完成后的十进制数
#fromproteintofunction,accordingtoitsfunctoinvalue
#aproteinrealizeitsfunctionaccordingitsstructure
#目标函数相当于环境对染色体进行筛选,这里是2*sin(x)+math.cos(x)
deffunction(self,population):
temporary=[]
function1=[]
temporary=self.translation(population)
foriinrange(len(temporary)):
x=temporary[i]*self.max_value/(math.pow(2,self.choromosome_length)-10)
function1.append(2*math.sin(x)+math.cos(x))
#这里将sin(x)作为目标函数
returnfunction1
#定义适应度
deffitness(self,function1):
fitness_value=[]
num=len(function1)
foriinrange(num):
if(function1[i]>0):
temporary=function1[i]
else:
temporary=0.0
#如果适应度小于0,则定为0
fitness_value.append(temporary)
#将适应度添加到列表中
returnfitness_value
#计算适应度和
defsum(self,fitness_value):
total=0
foriinrange(len(fitness_value)):
total+=fitness_value[i]
returntotal
#计算适应度斐伯纳且列表
defcumsum(self,fitness1):
foriinrange(len(fitness1)-2,-1,-1):
#range(start,stop,[step])
#倒计数
total=0
j=0
while(j<=i):
total+=fitness1[j]
j+=1
fitness1[i]=total
fitness1[len(fitness1)-1]=1
#3.选择种群中个体适应度最大的个体
defselection(self,population,fitness_value):
new_fitness=[]
#单个公式暂存器
total_fitness=self.sum(fitness_value)
#将所有的适应度求和
foriinrange(len(fitness_value)):
new_fitness.append(fitness_value[i]/total_fitness)
#将所有个体的适应度正则化
self.cumsum(new_fitness)
#
ms=[]
#存活的种群
population_length=pop_len=len(population)
#求出种群长度
#根据随机数确定哪几个能存活
foriinrange(pop_len):
ms.append(random.random())
#产生种群个数的随机值
#ms.sort()
#存活的种群排序
fitin=0
newin=0
new_population=new_pop=population
#轮盘赌方式
whilenewin<pop_len:
if(ms[newin]<new_fitness[fitin]):
new_pop[newin]=population[fitin]
newin+=1
else:
fitin+=1
population=new_pop
#4.交叉操作
defcrossover(self,population):
#pc是概率阈值,选择单点交叉还是多点交叉,生成新的交叉个体,这里没用
pop_len=len(population)
foriinrange(pop_len-1):
if(random.random()<self.pc):
cpoint=random.randint(0,len(population[0]))
#在种群个数内随机生成单点交叉点
temporary1=[]
temporary2=[]
temporary1.extend(population[i][0:cpoint])
temporary1.extend(population[i+1][cpoint:len(population[i])])
#将tmporary1作为暂存器,暂时存放第i个染色体中的前0到cpoint个基因,
#然后再把第i+1个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面
temporary2.extend(population[i+1][0:cpoint])
temporary2.extend(population[i][cpoint:len(population[i])])
#将tmporary2作为暂存器,暂时存放第i+1个染色体中的前0到cpoint个基因,
#然后再把第i个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面
population[i]=temporary1
population[i+1]=temporary2
#第i个染色体和第i+1个染色体基因重组/交叉完成
defmutation(self,population):
#pm是概率阈值
px=len(population)
#求出种群中所有种群/个体的个数
py=len(population[0])
#染色体/个体基因的个数
foriinrange(px):
if(random.random()<self.pm):
mpoint=random.randint(0,py-1)
#
if(population[i][mpoint]==1):
#将mpoint个基因进行单点随机变异,变为0或者1
population[i][mpoint]=0
else:
population[i][mpoint]=1
#transformthebinarytodecimalism
#将每一个染色体都转化成十进制max_value,再筛去过大的值
defb2d(self,best_individual):
total=0
b=len(best_individual)
foriinrange(b):
total=total+best_individual[i]*math.pow(2,i)
total=total*self.max_value/(math.pow(2,self.choromosome_length)-1)
returntotal
#寻找最好的适应度和个体
defbest(self,population,fitness_value):
px=len(population)
bestindividual=[]
bestfitness=fitness_value[0]
#print(fitness_value)
foriinrange(1,px):
#循环找出最大的适应度,适应度最大的也就是最好的个体
if(fitness_value[i]>bestfitness):
bestfitness=fitness_value[i]
bestindividual=population[i]
return[bestindividual,bestfitness]
defplot(self,results):
X=[]
Y=[]
foriinrange(500):
X.append(i)
Y.append(results[i][0])
plt.plot(X,Y)
plt.show()
defmain(self):
results=[[]]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1.2自然资源及其利用教学设计高中地理人教版(2019)选择性必修3
- 2026陕西西安交通大学仪器科学与技术学院管理辅助人员招聘1人备考题库及参考答案详解【培优B卷】
- 2026福建厦门市集美区杏东小学产假顶岗教师招聘1人参考题库及答案详解(有一套)
- 疝气中医护理的起居调摄
- 2026届新高一物理暑假衔接预习资料包运动相互作用牛顿定律功和能开学摸底卷答案详解评分标准
- 护理文书书写:记录规范与要求
- 护理临床与患者安全文化构建
- 2026浙江温州市乐清市选调公务员13人笔试题库附答案详解(考试直接用)
- 2026甘肃省城乡发展投资集团有限公司校园招聘15人参考题库附参考答案详解【巩固】
- 2026年潍坊寒亭区融媒体中心公开招聘播音主持人员简章备考题库及参考答案详解(巩固)
- 2026年4月自考00097外贸英语写作试题
- 个人防护装备穿脱操作规范
- 南京市既有建筑加固改造工程勘察导则(试行)2026
- 2026年小学一年级下册语文暑假衔接提升练习卷含答案
- GB/T 8325-2026塑料聚合物分散体和橡胶胶乳pH值的测定
- 2026年肺结核规范化诊疗与管理指南
- 2026年高中历史学业水平考试知识点归纳总结(复习必背)
- 成都泡桐中学2026小升初入学分班考试数学考试试题及答案
- 2025北京海淀区初一(下)期末语文试题及答案
- 2025年伊犁师范大学马克思主义基本原理概论期末考试真题汇编
- 2025 智能建造产业发展报告(含装配式建筑)
评论
0/150
提交评论