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


· 从人口中选择一个随机的父亲
· 创建一个与父级大小相同的子级,但随机填充零和一 。
· 孩子的位置为一,我们从父亲那里获取数据,孩子的位置为零,我们从他母亲那里获取数据 。
· 我们对每个孩子重复一次(孩子的数量等于人口数量)

用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)

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


推荐阅读