本文主要介绍Python遗传算法,边肖认为挺好的。现在分享给大家,给大家一个参考。来和边肖一起看看吧。
写在前面
遗传算法的基本流程在前面的文章中已经描述过了,并且已经用MATLAB实现。本文主要是针对看过我之前文章的人,所以我就不重复什么是遗传算法及其基本内容了,假设大家已经知道我是怎么写遗传算法的。
Python的遗传算法主函数
我的想法是创建一个染色体类,包含两个变量:染色体chrom和适应度fitness。因此,我们可以直接将对象建立为群体中的个体。
#染色体类别
Chrom类:
chrom=[]
健康=0
def showChrom(self):
打印(self.chrom)
def showFitness(自我):
打印(自我健身)
所以我们开始设置基本参数。其中,我用一个字典来表示种群,也就是用一个字典来存储种群中的所有个体。这也是我想出的创建多个对象的方法。
将字典索引到单个标签,如chrom1、chrom2等。字典索引的值是一个对象。这个对象有两个属性,即染色体和适应度。
其实为了这个方便,我觉得比用MATLAB做矩阵编程要好。因为它可以直观地表达个体及其属性的思想,相比一堆矩阵,逻辑上更容易接受。
#基本参数
in 200 #人群中的个体数量
Mut=0.2 #突变概率
Acr=0.2 #交叉概率
Pop={} #存储染色体的字典
对于范围内的I(N):
pop['chrom' str(i)]=Chrom()
ChromNodes=2 #染色体节点(变量数)
IterNum=10000 #迭代次数
ChromRange=[[0,10],[0,10]] #染色体范围
AveFitnessList=[] #平均健康状况
最佳健身列表=[] #最佳健身
之后就是初始染色体,涉及到初始化种群、计算适应度、寻找最优等各种函数。我在这里分了两个文件,分别是Genetic.py和Fitness.py。
Genetic.py中有八个函数,主要包括那些作用于群体或染色体操作的函数,即:
FindBest函数,用于在种群中寻找最优染色体;
findbuster函数,用于寻找种群中最差的染色体;
初始化函数,用于初始化人口;
CalAveFitness函数,用于计算群体的平均适合度;
MutChrom函数,用于变异染色体;
InRange函数,用于判断染色体节点值是否越界;
AcrChrom函数,用于染色体交叉;
CompareChrom函数,用来比较两条染色体的优劣。
Fitness.py中有两个函数,主要包括健身操作的函数,即:
CalFitness函数,用于迭代每个个体,计算适应度(由funcFitness函数计算);
FuncFitness函数,计算个体的适应度。
因此,初始化代码可以列为
#初始染色体
pop=Genetic.initialize(pop,chromNodes,chromRange)
Pop=Fitness.calFitness(pop) #计算健身
Bestrom=genetic.findbest (pop) #寻找最佳染色体
besitnesslist . append(best chrom[1])#将当前的最优适应度压入列表中。
avenes list . append(genetic . calave fitness(pop,n)) #计算并存储平均适应度。
迭代过程的思路和逻辑和MATLAB没什么区别。
#开始迭代
对于范围内的t(iterNum):
#染色体突变
pop=Genetic.mutChrom(pop,mut,chromNodes,bestChrom,chromRange)
#染色体交换
pop=Genetic.acrChrom(pop,acr,chromNodes)
#寻找最好的
nowBestChrom=genetic . findbest(pop)
#将过去最好的时光与现在最好的时光进行比较
bestChrom=genetic . compare chrom(nowBestChrom,best chrom)
#找到并替换最差的
worse chrom=genetic . find worse(pop)
pop[worseChrom[0]]。chrom=pop[best chrom[0]]. chrom . copy()
pop[worseChrom[0]]。fitness=pop[bestChrom[0]]。健康
#最佳和一般存储
bestfitnesslist . append(best chrom[1])
avefitnesslist。追加(遗传。calavefitness(纽约州波普市)
最后再做一下迭代的的图像
plt。图(1)
plt.plot(x,aveFitnessList)
plt.plot(x,最佳列表)
plt.show()
最后再在最前面加上各种库和文件就可以运行了。
导入基因
进口健身
将matplotlib.pyplot作为plt导入
将numpy作为铭牌导入
感悟
可以说最主要的感悟就是染色体这一个类。其实那个Genetic.py与健身。巴拉圭这两个文件也可以直接包装成类,但是这样一来我就嫌主文件太臃肿,在其他里面再包装成类又多此一举,毕竟这只是一个小程序,所以我就这样写了。
深刻感悟到了面向对象编程的优点,在编程逻辑的处理上真是一种享受,只需要思考对象的属性即可,省去了许多复杂的思考。
另一个感悟就是创建多个对象时,利用字典的方法来创建对象。当初我也是困惑怎么建立一个类似于C中的对象数组,上网查找了各种方法,结果都避而不谈(当然,也可能是我搜索能力太差没找到),所以经过尝试中遇到到了这种方法。
等有空我再详细说一下这个方法吧,这一次就先到这里。
剩余的函数补充
首先是Genetic.py里面的八个函数
随机导入
#寻找最优染色体
def findBest(pop):
best=['1 ',0.0000001]
对于流行音乐中的我:
最好是砰的一声。健身:
best=I,pop[i].健身]
回报最佳
#寻找最劣染色体
def findbrader(pop):
更糟=['1 ',999999]
对于流行音乐中的我:
如果更糟,砰的一声。健身:
更糟=[我,流行[我]。健身]
返回更糟
#赋初始值
def initialize(pop,chromNodes,chromRange):
对于流行音乐中的我:
chromList=[]
对于范围内的j(chromNodes):
chrom列表。追加(随机。uniform(chrom range[j][0],chromRange[j][1] 1))
波普[我]chrom=chromList.copy()
返回流行音乐
#计算平均适应度
def calAveFitness(pop,N):
sumFitness=0
对于流行音乐中的我:
sumFitness=sumFitness pop[i].健康
aveFitness=sumFitness/N
返回aveFitness
#进行突变
def mutChrom(pop,mut,chromNodes,bestChrom,chromRange):
对于流行音乐中的我:
#如果随机数小于变异概率(即可以变异)
if mut random.random():
mutNode=random.randrange(0,chromNodes)
mut范围=随机。random()*(1-pop[I].fitness/bestChrom[1])**2
波普[我chrom[mutNode]=pop[i].chrom[mutNode] * (1个mutRange)
#判断变异后的范围是否在要求范围内
波普[我]chrom[mutNode]=inRange(pop[i]).chrom[mutNode],chromRange[mutNode])
返回流行音乐
#检验便宜范围是否在要求范围内
def inRange(mutNode,chromRange):
if chrom range[0]mutNode chrom range[1]:
返回节点
elif多节点色范围[0]多节点色范围[1]:
返回色范围[1]
否则:
返回颜色范围[0]
#进行交叉
def acrChrom(pop,acr,chromNodes):
对于流行音乐中的我:
对于流行音乐中的j:
if acr random.random():
acrNode=random.randrange(0,chromNodes)
#两个染色体节点进行交换
波普[我]chrom[acrNode],pop[j].流行的,流行的.chrom[acrNode],pop[i].铬[铬]合金
返回流行音乐
#进行比较
def compareChrom(nowbestChrom,bestChrom):
if bestChrom[1] nowbestChrom[1]:
返回贝斯特罗姆
否则:
返回nowbestChrom
然后是健身。巴拉圭的两个函数
导入数学
def calFitness(pop):
对于流行音乐中的我:
#计算每个染色体的适应度
波普[我]fitness=funcFitness(pop[i].chrom)
返回流行音乐
def函数Fitness(铬):
#适应度函数
健身=数学。sin(chrom[0])数学。cos(chrom[1])0.1 *(chrom[0]chrom[1])
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。