本篇文章主要介绍了Python 遗传算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

写在前面

之前的文章中已经讲过了遗传算法的基本流程,并且用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里面有八个函数,主要包含了作用于种群或者染色体操作的函数,分别为:findBest函数,用于寻找种群中的最优染色体;

findworse函数,用于寻找种群中的最劣染色体;

initialize函数,用于初始化种群;

calAveFitness函数,用于计算种群的平均适应度;

mutChrom函数,用于对染色体进行变异;

inRange函数,用于判断染色体节点值是否越界;

acrChrom函数,用于对染色体进行交叉;

compareChrom函数,用于比较两个染色体孰优孰劣。

Fitness.py里面有两个函数,主要包含了对适应度操作的函数,分别为:calFitness函数,用来迭代每一个个体,并计算适应度(利用funcFitness函数计算);

funcFitness函数,计算单个个体的适应度。

因此可以列出初始化代码为

#初始染色体

pop = Genetic.initialize(pop, chromNodes, chromRange)

pop = Fitness.calFitness(pop) #计算适应度

bestChrom = Genetic.findBest(pop) #寻找最优染色体

bestFitnessList.append(bestChrom[1]) #将当前最优适应度压入列表中

aveFitnessList.append(Genetic.calAveFitness(pop, N)) #计算并存储平均适应度

迭代过程的思路和逻辑与MATLAB无异

#开始迭代

for t in range(iterNum):

#染色体突变

pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange)

#染色体交换

pop = Genetic.acrChrom(pop, acr, chromNodes)

#寻找最优

nowBestChrom = Genetic.findBest(pop)

#比较前一个时间的最优和现在的最优

bestChrom = Genetic.compareChrom(nowBestChrom, bestChrom)

#寻找与替换最劣

worseChrom = Genetic.findWorse(pop)

pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy()

pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness

#存储最优与平均

bestFitnessList.append(bestChrom[1])

aveFitnessList.append(Genetic.calAveFitness(pop, N))

最后再做一下迭代的的图像

plt.figure(1)

plt.plot(x, aveFitnessList)

plt.plot(x, bestFitnessList)

plt.show()

最后再在最前面加上各种库和文件就可以运行了。

import Genetic

import Fitness

import matplotlib.pyplot as plt

import numpy as np

感悟

可以说最主要的感悟就是染色体这一个类。其实那个Genetic.py与Fitness.py这两个文件也可以直接包装成类,但是这样一来我就嫌主文件太臃肿,在其他里面再包装成类又多此一举,毕竟这只是一个小程序,所以我就这样写了。

深刻感悟到了面向对象编程的优点,在编程逻辑的处理上真是一种享受,只需要思考对象的属性即可,省去了许多复杂的思考。

另一个感悟就是创建多个对象时,利用字典的方法来创建对象。当初我也是困惑怎么建立一个类似于C++中的对象数组,上网查找了各种方法,结果都避而不谈(当然,也可能是我搜索能力太差没找到),所以经过尝试中遇到到了这种方法。

等有空我再详细说一下这个方法吧,这一次就先到这里。

剩余的函数补充

首先是Genetic.py里面的八个函数

import random

#寻找最优染色体

def findBest(pop):

best = ['1', 0.0000001]

for i in pop:

if best[1] < pop[i].fitness:

best = [i, pop[i].fitness]

return best

#寻找最劣染色体

def findWorse(pop):

worse = ['1', 999999]

for i in pop:

if worse[1] > pop[i].fitness:

worse = [i, pop[i].fitness]

return worse

#赋初始值

def initialize(pop, chromNodes, chromRange):

for i in pop:

chromList = []

for j in range(chromNodes):

chromList.append(random.uniform(chromRange[j][0], chromRange[j][1]+1))

pop[i].chrom = chromList.copy()

return pop

#计算平均适应度

def calAveFitness(pop, N):

sumFitness = 0

for i in pop:

sumFitness = sumFitness + pop[i].fitness

aveFitness = sumFitness / N

return aveFitness

#进行突变

def mutChrom(pop, mut, chromNodes, bestChrom, chromRange):

for i in pop:

#如果随机数小于变异概率(即可以变异)

if mut > random.random():

mutNode = random.randrange(0,chromNodes)

mutRange = random.random() * (1-pop[i].fitness/bestChrom[1])**2

pop[i].chrom[mutNode] = pop[i].chrom[mutNode] * (1+mutRange)

#判断变异后的范围是否在要求范围内

pop[i].chrom[mutNode] = inRange(pop[i].chrom[mutNode], chromRange[mutNode])

return pop

#检验便宜范围是否在要求范围内

def inRange(mutNode, chromRange):

if chromRange[0] < mutNode < chromRange[1]:

return mutNode

elif mutNode-chromRange[0] > mutNode-chromRange[1]:

return chromRange[1]

else:

return chromRange[0]

#进行交叉

def acrChrom(pop, acr, chromNodes):

for i in pop:

for j in pop:

if acr > random.random():

acrNode = random.randrange(0, chromNodes)

#两个染色体节点进行交换

pop[i].chrom[acrNode], pop[j].chrom[acrNode] = pop[j].chrom[acrNode], pop[i].chrom[acrNode]

return pop

#进行比较

def compareChrom(nowbestChrom, bestChrom):

if bestChrom[1] > nowbestChrom[1]:

return bestChrom

else:

return nowbestChrom

然后是Fitness.py的两个函数

import math

def calFitness(pop):

for i in pop:

#计算每个染色体的适应度

pop[i].fitness = funcFitness(pop[i].chrom)

return pop

def funcFitness(chrom):

#适应度函数

fitness = math.sin(chrom[0])+math.cos(chrom[1])+0.1*(chrom[0]+chrom[1])

python 遗传算法_Python实现遗传算法的代码相关推荐

  1. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  2. doc python 颜色_Python wordcloud.ImageColorGenerator方法代码示例

    本文整理汇总了Python中wordcloud.ImageColorGenerator方法的典型用法代码示例.如果您正苦于以下问题:Python wordcloud.ImageColorGenerat ...

  3. python 柱形图_python绘制双柱形图代码实例

    图表是比干巴巴的表格更直观的表达,简洁.有力.工作中经常遇到的场景是,有一些数值需要定时的监控,比如服务器的连接数.活跃用户数.点击某个按钮的人数,并且通过邮件或者网页展示出来.当我们想关注比数值本身 ...

  4. set python用法_Python set()用法及代码示例

    集合(Set)是由不同语言组成的序列的数学术语,Python也对其语言进行了扩展,并且可以使用set()轻松制作. set()方法用于将任何可迭代元素转换为可迭代元素的不同元素和排序序列,通常称为Se ...

  5. g的python实现_Python flask.g方法代码示例

    本文整理汇总了Python中flask.g方法的典型用法代码示例.如果您正苦于以下问题:Python flask.g方法的具体用法?Python flask.g怎么用?Python flask.g使用 ...

  6. python抠图_Python用5行代码实现批量抠图的示例代码

    前言 对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过一些比较复杂的图,有时候还是要画点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠 ...

  7. 遗传算法 python 简书_遗传算法入门

    遗传算法简介: 遗传算法(Genetic algorithm)属于演化计算( evolutionary computing),是随着人工智能领域发展而来的一种智能算法.正如它的名字所示,遗传算法是受达 ...

  8. 写一个用遗传算法解决VRP问题的代码

    下面是一个使用 Python 实现的遗传算法解决 VRP 问题的代码示例: ``` import random import numpy as np class VRP: def init(self, ...

  9. 如何利用遗传算法进行自变量降维(代码部分)

    如何利用遗传算法进行自变量降维(代码部分) main.m 主函数 输入自变量优化适应度子函数 fitness.m 输入自变量优化编码解码子函数 de_code.m BP网络权值和阈值优化适应度子函数 ...

  10. 遗传算法之路径规划matlab代码(栅格地图)含详细注释

    遗传算法本人在另一篇博文中已经有记载,本次将遗传算法用于路径规划的代码记录于此,用于大家一起学习 一起进步,如果有用,欢迎点赞. 1.基于遗传算法的栅格法机器人路径规划main.m % 基于遗传算法的 ...

最新文章

  1. ceph bluestore源码分析:非对齐写逻辑
  2. Node.js模块系统
  3. linux下db2创建批量存储过程,DB2批量执行SQL脚本以及存储过程的实现
  4. OCR识别-python版(一)
  5. Windows下lex 与 yacc的使用
  6. metasploit终端命令大全 MSF
  7. lvs mysql 端口_LVS配置及多端口服务配置
  8. Github简单使用
  9. Springboot 使用校验框架validation校验
  10. 如何解决大规模高性能存储可靠性问题?
  11. 霍夫变换c语言程序,霍夫变换 | Cauthy's Blog
  12. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
  13. 视频播放器(二)——播放列表
  14. php编辑菱形图案代码,打印菱形图案 (15 分)
  15. mixins(混入)
  16. 动画中的“表现手法”和“表现方式”分别是什么?今天艺点动画大家庭来给你唠嗑唠嗑
  17. 计算机技能大赛简讯内,科技节现场类比赛简讯
  18. Python全栈工程师(30:html)
  19. github提速攻略
  20. 在哪里找最好用的CAD看图软件下载使用

热门文章

  1. 通向Golang的捷径【3.编辑器,IDE 和其他工具】
  2. 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
  3. 南银法巴消费金融拟设线下直营中心,与南京银行CFC联动
  4. GraphX 基础一
  5. 用C语言打印“萌新程序员上路,请多关照!”
  6. 《系统工程》--课程笔记二(系统工程方法论)
  7. 几何画板制作抛物线,就是这么简单
  8. pta平台用c语言编程答案,C语言PTA平台习题与答案
  9. Sql Server 2005 开发版亲测可用下载地址
  10. linux chmod -r,linux chmod -R 777 / 的危害