独白

  最近了解到一种算法叫遗传算法,对其比较感兴趣,研究了一下,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解

----->>载自百度百科

  自己研究了下,部分代码以及部分函数的功能暂未弄清楚。仍正在努力学习当中。附上一组代码,利用遗传算法匹配一组密码,最后达到正确输出密码的案例。代码如下:

import numpy as np

class GeneticAlgorithm(object):
"""遗传算法""" def __init__(self, cross_rate, mutation_rate, n_population, n_iterations, password):
self.cross_rate = cross_rate # 交叉可能性
self.mutate_rate = mutation_rate # 变异的可能性
self.n_population = n_population # 种群的大小
self.n_iterations = n_iterations # 迭代次数
self.password = password # 要破解的密码
self.password_size = len(self.password) # 要破解密码的长度
self.password_ascii = np.fromstring(self.password, dtype=np.uint8) # 将password转换成ASCII.
self.ascii_bounder = [32, 126+1] # 初始化一个种群
def init_population(self): population = np.random.randint(low=self.ascii_bounder[0], high=self.ascii_bounder[1],
size=(self.n_population, self.password_size)).astype(np.int8)
return population # 将个体的DNA转换成ASCII
def translateDNA(self, DNA):
return DNA.tostring().decode('ascii') # 计算种群中每个个体的适应度,适应度越高,说明该个体的基因越好
def fitness(self, population):
# self.password_ascii 是一个列表
match_num = (population == self.password_ascii).sum(axis=1)
# print(match_num)
return match_num # 对种群按照其适应度进行采样,这样适应度高的个体就会以更高的概率被选择
def select(self, population):
# 1e-4 = 0.0001 为数组添加小数
fitness = self.fitness(population) + 1e-4 # add a small amount to avoid all zero fitness
idx = np.random.choice(np.arange(self.n_population), size=self.n_population, replace=True, p=fitness/fitness.sum())
return population[idx] # 进行交配
def create_child(self, parent, pop):
if np.random.rand() < self.cross_rate:
index = np.random.randint(0, self.n_population, size=1)
cross_points = np.random.randint(0, 2, self.password_size).astype(np.bool)
parent[cross_points] = pop[index, cross_points]
return parent # 基因突变
def mutate_child(self, child):
for point in range(self.password_size): if np.random.rand() < self.mutate_rate:
child[point] = np.random.randint(*self.ascii_bounder) # choose a random ASCII index
return child # 进化
def evolution(self):
population = self.init_population()
for i in range(self.n_iterations):
fitness = self.fitness(population)
best_person = population[np.argmax(fitness)]
best_person_ascii = self.translateDNA(best_person) if i % 10 == 0:
print(u'第%-4d次进化后, 基因最好的个体(与欲破解的密码最接近)是: \t %s'% (i, best_person_ascii)) if best_person_ascii == self.password:
print(u'第%-4d次进化后, 找到了密码: \t %s'% (i, best_person_ascii))
break population = self.select(population)
population_copy = population.copy() for parent in population:
child = self.create_child(parent, population_copy)
child = self.mutate_child(child)
parent[:] = child population = population def main():
password = 'I have a dream!' # 要破解的密码 ga = GeneticAlgorithm(cross_rate=0.8, mutation_rate=0.01, n_population=300, n_iterations=500, password=password) ga.evolution() if __name__ == '__main__':
main()

在路上---学习篇(一)Python 数据结构和算法 (6)基于GA(遗传)算法的小案例的更多相关文章

  1. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  2. Python数据结构与算法设计(总结篇)

    的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Pytho ...

  3. Python学习【第2篇】:Python数据结构

    Python数据结构 1.数字类型 2.字符串 3.列表 4.元组 5.字典 6.集合

  4. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  5. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  6. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  7. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  8. Python学习【第一篇】Python简介

    Python简介 Python前世今生 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编 ...

  9. Python学习之路【第一篇】-Python简介和基础入门

    1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...

  10. python学习【第一篇】python介绍

    python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受 ...

随机推荐

  1. python-gitlab 一个简单demo

    背景 需要收集git仓库信息到数据库供前端展示 包括:仓库信息.仓库所有者.成员列表.提交信息.活跃情况等 需要定时启动.灵活触发 实现简介 使用gitlab v4 restful 接口 使用pyth ...

  2. 基于Go编写一个可视化Navicat本地密码解析器

    前提 开发小组在测试环境基于docker构建和迁移一个MySQL8.x实例,过程中大意没有记录对应的用户密码,然后发现某开发同事本地Navicat记录了根用户,于是搜索是否能够反解析Navicat中的 ...

  3. java入门2..0

    java的运行原理 1.在本地磁盘中创建一个文本文件为Demo.java的源文件 2.在源文件中编写java代码如下: public class Demo public static void ,ma ...

  4. Ubuntu安装后续工作

    更新源: sudo gedit /etc/apt/sources.list 清华的源 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial ma ...

  5. IE浏览器不支持TextDecoder()的问题

    IE浏览器不支持TextDecoder()方法,因此在进行Arrbuffer转string或中文时,出现未定义的错误.通过网上查找方法,可以通过引用第三方库进行解决. github地址:https:/ ...

  6. 大规模 IoT 边缘容器集群管理的几种架构-6-个人体验及推荐

    前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s 大规模 IoT 边缘容器集群管理的几种架构-2-H ...

  7. RocketMQ系列(一) 基本介绍

    RocketMQ系列(一) 基本介绍 1.MQ 作用 MQ 的应用场景主要包含以下 3 个方面: 1.1.异步与解耦 当我们下了一个订单之后,订单服务会进行 RPC 同步调用 支付服务.库存服务.物流 ...

  8. 揭秘ChatGPT,如何打造自己的自定义指令

    一.ChatGPT-0720更新 又在深夜,正要打开ChatGPT官网测试下pdf对话功能,发现ChatGPT又有更新.本次更新总结有2点: 1.对于Plus用户,GPT-4的使用限额从25条/3h提 ...

  9. MQTT vs. XMPP,哪一个才是IoT通讯协议的正解

    MQTT vs. XMPP,哪一个才是IoT通讯协议的正解 这是个有趣的话题! 先来聊几个小故事. 关于我和MQTT 我在人生第一个IoT项目里,第一次接触到MQTT协议. 我很快就理解了这个协议.因 ...

  10. RocketMQ 系列(三) 集成 SpringBoot

    RocketMQ 系列(三) 集成 SpringBoot 前两篇文章介绍了 RocketMQ 基本概念与搭建,现在以它与 SpringBoot 的结合来介绍其基本的用法. RocketMQ系列(一) ...