遗传算法及Python实现

news2025/2/27 19:48:10

0 建议学时

4学时

1 人工智能概述

2020中国人工智能产业年会在苏州召开,会上发布的《中国人工智能发展报告2020》显示,过去十年(2011-2020) ,中国人工智能专利申请量达389571件,占全球总量的74.7%,位居世界第一
报告指出,中国在自然语言处理、芯片技术、机器学习等10多个人工智能子领域的科研产出水平居于世界前列
在这里插入图片描述
人工智能被认为是二十一世纪三大尖端技术(基因工程、纳米科学、人工智能)之一。
人工智能的基石是数学,而这些数学算法的实现是由一个一个的函数组合得来。比如,我们计算 sin ⁡ ( π h r 2 ) \sin (\pi hr^2) sin(πhr2) 可以得到圆柱体的体积的正弦值。对于前述公式,我们就可以将其分解为3个简单的乘法和一个正弦函数。在编程语言中,我们也把这些函数称为方法。目前流行的人工神经网络,实际上就是由几百甚至几千个方法构成。通过定义方法不仅可以实现简单的数学公式,还可以实现一些无法用数学公式描述的算法,如遗传算法。人工智能的三大要素:

  • 数据
  • 算法
  • 算力

2 遗传算法

一种通过模拟自然进化过程搜索最优解的方法。遗传算法是一种仿生算法,最主要的思想是物竞天择,适者生存。这个算法很好的模拟了生物的进化过程,保留好的物种,同样一个物种中的佼佼者才会幸运的存活下来。转换到数学问题中,这个思想就可以很好的转化为优化问题,在求解方程组的时候,好的解视为好的物种被保留,坏的解视为坏的物种而淘汰,设置好进化次数以后开始迭代,记录下这些解里面最好的那个,就是要求解的方程组的解。

遗传算法是类比自然界的达尔文进化实现的简化版本。
达尔文进化论的原理概括总结如下:

  • 变异:种群中单个样本的特征(性状,属性)可能会有所不同,这导致了样本彼此之间有一定程度的差异;
  • 遗传:某些特征可以遗传给其后代。导致后代与双亲样本具有一定程度的相似性;
  • 选择:种群通常在给定的环境中争夺资源。更适应环境的个体在生存方面更具优势,因此会产生更多的后代。

2.1 基本概念

2.1.1 基因和染色体

在这里插入图片描述
在遗传算法中,我们首先需要将要解决的问题映射成一个数学问题,也就是所谓的“数学建模”,那么这个问题的一个可行解即被称为一条“染色体”。一个可行解一般由多个元素构成,那么这每一个元素就被称为染色体上的一个“基因”。
比如说,对于如下函数而言,[1,2,3]、[1,3,2]、[3,2,1]均是这个函数的可行解(代进去成立即为可行解),那么这些可行解在遗传算法中均被称为染色体。
3 x + 4 y + 5 z < 100 3x+4y+5z<100 3x+4y+5z<100
这些可行解一共有三个元素构成,那么在遗传算法中,每个元素就被称为组成染色体的一个基因。
在这里插入图片描述

2.1.2 适应度函数

在自然界中,似乎存在着一个上帝,它能够选择出每一代中比较优良的个体,而淘汰一些环境适应度较差的个人。那么在遗传算法中,如何衡量染色体的优劣呢?这就是由适应度函数完成的。适应度函数在遗传算法中扮演者这个“上帝”的角色。

遗传算法在运行的过程中会进行N次迭代,每次迭代都会生成若干条染色体。适应度函数会给本次迭代中生成的所有染色体打个分,来评判这些染色体的适应度,然后将适应度较低的染色体淘汰掉,只保留适应度较高的染色体,从而经过若干次迭代后染色体的质量将越来越优良。

2.1.3 交叉

遗传算法每一次迭代都会生成N条染色体,在遗传算法中,这每一次迭代就被称为一次“进化”。那么,每次进化新生成的染色体是如何而来的呢?——答案就是“交叉”,你可以把它理解为交配。

交叉的过程需要从上一代的染色体中寻找两条染色体,一条是爸爸,一条是妈妈。然后将这两条染色体的某一个位置切断,并拼接在一起,从而生成一条新的染色体。这条新染色体上即包含了一定数量的爸爸的基因,也包含了一定数量的妈妈的基因。
在这里插入图片描述
那么,如何从上一代染色体中选出爸爸和妈妈的基因呢?这不是随机选择的,一般是通过轮盘赌算法完成。

在每完成一次进化后,都要计算每一条染色体的适应度,然后采用如下公式计算每一条染色体的适应度概率。那么在进行交叉过程时,就需要根据这个概率来选择父母染色体。适应度比较大的染色体被选中的概率就越高。这也就是为什么遗传算法能保留优良基因的原因。

染色体i被选择的概率 = 染色体i的适应度 / 所有染色体的适应度之和

2.1.4 变异

交叉能保证每次进化留下优良的基因,但它仅仅是对原有的结果集进行选择,基因还是那么几个,只不过交换了他们的组合顺序。这只能保证经过N次进化后,计算结果更接近于局部最优解,而永远没办法达到全局最优解,为了解决这一个问题,我们需要引入变异。

变异很好理解。当我们通过交叉生成了一条新的染色体后,需要在新染色体上随机选择若干个基因,然后随机修改基因的值,从而给现有的染色体引入了新的基因,突破了当前搜索的限制,更有利于算法寻找到全局最优解。
在这里插入图片描述

2.1.5 复制

每次进化中,为了保留上一代优良的染色体,需要将上一代中适应度最高的几条染色体直接原封不动地复制给下一代。
假设每次进化都需生成 N N N条染色体,那么每次进化中,通过交叉方式需要生成 N − M N-M NM条染色体,剩余的 M M M条染色体通过复制上一代适应度最高的M条染色体而来。

2.2 通过例子说明进化过程

f ( x ) = x 2 − 19 x + 20 f(x)=x^2-19x+20 f(x)=x219x+20的最小值,其中 x = 1 , … , 64 x=1,…,64 x=1,64之间的整数。

2.2.1 第一轮

随机产生初始种群

在这里插入图片描述

交叉繁衍,变异

在这里插入图片描述

优胜劣汰

在这里插入图片描述
在这里插入图片描述

流程图

在这里插入图片描述

2.2.2 第二轮

交叉繁衍,变异

在这里插入图片描述
在这里插入图片描述

优胜劣汰

在这里插入图片描述
在这里插入图片描述

3 如何编写<遗传算法计算最小值>的程序?

根据流程图写出步骤,每个步骤标号:
在这里插入图片描述
细化所有的步骤,直到能和代码对应为止。
如何设计函数?哪些代码应该封装为函数?

3.1 基础知识回顾

  • 复习1:函数定义
def  fact(n):
   s = 1
   for i in range(1, n+1):
      s*= i
   return s
  • 复习2:函数调用
a=fact(5)
print(a)
  • 复习3:匿名函数
    在这里插入图片描述
sum = lambda a,b: a+b
printsum(1 , 3))   #调用函数打印其返回值

3.2 模块设计

在这里插入图片描述

3.3 核心代码

3.3.1 随机产生初始种群

lt=[21,42,8,57]

3.3.2 繁衍,交叉变异

在这里插入图片描述

# 繁衍,交换基因,x,y是数据,pos是从第几位开始交换
def exchange(x, y, pos):
    xstr = '{0:06b}'.format(x)  # 转换为6位二进制
    ystr = '{0:06b}'.format(y)  # 转换为6位二进制

    tempxstr = '0b' + xstr[:pos] + ystr[pos:]  # 临时存放
    tempystr = '0b' + ystr[:pos] + xstr[pos:]  # 临时存放

    return int(tempxstr, 2), int(tempystr, 2)  # 再转换为十进制

在这里插入图片描述

# 交叉变异
def mutate(x, pos):
    xstr = '{0:06b}'.format(x)  # 转换为6位二进制
    if xstr[pos] == '0':
        xstr = xstr[:pos] + '1' + xstr[pos + 1:]
    else:
        xstr = xstr[:pos] + '0' + xstr[pos + 1:]
    return int(xstr, 2)

3.3.3 总体代码

import random

# 交叉变异
def mutate(x, pos):
    xstr = '{0:06b}'.format(x)  # 转换为6位二进制
    if xstr[pos] == '0':
        xstr = xstr[:pos] + '1' + xstr[pos + 1:]
    else:
        xstr = xstr[:pos] + '0' + xstr[pos + 1:]
    return int(xstr, 2)


# 繁衍,交换基因,x,y是数据,pos是从第几位开始交换
def exchange(x, y, pos):
    xstr = '{0:06b}'.format(x)  # 转换为6位二进制
    ystr = '{0:06b}'.format(y)  # 转换为6位二进制

    tempxstr = '0b' + xstr[:pos] + ystr[pos:]  # 临时存放
    tempystr = '0b' + ystr[:pos] + xstr[pos:]  # 临时存放

    return int(tempxstr, 2), int(tempystr, 2)  # 再转换为十进制

lt=[21,42,8,57]
#lt=[1,2,3,4]
for gen in range(0,10):   #次数为代数
    son1,son2=exchange(lt[0],lt[1],3) #1、2号繁衍2个后代,加入lt
    lt.append(son1)
    lt.append(son2)
    son3,son4=exchange(lt[2],lt[3],3) #3、4号繁衍2个后代,加入lt
    lt.append(son3)
    lt.append(son4)
    son5=mutate(lt[2],random.randint(0,5))   #根据第3个父数据变异
    lt.append(son5)
    son6=mutate(lt[3],random.randint(0,5))   #根据第4个父数据变异
    lt.append(son6)

    lt=sorted(lt,key=lambda x:x*x-19*x+20)    #根据目标函数排序
    print("第{}代的种群为{}".format(gen+1,lt))
    ls=lt[:4]
    lt=ls

x=lt[0]
print("最小的X是{},对应的y值为{}".format(x,x*x-19*x+20))	

3.3.4 运行结果

在这里插入图片描述
第1代的种群为 [9, 8, 12, 21, 26, 37, 41, 42, 56, 57]
第2代的种群为 [9, 9, 8, 8, 8, 12, 5, 5, 21, 28]
第3代的种群为 [9, 9, 9, 9, 8, 8, 8, 8, 12, 24]
第4代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第5代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第6代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第7代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第8代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第9代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
第10代的种群为 [9, 9, 9, 9, 9, 9, 9, 9, 13, 25]
最小的X是9,对应的y值为-70

3.4 思考与拓展

3.4.1 初始种群的规模与生成规则

初始种群:1,2,3,4
第1代的种群为[7, 4, 4, 3, 3, 2, 2, 1, 1, 20]
第2代的种群为[7, 7, 4, 4, 4, 4, 3, 3, 0, 19]
第3代的种群为[7, 7, 7, 7, 4, 4, 4, 4, 0, 20]
第4代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第5代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第6代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第7代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第8代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第9代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
第10代的种群为[7, 7, 7, 7, 7, 7, 7, 7, 3, 23]
最小的X是7,对应的y值为-64

初始种群: 21 , 42 , 36 , 54 , 1 , 64 21,42,36,54,\color{red}{1,64} 21,42,36,54,1,64
第1代的种群为[9, 8, 12, 4, 15, 21, 26, 37, 41, 42, 52, 56, 57, 59, 63]
第2代的种群为[9, 9, 8, 8, 8, 12, 12, 5, 4, 15, 4, 17, 20, 21, 31]
第3代的种群为[9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 24]
第4代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 12, 13, 25]
第5代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
第6代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
第7代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
第8代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
第9代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
第10代的种群为[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 25]
最小的X是9,对应的y值为-70

3.4.2 遗传规则的设计:交叉、变异

采用随机数生成变异基因的位置
s = r a n d o m . r a n d i n t ( 0 , 5 ) \color{red}{\mathbf{s=random.randint(0,5)}} s=random.randint(0,5) #随机取0-5中任意数

#变异
def mutate(x):
    s=random.randint(0,5)    #随机取0-5中任意数
    fb='{0:06b}'.format(x)   #转换为6位二进制
    if fb[pos]=='0':
        sb=fb[:s] + '1' + fb[s+1:]
    else:
        sb=fb[:s] + '0' + fb[s+1:]
    return int(sb,2)

4 课后延伸

  1. 启发式算法还包含:蚁群算法、模拟退火算法等,调研这些算法,并撰写报告;
  2. 请编写遗传算法部分的总结报告,包含:
    (1)遗传算法的原理
    (2)遗传算法的流程
    (3)举一个计算实例说明其原理
    (4)如何编写遗传算法的代码
    (5)该算法的优缺点及如何改进

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

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

相关文章

Power BI 数据处理介绍(数据初始调整、合并列及查看数据结构)

本系列的文章&#xff1a; 安装流程和示例介绍&#xff1a; 《Power BI windows下载安装流程&#xff09;》《Power BI 11个必学官方示例数据案例&#xff08;附下载链接&#xff09;》 数据导入阶段介绍&#xff1a; 《Power BI 数据导入&#xff08;SQL Server、MySQL、网页…

1802908-00-4,Dde Biotin-PEG4-alkyne,炔烃PEG4生物素Dde

Dde Biotin-PEG4-alkyne&#xff0c;Alkyne-PEG4-Biotin Dde&#xff0c;Dde 生物素-PEG4-炔烃&#xff0c;Dde 生物素PEG4炔基&#xff0c;炔烃PEG4生物素DdeProduct structure&#xff1a;Product specifications&#xff1a;1.CAS No&#xff1a;1802908-00-42.Molecular fo…

leetcode 540. Single Element in a Sorted Array(排序数组中的单个元素)

给一个已经排好序的升序数组&#xff0c;其中每个元素都会重复2次&#xff0c;只有一个元素只有一个&#xff0c; 找出这个只有一个的元素。 要求时间复杂度在O(logn), 空间复杂度在O(1). 思路&#xff1a; 时间复杂度为O(logn), 让人想到了binary search. 因为时间复杂度为…

keil5安装了pack包但是还是不能选择device

一开始&#xff0c;我以为是keil5无法安装 STM32 芯片包&#xff0c;打开device倒是可以看到stm公司的芯片包&#xff0c;但是没有我想要的stm32f1。 我按照网上的一些说法&#xff0c;找到了这个STM32F1 的pack芯片包&#xff0c;但是我双击安装的时候&#xff0c;它的安装位…

(HP)新手引导使用react-shepherd

1&#xff0c;官方参数文档&#xff1a;https://shepherdjs.dev/docs/tutorial-02-usage.html 2&#xff0c;基本代码 import { ShepherdTour } from react-shepherd; import ./index.less; // 自己的样式文件&#xff0c;用来修改样式 import ./shepherd.less; // 将shephe…

嵌入式C语言自我修养:从芯片、编译器到操作系统-习题、笔记

前沿 C语言测试(1):基本概念考查 什么是标识符、关键字和预定义标识符? 三者有何区别? 标识符&#xff08;Identifier&#xff09;:由程序员定义&#xff0c;用来表示变量&#xff0c;包括了变量名、函数名、宏名、结构体名等。 标识符的命名规范&#xff1a;C语言规定&…

Android架构设计——【 APT技术实现butterknife框架 】

APT简介 APT英文全称&#xff1a;Android annotation process tool是一种处理注释的工具&#xff0c;它对源代码文件进行检测找出其中的Annotation&#xff0c;使用Annotation进行额外的处理。 Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文…

100种思维模型之启发式偏差思维模型-017

曾国藩在给儿子的一封家书中曾写道&#xff1a;余于凡事皆用困知勉行工夫&#xff0c;尔不可求名太骤&#xff0c;求效太捷也。熬过此关&#xff0c;便可少进。再进再困&#xff0c;再熬再奋&#xff0c;自有亨通精进之日。 不急躁不求捷径&#xff0c;小火慢炖&#xff0c;将事…

burp小程序抓包

身为一名码农&#xff0c;抓包肯定是一项必备技能。工作中遇到很多次需要对小程序进行抓包排查问题。下面分享一下我的抓包方式&#xff0c;使用的是电脑版小程序抓包&#xff0c;跟手机的方式都差不多的。 一、环境 微信版本&#xff1a;3.6.0.18 Burpsuite版本&#xff1a…

Python容器

容器 容器是一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素&#xff0c;每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素是否可以修改是否…

k8s1.17.2+centos7.7+docker18.06

1.简介 1.1pod网络 总述&#xff1a;Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中 Flannel&#xff1a;基于L2&#xff0c;构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。Calico&#xff1a;纯L3&#xff0c;构建用于各个pod通…

【Java基础】反射

概述 引入 package ref;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r…

VUCA项目环境中如何提升项目进度计划与控制工作有效性的系统思考【一杯咖啡谈项目】

VUCA环境下&#xff0c;项目进度延迟是经常遇见的问题&#xff0c;如何解决此类问题&#xff1f;今天分享一个案例&#xff0c;在这个案例中&#xff0c;基于“根因分析法”&#xff0c;对某主题客户端项目的进度延迟问题进行了分析&#xff0c;找到根本原因&#xff0c;提出了…

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头&#xff1a;图像数据头段&#xff1a;图像数据段&#xff1a;Ani动态光标格式解析数据结构&#xff1a;anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

2023年PMP考试复习攻略

如何备考PMP呢&#xff1f; 这本书是PMP认证考试的官方教材&#xff0c;体系完善&#xff0c;可以迅速帮助入门者搭建项目管理知识体系&#xff0c;备考PMP考试的伙伴&#xff0c;这本书一定要读一遍&#xff01; 经验都是积累出来的&#xff0c;交流小队里有很多分享面试经验…

Vue3 中生命周期的使用

目录前言&#xff1a;一、什么是生命周期函数二、什么是 Keep-Alive 组件三、生命周期函数分为几种&#xff0c;分别有什么用&#xff1f;1. beforeCreate2. created3. beforeMount/onBeforeMount4. mounted/onMounted5. beforeUpdate/onBeforeUpdate6. updated/onUpdated7. be…

spring之事务概述

文章目录前言一、事务概述1、什么是事务2、事务的四个处理过程3、事务的四个特性二、引入事务场景1、引入依赖2、数据库创建3、建包4、spring.xml配置文件5、测试程序6、运行结果&#xff08;成功&#xff09;7、模拟异常三、Spring对事务的支持1、Spring实现事务的两种方式2、…

数值方法笔记4:插值、近似和拟合

1. 插值1.1 插值的一些概念1.1.1 插值的定义1.1.2 插值的存在性1.1.3 插值的误差分析1.2 拉格朗日插值(Lagrange Interpolation)1.2.1 拉格朗日插值误差分析1.3 Newton多项式插值1.3.1 Newton多项式插值误差分析1.4 Chebyshev多项式确定插值点1.4.1 Chebyshev多项式性质1.5 有理…

Green Hills Software(GHS)的安装

Green Hills Software(GHS)简介 Green Hills Software(GHS)是美国Green Hills软件公司提供的一种具有调试、编译器和闪存编程工具的集成开发环境,是汽车电子行业常用且重要的开发环境之一。它支持的功能包括:AUTOSAR感知、项目构建器、代码覆盖、运行时错误检查、MISRA C…

【HEC-RAS水动力】HEC-RAS 1D基本原理(恒定流及非恒定流)

一、数据说明 HEC-RAS模型主要由工程文件 (.prj) 文 件 、 河道地形数据文件 ( .g01)、运行文件(p01)、非恒定流文件 ( .u01) 等部分组成。 1. 一般数据 在创建并保存project文件(*.prj)后,其他data文件均会自动以同样的名字保存,但采用不同的后缀来区分各类文件。 &qu…