遗传算法Python 教程(1)
遗传算法Python 教程(1)
遗传算法简介
遗传算法是一种通过种群演化得到最优解的搜索算法。遗传算法受启发与生物演化过程中的一些现象,这些现象包括自然选择,交配,突变,遗传等。本教程将通过Python来展示遗传算法的本质和如何使用遗传算法去解决问题。
遗传算法的一般概念
遗传算法是通过一代一代种群 population 演化来寻找对问题最优解的个体 individual。其中种群中包含了 N 个个体,而每一个个体是问题的可能解。每一次迭代,fitness 函数会计算每一个个体对目标问题解的合适成都然后选择最适合的k个个体为下一代演化的后代。演化过程中会有一定概率的个体相互交配,互换染色体,和突变行为,这一过程可以防止种群在演化过程中的适应度被困在局部最优解。 遗传算法的过程可以被一下步骤描述。
- 一个随机生成的种群 population;
- 通过fitness 函数选择种群的后代;
- 后代 offerspring 在一定概率下交配;
- 后代 offerspring 在一定概率下 变异;
- 将后代赋值给种群 population, 重复步骤 (2) 至 (4) 直到迭代次数超过设定值;
第一个遗传算法的实现
首先我们实现一个简单的遗传算法。我们期望通过遗传算法演化出一个长度为10 且所有元素都为 1 的 list [1111111111]。在这个简单例子中将只会用到 变异,因为这里我们主要希望展现遗传算法的迭代过程,所以关于交配的方法和更高级的fitness函数的构建将在后续的教程中介绍。
import numpy as np
import copy# -- 定义参数 --
populationSize = 50
numGenerations = 100
# ***
genomeLength = 10
population = []# -- 遗传算法需要用到的方法 --# 变异
def mutate(Wgenome, mutationRate=0.1):for i in range(len(Wgenome)):if np.random.random() < mutationRate:Wgenome[i] = np.random.randint(2)# 选择
def topNSelectFull(topn=10, maximize=True):global population, populationSizepopulation.sort(key=lambda x: x.fitness, reverse=maximize)selected = copy.deepcopy(population[:topn])counter = 0for i in range(populationSize):population[i] = copy.deepcopy(selected[counter])counter += 1if counter == topn:counter = 0
接着我们定义一个个体
class individual:def __init__(self):self.fitness = 0 #个体的适应度self.genome = [] #个体是一个listdef setGenome(self, newGenome):self.genome = newGenomedef getGenome(self):return self.genome
因为我们期望从随机生成的个体中演化出一个全为1的list, 所以我们的fitness 函数就会是这个list的求和 sum(p.getGenome())。然后我们选择演化过程中最大化个体的适应度,所以让 topNSelectFull 去选择适应度最高的5个个体。最后演化完成后我们把最后一代的所有个体打出来。
if __name__ == "__main__":for i in range(populationSize):indiv = individual()# ***#indiv.setGenome( np.random.choice(2,genomeLength) )indiv.setGenome( np.zeros(genomeLength, dtype=int) )population.append( indiv )for generation in range(numGenerations):for p in population:#计算每个个体的适应度p.fitness = sum(p.getGenome())if generation % 1 == 0:print( "Gen", generation, "Fitness: ", np.max( [p.fitness for p in population] ) )topNSelectFull(topn=5, maximize=True)# 选择适应度最高的五个个体for i in range(populationSize):# 使 10 % 的个体变异newGenome = mutate(population[i].getGenome(), mutationRate=0.1)# ***
for p in population:print ( p.getGenome() )
一个简单的遗传算法就完成了。
遗传算法Python 教程(1)相关推荐
- 给老婆写个Python教程
作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_source=csdn_bw 什么是code code就是 ...
- 【python教程入门学习】Python实现自动玩贪吃蛇程序
这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
- 廖的python教程_廖雪峰的Python3.x教程.pdf
目录 Python教程 Python简介 安装Python Python解释器 第一个Python程序 使用文本编辑器 Python代码运行助手 输入和输出 源码 learning.py Python ...
- python教程app下载地址_python教程
python教程它是一个移动编程学习应用程序,可以为学习编程的用户提供高级学习工具,借助该软件,用户可以轻松获得各个阶段的培训资料,并且大量高质量的培训视频简化并简化了用户培训,有兴趣的朋友可以轻松下 ...
- python是什么系统_最齐全、最系统的python教程
python教程(后面有彩蛋) python教程目录 学python都用来干嘛的? 主要就是"简单啊"."收入高啊"."人生苦短,我用Python&q ...
- python操作excel-python操作excel(内附python教程分享)
今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦. python操作excel(内附python教程分享) 基本对象 网上刮来 ...
- python 教程 网盘-python教程网盘
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 解释器不会一次把整个程序转译出来,只像一位"中间人",每次运行 ...
- python画代码-Python教程_Python画Mandelbrot集 代码
Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...
- 廖雪峰python教程书-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
最新文章
- pycharm导入anaconda虚拟环境问题
- HDU2031 进制转换【进制】
- cygwin安装skyeye 所需的软件包列表
- 【转】syslog服务和syslogd守护进程
- Android ——SoundPool播放音频
- Eclipse的两个hibernate plugin
- 微信小程序tabBar的开发设置
- 关于memset函数和赋值0x3f,2021-5-5
- 深度揭密SSD中的原片/白片/黑片:莫贪小便宜
- 2345浏览器劫持主页解决办法
- GitLab Projects 2020 插件配置
- 黑苹果10.10.3手动开启SSD的TIRM提高硬盘效率
- gifcam使用缩小内存_GifCam怎么用?GifCam使用教程
- 仿开心网的前端页面 html+css
- use tools:overrideLibrary=xxx.xxx.xxxr to force usage 问题分析。
- 如何破解计算机拒绝访问u盘,高手应对U盘拒绝访问有绝招
- 机械键盘检测连击的软件
- 编码器知识汇总(增量式/绝对式/绝对值)
- 【Linux】raid管理工具-mdadm-raid0管理
- 微信开发sdk_二次开发微信API更新日志