遗传算法的Python实现

  • 一.手工实现
    • 1.导入依赖库
    • 2.定义全局变量
    • 3.定义遗传算法核心函数
    • 4.开始拟合
    • 5.思考
  • 二.使用第三方库
  • 三.总结

一.手工实现

1.导入依赖库

import numpy as np

2.定义全局变量

pop_size = 10  # 种群数量
PC=0.6 # 交叉概率
PM=0.01 #变异概率
X_max=5    #最大值
X_min=0     #最小值
DNA_SIZE=10  #DNA长度与保留位数有关,2**10 当前保留3位小数点
N_GENERATIONS=1000

3.定义遗传算法核心函数

a.目标函数

"""
求解的目标表达式为:
y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x)
x=[0,5]
"""
def aim(x):return 10*np.sin(5*x)+7*np.cos(4*x)

b.解码函数

def decode(pop):return   pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) *(X_max-X_min)/ float(2**DNA_SIZE-1) +X_min

我们的种群采取二进制的编码方式,通过这个函数将二进制解码为【X_min,X_max】之间的数。
公式可参考:

c.适应度计算函数

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

一般来说,如果拟合在x的定义域内值域为非负的函可以直接将aim函数作为适应度函数,但是这里我们要拟合的函数包含负数情况,故我们要对其处理变为非负。

d.自然选择函数(轮盘赌)

def select(pop, fitness):           # print(abs(fitness))# print(fitness.sum())idx = np.random.choice(np.arange(pop_size), size=pop_size, replace=True,p=fitness/fitness.sum())# print(idx)return pop[idx]

轮盘赌算法是比较常用的算法,直白点就是撞大运,适应度高的个体有更大的几率被选择

假设我们初始4个个体,通过这个函数,我们从4个初始个体中按照权重选择了4个个体


虽然我们的个体总量没有发生变化,但适应度高的个体被更多的保留了下来,迭代下去,我们就会得到所谓的纯种个体组成的种群。可是我们并不想要纯种个体,我们想到适应度最高的个体,而纯种个体并不是最优个体,所以我们需要让他们交配。

e.交叉函数

def change(parent, pop):if np.random.rand() < PC:    #交叉i_ = np.random.randint(0, pop_size, size=1)# print(parent)cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool)# print(np.where(cross_points==True))# print(cross_points)parent[cross_points] = pop[i_, cross_points]# print(parent)return parent

我们之所以选择二进制的形式编码,就是因为二进制编码可以很好地模拟染色体的交叉。
即又0——>1,1——>0。但是在一个较小的种群中交配,就是我们所说的近亲间的结婚,子代会有可能继承父代的缺点,所以需要变异。

f.变异函数

def variation(child,pm):                  #变异for point in range(DNA_SIZE):if np.random.rand() < pm:child[point] = 1 if child[point] == 0 else 0# print(child)return child

至此,遗传算法的全部过程已经结束,不难看出,遗传算法最精髓最重要的地方,便是随机性,虽然每一步操作都充满了随机性,可最终我们仍然会得到最优个体,这是遗传算法的魅力,也是大自然设计的魅力。

4.开始拟合

pop = np.random.randint(2, size=(pop_size, DNA_SIZE))# print(pop)
for i in range(N_GENERATIONS):#解码# print(pop)X_value= decode(pop)#获取目标函数值F_values = aim(X_value)#获取适应值fitness = fitnessget(F_values)# print(fitness)if(i==0):max=np.max(F_values)max_DNA = pop[np.argmax(F_values), :]if(max<np.max(F_values)):max=np.max(F_values)max_DNA=pop[np.argmax(F_values), :]if (i % 10 == 0):print("Most fitted value and X: \n",np.max(F_values), decode(pop[np.argmax(F_values), :]))#选择pop = select(pop,fitness)# print(pop)pop_copy = pop.copy()# print(pop_copy)for parent in pop:# print(parent)child = change(parent,pop_copy)child = variation(child,PM)# print(child)parent[:] = child
print("目标函数最大值为:",max)
print("其DNA值为:",max_DNA)
print("其X值为:",decode(max_DNA))

理解了算法的本质后,再看代码自然不会有太大的难度,这里不过多解释了

5.思考

在前面的实现中,我侧重了染色体的交叉,得到了一个不错的结果,如果我们修改全局变量

pop_size = 50  # 种群数量
PC=0.01 # 交叉概率
PM=0.99 #变异概率
X_max=5    #最大值
X_min=0     #最小值
DNA_SIZE=10  #DNA长度与保留位数有关,2**10 当前保留3位小数点
N_GENERATIONS=1000

即完全依靠变异来进化,也是可以获得很好的结果的呢,这充分说明了遗传算法的核心便是随机!

二.使用第三方库

pip install scikit-opt

这是个功能很强大效果很好的进化算法的第三方库官方文档,大家自行参考官方源码
这里给出最简单的实现

import numpy as np
def schaffer(p):'''This function has plenty of local minimum, with strong shocksglobal minimum at (0,0) with value 0'''x= p[0]return 5*np.sin(np.log(x))from sko.GA import GA
ga = GA(func=schaffer, n_dim=1, size_pop=100, max_iter=800,
lb=0, ub=10, precision=1e-7)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
import pandas as pd
import matplotlib.pyplot as plt
x = np.arange(0,10,0.01)
y = 5*np.sin(np.log(x))
plt.plot(x,y)
plt.show()



短短20行代码便能实现~

三.总结

进化计算的算法熟练后可以运用到设置深度学习网络的参数,进化计算还有很大的发展空间。

遗传算法的Python实现(通俗易懂)相关推荐

  1. 小白易懂的遗传算法(Python代码实现)

    无约束的遗传算法(最简单的) 最开始真正理解遗传算法,是通过这个博主的讲解,安利给小白们看一看,遗传算法的Python实现(通俗易懂),我觉得博主写的让人特别容易理解,关键是代码也不报错,然后我就照着 ...

  2. 遗传算法介绍和遗传算法的python实现

    遗传算法劫介绍和遗传算法的python实现 文章目录: Reference: 1.https://morvanzhou.github.io/tutorials/machine-learning/evo ...

  3. 遗传算法(python版)

    遗传算法(python版) 1.基本概念 遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的"适者生存,优胜劣汰"基本法则的智能搜索算法.该法则很好地诠释了生物进 ...

  4. python 求函数最大值_遗传算法与Python图解

    import matplotlib.pyplot as plt import numpy as np import random import pandas as pd 遗传算法求函数最值 遗传算法的 ...

  5. python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章

    遗传算法是一种智能优化算法,通常用于求解复杂的数学问题.相比于传统方法,遗传算法摒弃了盲目的穷举或完全随机的求解策略,借鉴了自然界优胜劣汰.自然进化的思想,快速逼近最优解.上文对遗传算法的基本内容进行 ...

  6. 优化算法(二)遗传算法及python实现

    文章目录 1. 基本原理 1.1 生物启示 1.2 基本思想 1.3 组成要素 1.3.1 编码方式 1.3.2 适应度函数 1.3.3 选择方式 1.3.4 交叉和变异 1.3.5 算法终止方式 1 ...

  7. 遗传算法(python实现,虚拟机中运行)

    目录 (一)问题 (二)代码 (三)运行结果 ​(四)结果描述 (一)问题 遗传算法求解正方形拼图游戏 (二)代码 #!/usr/bin/env python # -*- coding: utf-8 ...

  8. 遗传算法及Python代码实现、图解

    目录 前言: 一.遗传算法(Genetic Algorithm, GA)简介 二.遗传算法基本概念 二(1)目标函数--环境 二(2)一组解,最优解--种群,最适宜种群 二(3)解,编码--个体,基因 ...

  9. 遗传算法及python实现

    目录 一.遗传算法概念 二.遗传算法应用实例 基础概念: 1.种群和个体: 2.编码.解码与染色体: 3.适应度和选择: 4. 交叉.变异: 三.遗传算法python完整代码 "适者生存,不 ...

  10. 初探----python封装通俗易懂的数据库增、删、改、查方法

    既然我们都已经会在cmd中操作数据库,那么为什么还要用python连接mysql呢?这里就涉及到接口自动化,因为我们做接口自动化避免不了需要连接数据库做一些数据库的查询,这些操作都是需要我们来连接数据 ...

最新文章

  1. C语言初步学习(适合与学习过C++和java的童鞋)
  2. ptrace原理与性能对比
  3. ubuntu下php服务器搭建_Ubuntu服务器下搭建php运行环境的方法
  4. 如何防止同一账号多次登录
  5. .dex文件结构学习笔记(4)
  6. 使左对角线和右对角线上的元素为0
  7. mysql触发器如何获取当前表名_MCGS pro组态环境下,如何获取当前用户名,在画面上显示?...
  8. HTML5---新增客户端储存
  9. ltp-ddt的makefile结构
  10. 如何设计实现一个证书加密签名工具包-极客大学架构师训练营(架构师 黄燧)
  11. 兴奋!北大嵩天教授Python零基础入门教程全套,可以下载啦
  12. oracle去除字段值的所有英文
  13. CSS基础教程 -- 媒体查询屏幕适配
  14. 快速处理倒车影像的设计研究与实现
  15. 如何完整删除Windows.old(详细教程)
  16. 关于开源云计算平台软件的一些个人想法
  17. win10命令提示符怎么打开_技巧,win10蓝屏SYSTEM_PTE_MISUSE怎么解决
  18. 马云:让员工家属走进阿里巴巴
  19. 计算机会计试题原型法的优缺点,计算机会计学综合复习资料.doc
  20. android循环遍历assert,AppCrawler自动遍历工具

热门文章

  1. SQL Server2016的彻底删除
  2. 清理autodesk产品注册表_AUTODESK 卸载工具,完美彻底卸载清除干净autodesk各种软件残留注册表和文件...
  3. IDEA导入MySQL驱动包(Mac版)
  4. MyBatis3详细教程-从入门到精通
  5. 【机器学习-周志华】学习笔记-第九章
  6. 带自动定位的水印相机_水印相机自动定位应该如何设置
  7. linux模拟发包工具,linux发包软件-线不是一个压力测试工具的linux以上收缩服务器可...
  8. Delphi2010的组件/控件
  9. linux amd64目录,创建基于amd64的qqforlinux的deb包
  10. linux从入门到精通 第2版 pdf