遗传算法Python 教程(1)

遗传算法简介

遗传算法是一种通过种群演化得到最优解的搜索算法。遗传算法受启发与生物演化过程中的一些现象,这些现象包括自然选择,交配,突变,遗传等。本教程将通过Python来展示遗传算法的本质和如何使用遗传算法去解决问题。

遗传算法的一般概念

遗传算法是通过一代一代种群 population 演化来寻找对问题最优解的个体 individual。其中种群中包含了 N 个个体,而每一个个体是问题的可能解。每一次迭代,fitness 函数会计算每一个个体对目标问题解的合适成都然后选择最适合的k个个体为下一代演化的后代。演化过程中会有一定概率的个体相互交配,互换染色体,和突变行为,这一过程可以防止种群在演化过程中的适应度被困在局部最优解。 遗传算法的过程可以被一下步骤描述。

  1. 一个随机生成的种群 population
  2. 通过fitness 函数选择种群的后代;
  3. 后代 offerspring 在一定概率下交配
  4. 后代 offerspring 在一定概率下 变异
  5. 将后代赋值给种群 population, 重复步骤 (2) 至 (4) 直到迭代次数超过设定值;

第一个遗传算法的实现

首先我们实现一个简单的遗传算法。我们期望通过遗传算法演化出一个长度为10 且所有元素都为 1list [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)相关推荐

  1. 给老婆写个Python教程

    作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_source=csdn_bw 什么是code code就是 ...

  2. 【python教程入门学习】Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...

  3. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  4. 廖的python教程_廖雪峰的Python3.x教程.pdf

    目录 Python教程 Python简介 安装Python Python解释器 第一个Python程序 使用文本编辑器 Python代码运行助手 输入和输出 源码 learning.py Python ...

  5. python教程app下载地址_python教程

    python教程它是一个移动编程学习应用程序,可以为学习编程的用户提供高级学习工具,借助该软件,用户可以轻松获得各个阶段的培训资料,并且大量高质量的培训视频简化并简化了用户培训,有兴趣的朋友可以轻松下 ...

  6. python是什么系统_最齐全、最系统的python教程

    python教程(后面有彩蛋) python教程目录 学python都用来干嘛的? 主要就是"简单啊"."收入高啊"."人生苦短,我用Python&q ...

  7. python操作excel-python操作excel(内附python教程分享)

    今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦. python操作excel(内附python教程分享) 基本对象 网上刮来 ...

  8. python 教程 网盘-python教程网盘

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 解释器不会一次把整个程序转译出来,只像一位"中间人",每次运行 ...

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

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

  10. 廖雪峰python教程书-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

最新文章

  1. pycharm导入anaconda虚拟环境问题
  2. HDU2031 进制转换【进制】
  3. cygwin安装skyeye 所需的软件包列表
  4. 【转】syslog服务和syslogd守护进程
  5. Android ——SoundPool播放音频
  6. Eclipse的两个hibernate plugin
  7. 微信小程序tabBar的开发设置
  8. 关于memset函数和赋值0x3f,2021-5-5
  9. 深度揭密SSD中的原片/白片/黑片:莫贪小便宜
  10. 2345浏览器劫持主页解决办法
  11. GitLab Projects 2020 插件配置
  12. 黑苹果10.10.3手动开启SSD的TIRM提高硬盘效率
  13. gifcam使用缩小内存_GifCam怎么用?GifCam使用教程
  14. 仿开心网的前端页面 html+css
  15. use tools:overrideLibrary=xxx.xxx.xxxr to force usage 问题分析。
  16. 如何破解计算机拒绝访问u盘,高手应对U盘拒绝访问有绝招
  17. 机械键盘检测连击的软件
  18. 编码器知识汇总(增量式/绝对式/绝对值)
  19. 【Linux】raid管理工具-mdadm-raid0管理
  20. 微信开发sdk_二次开发微信API更新日志

热门文章

  1. 稚晖君软件硬件开发环境总结
  2. 技术书籍也香艳-时隔12年《Head First设计模式》第二版要来了
  3. 通信原理 | 信道的概念和实际信道
  4. 高性能MySQL(呕心沥血整理万字长文)
  5. 基于javaweb的在线购书商城系统(java+jsp+mysql+servlert+ajax)
  6. 从零开始打造自己的PHP框架——第3章
  7. 【Software】动软代码生成器
  8. 华硕笔记本触摸板失灵
  9. php期末考卷,php试卷B高质量含答案
  10. 耳机煲机软件测试自学,耳机煲机工具Test Tone Generator蹂躏新耳机教程