热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法函数_阿里算法工程师也在用!遗传算法和Python实现函数优化

本文将向大家介绍遗传算法的工作原理,并将实现的遗传算法和功能进行优化。遗传算法是一种基于搜索的优化技术。它通常用于查找最佳或最接近的最佳解决方案。它是由约翰荷兰提出的

本文将向大家介绍遗传算法的工作原理,并将实现的遗传算法和功能进行优化。

0f783f09f296ddd5d7a52483bc005730.png

遗传算法是一种基于搜索的优化技术。它通常用于查找最佳或最接近的最佳解决方案。它是由约翰·荷兰提出的。基于达尔文的自然选择理论,在解释遗传算法的工作原理之前,让我先解释达尔文的自然选择理论。在他的理论中,他将自然选择定义为“保留(特质)每一个细微变化(如果有用)的原则”。这个概念很简单但是很强大:最适合自己环境的个体更有可能生存和繁殖。有时将此理论描述为“适者生存”。那些比其他人更优秀的人有机会在这种进化中生存。遗传算法就是关于此的。它模仿自然选择的过程以找到最佳解决方案。

在遗传学中,我们将使用一些生物学术语,例如种群,染色体,基因,选择,交叉,突变。现在,首先,让我们尝试了解这些术语的含义。

人口,染色体,基因

在此过程的开始,我们需要初始化一些可能的解决方案。人口是给定问题的所有可能解决方案的子集。换句话说,我们可以说种群是一组染色体。染色体是解决当前问题的一种方法。每个染色体都是一组基因。

为简单起见,我们可以将染色体描述为字符串。因此,可以说总体是某个字符串的集合(每个字符都是二进制值,0或1)。字符串的每个字符都是一个基因。

9b6bc8a666b235bc405fb1205afa4a39.png

为了开始遗传算法的过程,我们首先需要初始化种群。我们可以通过两种方式初始化总体。第一个是随机的,第二个是启发式的。最好从随机种群开始算法。

健身功能

初始化种群后,我们需要计算这些染色体的适应度值。现在的问题是这个适应度函数是什么以及它如何计算适应度值。

例如,假设我们有一个方程f(x)=-x²+5。我们需要具有最大值且约束为0≤x≤31的解。

现在,让我们假设我们有一个随机的四个染色体群体,如下所示。我们的染色体长度为5,因为2⁵= 32和0≤x≤31。

8eb671e7091e62b3a479a6e53a20be99.png

我们的适应度函数将按照问题陈述中所述计算每个染色体的功能值:

对于第1条染色体,01110表示整数14。因此,f(x)=-(14 * 14)+ 5 = -191。

对于第二条染色体,10101表示21的整数。因此,f(x)=-(21 * 21)+ 5 = -436。

对于第3条染色体,00011表示3的整数。因此,f(x)=-(3 * 3)+ 5 = -4。

对于第4条染色体,10111表示23的整数。因此,f(x)=-(23 * 23)+ 5 = -524。

家长选择

通过使用适应度函数计算出的染色体适应度值来进行亲本选择。基于这些适应度值,我们需要选择适应度值最高的一对染色体。

健身计算的方法有很多,例如轮盘赌轮选择,等级选择。

在轮盘赌选择中,适应性值最高的染色体最有可能被选为亲本。但是在此选择过程中,可以选择一个较低的值。

在等级选择中,根据染色体的适合度从高到低对染色体进行排名。例如,根据上面计算出的适应度值,我们可以按照从高到低的顺序对那些染色体进行排序,例如3rd> 1st> 2nd> 4th。因此,在选择阶段,将根据从适应度函数计算出的适应度值选择第3条和第1条染色体。

分频器

交叉用于通过产生子代或后代来改变染色体的编程,从一代到另一一代。亲本染色体用于产生这些后代(生成的染色体)。

为了产生后代,有一些方法,例如单点交叉,两点或多点交叉。

对于单点交叉,首先,我们需要选择一个点,然后将这些部分除以该点在亲本染色体之间交换以创建后代。您可以使用颜色组合以便于理解。

afbc315ab68de44a447e5e3d59f870ae.png

对于两点交叉,我们需要选择两个点,然后交换位。

5d99372148b6553abeb83baa2887f45a.png

最后,这些新的后代被添加到种群中。

突变

突变为人口带来多样性。有不同种类的突变,例如位翻转突变,交换突变,反转突变等。这些是如此简单。

在“位翻转”突变中,只需选择一个或多个位,然后翻转它们即可。如果所选位为0,则将其设置为1;如果所选位为1,则将其设置为0。

27be727b34b36ccb316d075260fd3291.png

在交换位突变中,选择两个位并交换它们。

b1d5fef11de94836523c556b775009c7.png

在逆突变中,只需逆位。

a10ae38e51ce4081ca84712b47004e8a.png

遗传算法在Python中的实现

让我们尝试在python中实现遗传算法以进行功能优化。

问题陈述

假设我们有一个方程,f(x)=-x²+ 5。我们需要具有最大值且约束为0≤x≤31的解决方案。要选择初始种群,请使用概率0.2。

您可以在此处找到完整的代码。

初始人口

随机初始化比启发式初始化更好。因此,这里将随机初始化用于填充初始化。

#initialize人口导入随机最好= -100000 种群=([[random.randint(0,1)对于x 在范围(6)]其中i 在范围(4)])的打印(类型(群体))父母= [] new_populations = [] 打印(人口)

健身功能

适应度函数计算染色体的适应度值。适应度功能的功能取决于问题的要求。

#fitness分数计算............ DEF fitness_score(): 全球人口,最好 fit_value = [] fit_score = [] 对于i 在范围(4): chromosome_value = 0 对于j 在范围(5 ,0,-1): 染色体值+ =群体[i] [j] *(2 **(5-j)) 染色体值= -1 *染色体值,如果群体[i] [0] == 1则染色体值 print(chromosome_value ) fit_value.append(-(chromosome_value ** 2)+ 5) print(fit_value) fit_value,人口= zip(* sorted(zip(fit_value,人口,反向= True)) best = fit_value [0] Fitness_score()

选拔

根据适合度分数选择最适合的染色体。这里使用等级选择过程。

def selectparent(): 全球父母 #全球人口,父母 parents =人口[0:2] print(type(parents)) print(parents)selectparent()

分频器

选择最适合的父母后,需要杂交才能产生后代。在这里,使用单点交叉。

def crossover(): 全局父母 cross_point = random.randint(0,5) 父母=父母+元组([(父母[0] [0:cross_point +1] +父母[1] [cross_point + 1:6])] ) parents = parents + tuple([(parents [1] [0:cross_point +1] + parents [0] [cross_point + 1:6])]) 打印(父母)

突变

交叉完成后,将进行突变以保持一代之间的多样性。在这里,我们将单点翻转位。

defmutation(): 全局种群,父母 静音= random.randint(0,49), 如果静音== 20: x = random.randint(0,3) y = random.randint(0,5) 父母[x] [ y] = 1个父母[x] [y] 人口=父母 印刷(人口)

我们需要多次重复整个过程,直到找到最佳解决方案为止。



推荐阅读
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • 本文介绍了安全性要求高的真正密码随机数生成器的概念和原理。首先解释了统计学意义上的伪随机数和真随机数的区别,以及伪随机数在密码学安全中的应用。然后讨论了真随机数的定义和产生方法,并指出了实际情况下真随机数的不可预测性和复杂性。最后介绍了随机数生成器的概念和方法。 ... [详细]
author-avatar
fuckyourgirlfriend
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有