您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

用Python从头开始实现简单遗传算法

时间:2020-06-10 13:49:49  来源:  作者:

使用遗传算法优化人员规划

用Python从头开始实现简单遗传算法

> Chromosomes are an important element of genetics. Photo by National Cancer Institute on Unsplash.

 

遗传算法

遗传算法是模仿自然选择过程的优化算法。 他们没有使用"数学技巧",而是仅复制了我们知道其有效的逻辑。

遗传算法中的自然选择

这种自然选择的过程以适者生存为基础:自然界中能使最佳个体(动物,植物或其他)生存的过程。 然后,这些优胜劣汰的人彼此交配,产生了新一代。 大自然还以基因组突变的形式增加了一些随机性。

新生代是好人和坏人的混合体,但是在这里,好人将继续生存,交配,然后产生新一代。

结果是一代又一代的持续改进。

员工计划的遗传算法

人员计划是优化研究的主题,许多公司都对此进行了介绍。 一旦公司拥有许多员工,就很难在满足某些约束的同时找到适合业务需求的计划。 除其他现有解决方案外,遗传算法是一种解决此问题的优化方法。

Python实现

在上一篇文章中,我展示了如何将Python中的DEAP库用于开箱即用的遗传算法。 在本文中,我将更详细地介绍如何理解遗传算法的不同部分。

下面的代码是遗传算法的生产代码的简化版本。 为了更好地理解示例而不是速度和可重用性,对它进行了优化。 它包含应用于示例数据的每个列出的步骤。

遗传算法代码演练的6个步骤

遗传算法的步骤:

· 如何为遗传算法编码数据?

· 如何评估遗传算法解决方案?

· 如何为遗传算法编码交配(交叉)?

· 如何为遗传算法编码突变?

· 如何定义遗传算法的选择?

· 如何为遗传算法定义迭代和停止?

如果要随身携带笔记本,可以在此处下载。

第1步-如何为遗传算法编码数据?

输入数据-两种计划

在此代码中,我们将使用同一员工计划的两种不同形状。

第1类计划-每位员工

用Python从头开始实现简单遗传算法

> Encoding Data For the Genetic Algorithm — Type 1 Planning — Per Employee. Picture by author.

 

第一个形状将是员工对员工的计划,详细视图。 每周计划总数是一个列表,其中包含每天的列表(在我们的情况下为5天)。 每个日常清单都包含一个班次列表(在我们的案例中为员工的11个班次)。 每个班次都是一个员工ID(从0到11,仅供参考),开始时间(0到24点之间)和班次持续时间(0到10小时之间)的列表。

我们的员工需要这种类型的计划才能知道他们何时工作。

第2类计划-每小时总计

用Python从头开始实现简单遗传算法

> Encoding Data For the Genetic Algorithm — Type 2 Planning — Totals Per Hour. Picture by author.

 

第二种计划类型是每小时被雇用的员工总数。 商店所有者将使用此计划来决定该计划是否与商店的估计需求相对应。

第2步-如何评估遗传算法解决方案?

为了评估每小时的员工计划,我们需要定义一个目标情况。 定义此目标不是优化的一部分:这将是另一个项目的问题。

用Python从头开始实现简单遗传算法

> Defining Evaluation For the Genetic Algorithm — Defining the Goal Situation. Picture by author.

 

我们确实需要定义如何评估提议的计划和目标计划之间的差异。 这将基于小时计划进行,将过多的员工小时总数与丢失的员工小时总数相加。 这将是一个成本函数,我们需要将其最小化。

用Python从头开始实现简单遗传算法

> Defining Evaluation For the Genetic Algorithm — Defining the Cost Function. Picture by author.

 

我们可以增加人员过多或人手不足的权重,但在此示例中,我使它们相等。

步骤3 —如何为遗传算法编码交配(交叉)?

遗传算法有两个关键步骤:交配(也包括交叉或重组)和突变。

在交配步骤中,与自然选择一样,新一代是由父母群体的个体的后代形成的。

将此应用到我们的示例中,请考虑一下以后,我们将生成许多不太好的员工计划,并尝试将最好的计划结合在一起。 因此,我们需要定义一种将两个人(员工计划)彼此"混合"的方法。

在此示例中,我决定将其编码如下:

· 从人口中选择一个随机的妈妈

· 从人口中选择一个随机的父亲

· 创建一个与父级大小相同的子级,但随机填充零和一。

· 孩子的位置为一,我们从父亲那里获取数据,孩子的位置为零,我们从他母亲那里获取数据。

· 我们对每个孩子重复一次(孩子的数量等于人口数量)

用Python从头开始实现简单遗传算法

> Defining Cross-Over For the Genetic Algorithm. Picture by author.

 

这是一种实现方法,还有许多其他方法可能。 为了使遗传算法起作用,在组合代码中具有随机性很重要。 当然,组合必须适合您在步骤1中选择的数据结构。

第4步-如何为遗传算法编码突变?

遗传算法中的第二个重要步骤是变异。 它包括向新一代产品添加完全随机的更改。 这种随机变化允许为不再存在的总体添加新值。

例如,考虑一种情况,该算法进行了几次迭代,并且由于选择和组合过程中的随机性,已取消选择上午10点之前的所有开始时间。 没有突变,该算法将永远无法取回该值,而稍后可能会提供更好的解决方案。

(很少数量的)新值的随机插入有助于算法摆脱这种情况。

用Python从头开始实现简单遗传算法

> Defining Mutation For the Genetic Algorithm. Picture by author.

 

在这里,它被编码为用0到10之间的随机值代替一个班次的持续时间或一个班次的开始时间的加法。如果我们指定n_mutations值,则可以重复该操作。

第5步-如何为遗传算法定义选择?

选择过程非常简单:

· 首先,选择所有可行的解决方案:删除员工工作时间超过10小时的解决方案。

用Python从头开始实现简单遗传算法

> Defining Selection For the Genetic Algorithm — Feasibility. Picture by author.

 

· 然后,将评估功能应用于每个人(即每个员工计划)并选择最佳人选。 所选个人的数量在代码中保持可变。

用Python从头开始实现简单遗传算法

> Defining Selection For the Genetic Algorithm — Cost. Picture by author.

 

第6步-如何为遗传算法定义迭代和停止?

该代码的最后一部分是将所有先前的构建块添加到要迭代的整体代码中。

用Python从头开始实现简单遗传算法

> Defining Iteration For the Genetic Algorithm. Picture by author.

 

优化参数调整

为了使遗传算法完美地工作,选择正确的参数很重要:generation_size,n_mutations和n_best在此很重要。

调整这三个将允许找到两者的最佳组合:

· 收敛到一个解决方案(而不是在没有改善的情况下随机转身)

· 避免陷入局部最优

如果在调整之后您的算法仍然陷于困境,那么另一个改进的方向将是适应交配和变异函数,然后看看会发生什么。

由于本文的目标是从头开始建立一个简单而实用的遗传算法,因此我将不涉及如何找到最佳参数的细节:这将需要另一篇文章。

感谢您的阅读。 不要犹豫,继续关注更多!

(本文翻译自Joos Korstanje的文章《A Simple Genetic Algorithm from Scratch in Python》,参考:
https://towardsdatascience.com/a-simple-genetic-algorithm-from-scratch-in-python-4e8c66ac3121)



Tags:遗传算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
基因遗传算法是一种灵感源于达尔文自然进化理论的启发式搜索算法。该算法反映了自然选择的过程,即最适者被选定繁殖,并产生下一代。本文简要地介绍了遗传算法的基本概念和实现...【详细内容】
2020-09-01  Tags: 遗传算法  点击:(87)  评论:(0)  加入收藏
使用遗传算法优化人员规划> Chromosomes are an important element of genetics. Photo by National Cancer Institute on Unsplash. 遗传算法遗传算法是模仿自然选择过程的...【详细内容】
2020-06-10  Tags: 遗传算法  点击:(100)  评论:(0)  加入收藏
遗传算法此节介绍最著名的遗传算法(GA)。遗传算法属于进化算法,基本思想是取自“物竞天泽、适者生存”的进化法则。简单来说,遗传算法就是将问题编码成为染色体,然后经过不断选...【详细内容】
2019-09-03  Tags: 遗传算法  点击:(175)  评论:(0)  加入收藏
本章开始对学习进行讨论,首先介绍机器学习和解释归纳范式。决策树是广泛应用的归纳学习方法,由于它们不能很好泛化,预测能力很差,因此有大约10年的时间,它们都没有得到人们的支持...【详细内容】
2019-08-08  Tags: 遗传算法  点击:(188)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条