,,遗传算法之Python实现代码

,,遗传算法之Python实现代码

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: