遗传算法python实现_Python遗传算法代码实例讲解

目录

实例:

求解函数的最大值y=xsin(10x)+xsin(2x),自变量取值:0--5,用Python画出的图像如下

(注:此代码好像有一些感觉不对的地方,首先:没有保留那些适应度低的个体

pop = select(pop, fitness) '''这一行代码,压根就是把适应度低的个体给干没了。'''

for parent in pop:

child = crossover(parent, pop_copy)

child = mutate(child)

parent[:] = child '''这个for循环,没有对交叉变异后的个体进行适应度筛选啊'''

)

代码讲解:

'''

1初始化种群:返回一个元素为 二进制的矩阵,每一行代表一个个体,每个个体由二进制数字表示x值

2:代表二进制,POP_SIZE:矩阵行数,DNA_SIZE:矩阵列数。

'''

pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))

'''

2,计算适应度并且原则优良种群,(有放回的抽取),循环很多代

pop:代表二进制种群,translateDNA(pop):将其转化十进制,在计算适应度,在select选择优良种群

'''

F_values = F(translateDNA(pop)) #求函数值

fitness = get_fitness(F_values) #得到使用度,这里例子函数值就是适应度

pop = select(pop, fitness)

#此时的pop是经过筛选的好的总群,也是一个二进制表现方式,里面有很多一样的个体,因为使用放回抓取

'''

3,经过一波筛选后,接下来该交叉变异了,为了得到更好的x值,因为初始化的x值使得个体分布不均匀

'''

pop_copy = pop.copy() #复制一份优良种群,用于交叉变异

for parent in pop:

child = crossover(parent, pop_copy) #交叉

child = mutate(child) #交叉后的种群在进行变异

parent[:] = child

#将child赋值给parent

难度较大的代码:

crossover() mutate() parent[:] = child

'''

crossover

交叉:parent:表示每一个二进制个体,pop:优良的种群,如100个个体

返回交叉后的一个个体,也是二进制表示方式

这个函数的功能就是

parent[cross_points] = pop[i_, cross_points]

'''

def crossover(parent, pop): # mating process (genes crossover)

if np.random.rand() < CROSS_RATE:

i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from pop

# 从0-POP_SIZE,随机选择一个数字,

cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool)

#array([ True, False, False, True, True, False, False, True, True,

#True])

#随机生成一个10个元素的数组,元素为0和1,在转化成bool型

# choose crossover points

parent[cross_points] = pop[i_, cross_points]

#这个语句有难度:

'''

将parent为True的元素,将被改变,False的元素不变.将被改变的元素改变成 pop矩阵第 i_ 行里面被选择为true的元素,

注意,parent的是cross_points, pop 也是cross_points,必须保持一致,才可以实现交叉生成一个新的个体,这个个体是父母基因的交叉结果

'''

# mating and produce one child

return parent #将新个体返回出去

'''

变异:将交叉后得到的个体,(这个个体不一定就是好的个体,很可能是不好的适应度不高的个体)

进行变异,

核心代码:

child[point] = 1 if child[point] == 0 else 0

'''

def mutate(child):

for point in range(DNA_SIZE):

if np.random.rand() < MUTATION_RATE:

child[point] = 1 if child[point] == 0 else 0

'''

point是把child这个个体基因遍历一遍,按照几率进行将0变成1,

注意:并不是将所有的0变成1,而是有几率的 if np.random.rand() < MUTATION_RATE:

'''

return child

全部代码:

"""

Visualize Genetic Algorithm to find a maximum point in a function.

Visit my tutorial website for more: https://morvanzhou.github.io/tutorials/

"""

import numpy as np

import matplotlib.pyplot as plt

DNA_SIZE = 10 # DNA length

POP_SIZE = 100 # population size

CROSS_RATE = 0.8 # mating probability (DNA crossover)

MUTATION_RATE = 0.003 # mutation probability

N_GENERATIONS = 200

X_BOUND = [0, 5] # x upper and lower bounds

def F(x): return np.sin(10*x)*x + np.cos(2*x)*x # to find the maximum of this function

# find non-zero fitness for selection

def get_fitness(pred): return pred + 1e-3 - np.min(pred)

# convert binary DNA to decimal and normalize it to a range(0, 5)

def translateDNA(pop): return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * X_BOUND[1]

def select(pop, fitness): # nature selection wrt pop's fitness

idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,

p=fitness/fitness.sum())

return pop[idx]

def crossover(parent, pop): # mating process (genes crossover)

if np.random.rand() < CROSS_RATE:

i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from pop

cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) # choose crossover points

parent[cross_points] = pop[i_, cross_points] # mating and produce one child

return parent

def mutate(child):

for point in range(DNA_SIZE):

if np.random.rand() < MUTATION_RATE:

child[point] = 1 if child[point] == 0 else 0

return child

pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # initialize the pop DNA

plt.ion() # something about plotting

x = np.linspace(*X_BOUND, 200)

plt.plot(x, F(x))

for _ in range(N_GENERATIONS):

F_values = F(translateDNA(pop)) # compute function value by extracting DNA

# something about plotting

if 'sca' in globals(): sca.remove()

sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5); plt.pause(0.05)

# GA part (evolution)

fitness = get_fitness(F_values)

print("Most fitted DNA: ", pop[np.argmax(fitness), :])

pop = select(pop, fitness)

pop_copy = pop.copy()

for parent in pop:

child = crossover(parent, pop_copy)

child = mutate(child)

parent[:] = child # parent is replaced by its child

plt.ioff(); plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java对象数组

java对象数组 /*** 对象数组*/ public class TestArray {public static void main(String[] args) {//定义一个数组&#xff0c;存储4个分数&#xff0c;并遍历int[] arr;arr new int[4];arr[0] 90;arr[1] 80;arr[2] 100;arr[3] 54;for (int score:arr){System.out.print…

python删除列表元素的所有方法_python 列表删除所有指定元素的方法

python 列表删除所有指定元素的方法如下所示&#xff1a;a [1,1,1,2,3,45,1,2,1]a.remove(1)result: [1,1,2,3,45,1,2,1]while 1 in a:a.remove(1)result: [2,3,45,2]以上这篇python 列表删除所有指定元素的方法就是小编分享给大家的全部内容了&#xff0c;希望能给大家一个参…

引用数据类型的方法调用

引用数据类型的方法调用 /*** 引用数据类型的方法调用*/ public class TestRefArgs{public static void main(String[] args) {Point p new Point();p.x 10;p.y 20;System.out.println("交换前的值&#xff1a;"p.x"\t"p.y);swap(p);System.out.printl…

python给js变量赋值_python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)...

11.4 JavaScript11.41 变量1、声明变量的语法//1. 先声明后定义var name; //声明变量时无需指定类型&#xff0c;变量name可以接受任意类型name "egon";​//2. 声明立刻定义var age 18;2、变量名命名规范1、由字母、数字、下划线、$ 组成,但是不能数字开头&#xff…

java this关键字的使用

java this关键字的使用 /*** this关键字的使用*/ public class Student {//成员变量private int sno; //学号private String name; //姓名private String sex; //性别private double score; //分数//构造方法public Student(){}public Student(int sno,String nam…

MySQL随手笔记

MySQL随手笔记 1、char varchar 是字符的个数&#xff0c;不是字节的个数&#xff0c;可以使用binary&#xff0c;varbinary表 示定长和不定长的字节个数。2、int 宽度是显示宽度&#xff0c;如果超过&#xff0c;可以自动增大宽度&#xff0c;int 底层都是4个字节3、如何写入…

使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错的问题

目录 1、问题说明 2、问题分析思路 3、问题分析过程 3.1、使用Dependency Walker打开软件主程序&#xff0c;查看库与库的依赖关系&#xff0c;找出出问题的库 3.2、使用PE工具查看dll库的时间戳 3.3、解决办法 4、最后 VC常用功能开发汇总&#xff08;专栏文章列表&…

关联的两个字段度需要建立索引吗_索引那些事儿

最近的工作中进行了几个SQL优化,对索引也有了一些新的认识。 什么是索引?百度百科是这么说的: 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据…

MySQL添加、更新、删除数据

MySQL添加、更新、删除数据 1、查询数据 select * from student; 2、添加数据 insert into student values(1,"张三","男",23,1999-12-23,Java001,zhangsanqq.com); 可以添加两条相同的数据&#xff0c;因为没有创建相应的约束constraint insert into…

登陆 manager app显示不是私密链接_小米上线了一款靠指静脉识别开锁的私密箱,打造你的私人存储空间...

印象中的保险箱体积大、价格昂贵、开锁繁琐&#xff0c;一直都认为那是企业老板、成功人士的标配&#xff0c;对于普通家庭来说存在的价值、或实用性方面并不是很高。往常遇到长时间外出旅行&#xff0c;也会担心家里重要的证件、首饰等贵重物品的安全&#xff0c;老婆选择寄存…

MySQL修改、删除表的结构

MySQL修改、删除表的结构 1、增加一列 alter table student add score double(3,1); 说明 double&#xff08;3,1&#xff09;指数据是三位&#xff0c;小数部分占一位&#xff0c;整数部分占两位&#xff0c;默认最后一列 alter table student add score double (5,2) fi…

python优化网站_[练习] 用PYTHON来优化网站中的图片

我到公司以来&#xff0c;第一次加班&#xff0c;哇&#xff0c;加一晚上加一上午&#xff0c;现在还没下班的迹象&#xff0c;555,困。对于网站中的一些关键的页面&#xff0c;多重缓存、静态化、程序代码优化……之外&#xff0c;为了提高用户打开页面的速度&#xff0c;图片…

MySQL表级完整性约束

MySQL表级完整性约束 为防止不符合规范的数据存入数据库&#xff0c;在用户对数据进行插入、修改、删除等操作时&#xff0c;MySQL提供 了一种机制来检查数据库是否满足规定的条件&#xff0c;以保证数据库中数据的准确性和一致性&#xff0c;这种机制 就是完整性约束。MySQL中…

php redis 投票_高性能Redis服务架构分析与搭建

基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了&#xff0c;我们经常在业务中用其存储用户登陆态(Session存储)&#xff0c;加速一些热数据的查询(相比较mysql而言&#xff0c;速度有数量级的提升)&#xff0c;做简单的消息队列(LPUSH和BRPOP)、订阅发…

MySQL表的非外键约束

MySQL表的非外键约束 /* 建立一张用来存储学生信息的表 字段包含学号、姓名、性别&#xff0c;年龄、入学日期、班级&#xff0c;email等信息 学号是主键 不能为空 ? 唯一 姓名不能为空 性别默认值是男 &#xff0c;只能取值男、女 年龄&#xff1a;18---50 Email唯一 *…

go调用python3_在python3中使用google的protobuf以及gRPC-Go语言中文社区

下载源代码&#xff1a;地址安装proto#下载&#xff1a;protoc-3.9.1-linux-x86_64.zipunzip protoc-3.9.1-linux-x86_64.zip -d protoc-3.9.1-linux-x86_64 # 解压mv protoc-3.9.1-linux-x86_64 /usr/local/protoc # 移动ln -s /usr/local/protoc/bin/protoc /usr/bin/protoc …

static变量 java

static 变量java static 是java中的一个关键字&#xff0c;单词本身是静态的含义。一个类的成员包含变量、方法、构造方法 、代码块和内部类&#xff0c;static可以修饰除了构造方法以外的所有成员使用static修饰的成员称为静态成员&#xff0c;是属于某个类的&#xff1b;而不…

java static方法

static方法 1、static方法的作用访问static变量和static方法2、static方法的调用方式通过类名调用、通过对象名来访问3、不可以静态方法中不可以访问非静态变量 静态方法中不可以访问非静态方法 静态方法中不可以访问this原因&#xff1a;加载类的时候就加载静态变量和静态方法…

保存验证码的方法_selenium自动化测试:6.验证码处理

0.前言如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负众望。谢谢&#xff01;&#xff01;&#xff01;1.前提基…

非root用户组启动sftp_如何在 Debian 10 中配置 Chroot 环境的 SFTP 服务 | Linux 中国

SFTP 是最常用的用于通过 ssh 将文件从本地系统安全地传输到远程服务器的方法https://linux.cn/article-12186-1.html作者&#xff1a;Pradeep Kumar译者&#xff1a;郑SFTP 意思是“安全文件传输协议(Secure File Transfer Protocol)” 或 “SSH 文件传输协议(SSH File Transf…