写在前面
之前的文章中已经讲过了遗传算法的基本流程,并且用MATLAB实现过一遍了。这一篇文章主要面对的人群是看过了我之前的文章,因此我就不再赘述遗传算法是什么以及基本的内容了,假设大家已经知道我是怎么写遗传算法的了。
Python的遗传算法主函数
我的思想是,创建一个染色体的类,其中包括了两个变量:染色体chrom与适应度fitness。因此我们就可以通过直接建立对象来作为种群中的个体。
#染色体的类class Chrom: chrom = [] fitness = 0 def showChrom(self): print(self.chrom) def showFitness(self): print(self.fitness)
所以我们开始设置基础参数。其中种群的表达方式我用的是字典,也就是用一个字典来保存种群内的所有个体,这个也是我想出来的创建多个对象的方法。
将字典的索引为个体的标号,如:chrom1, chrom2等。字典索引的值就是一个对象。这个对象拥有两个属性,就是染色体与适应度。
其实在这一方便来说,我觉得在思路上是优于利用MATLAB的矩阵式编程的。因为这样可以很直观的将个体与个体的属性这一种思想给表达出来,相比一堆矩阵来说,在逻辑上比较容易接受。
#基础参数N = 200 #种群内个体数目mut = 0.2 #突变概率acr = 0.2 #交叉概率pop = {} #存储染色体的字典for i in range(N): pop['chrom'+str(i)] = Chrom()chromNodes = 2 #染色体节点数(变量个数)iterNum = 10000 #迭代次数chromRange = [[0, 10], [0, 10]] #染色体范围aveFitnessList = [] #平均适应度bestFitnessList = [] #最优适应度
之后就是初始染色体了,其中就牵扯到了各种用来初始化种群、计算适应度、找最优等函数,我在这里分出了两个文件,分别为Genetic.py与Fitness.py。
Genetic.py里面有八个函数,主要包含了作用于种群或者染色体操作的函数,分别为:
Fitness.py里面有两个函数,主要包含了对适应度操作的函数,分别为:
因此可以列出初始化代码为
#初始染色体pop = Genetic.initialize(pop, chromNodes, chromRange)pop = Fitness.calFitness(pop) #计算适应度bestChrom = Genetic.findBest(pop) #寻找最优染色体bestFitnessList.append(bestChrom[1]) #将当前最优适应度压入列表中aveFitnessList.append(Genetic.calAveFitness(pop, N)) #计算并存储平均适应度
新闻热点
疑难解答