遗传算法是受自然进化理论启发的一系列搜索算法。通过模仿自然选择和繁殖的过程,遗传算法可以为涉及搜索,优化和学习的各种问题提供高质量的解决方案。同时,它们类似于自然进化,因此可以克服传统搜索和优化算法遇到的一些障碍,尤其是对于具有大量参数和复杂数学表示形式的问题。
遗传算法是类比自然界的达尔文进化实现的简化版本。
达尔文进化论的原理概括总结如下:
换句话说,进化维持了种群中个体样本彼此不同。那些适应环境的个体更有可能生存,繁殖并将其性状传给下一代。这样,随着世代的更迭,物种变得更加适应其生存环境。而进化的重要推动因素是交叉(crossover)或重组(recombination)或杂交——结合双亲的特征产生后代。交叉有助于维持人口的多样性,并随着时间的推移将更好的特征融合在一起。此外,变异(mutations)或突变(特征的随机变异)可以通过引入偶然性的变化而在进化中发挥重要作用。
遗传算法试图找到给定问题的最佳解。达尔文进化论保留了种群的个体性状,而遗传算法则保留了针对给定问题的候选解集合(也称为individuals
)。这些候选解经过迭代评估(evaluate),用于创建下一代解。更优的解有更大的机会被选择,并将其特征传递给下一代候选解集合。这样,随着代际更新,候选解集合可以更好地解决当前的问题。
基因型(Genotype)
在自然界中,通过基因型表征繁殖,繁殖和突变,基因型是组成染色体的一组基因的集合。
在遗传算法中,每个个体都由代表基因集合的染色体构成。例如,一条染色体可以表示为二进制串,其中每个位代表一个基因:
种群(Population)
遗传算法保持大量的个体(individuals)——针对当前问题的候选解集合。由于每个个体都由染色体表示,因此这些种族的个体(individuals)可以看作是染色体集合:
适应度函数(Fitness function)
在算法的每次迭代中,使用适应度函数(也称为目标函数)对个体进行评估。目标函数是用于优化的函数或试图解决的问题。
适应度得分更高的个体代表了更好的解,其更有可能被选择繁殖并且其性状会在下一代中得到表现。随着遗传算法的进行,解的质量会提高,适应度会增加,一旦找到具有令人满意的适应度值的解,终止遗传算法。
选择(Selection)
在计算出种群中每个个体的适应度后,使用选择过程来确定种群中的哪个个体将用于繁殖并产生下一代,具有较高值的个体更有可能被选中,并将其遗传物质传递给下一代。
仍然有机会选择低适应度值的个体,但概率较低。这样,就不会完全摒弃其遗传物质。
交叉(Crossover)
为了创建一对新个体,通常将从当前代中选择的双亲样本的部分染色体互换(交叉),以创建代表后代的两个新染色体。此操作称为交叉或重组:
突变(Mutation)
突变操作的目的是定期随机更新种群,将新模式引入染色体,并鼓励在解空间的未知区域中进行搜索。
突变可能表现为基因的随机变化。变异是通过随机改变一个或多个染色体值来实现的。例如,翻转二进制串中的一位:
构造遗传算法的理论假设——针对当前问题的最佳解是由多个要素组成的,当更多此类要素组合在一起时,将更接近于问题的最优解。
种群中的个体包含一些最优解所需的要素,重复选择和交叉过程将个体将这些要素传达给下一代,同时可能将它们与其他最优解的基本要素结合起来。这将产生遗传压力,从而引导种群中越来越多的个体包含构成最佳解决方案的要素。
要素假设的一个更形式化的表达是Holland图式定理,也称为遗传算法的基本定理。
该定理是指图式是可以在染色体内找到的模式(或模板)。每个图式代表染色体中具有一定相似性的子集。
例如,如果一组染色体用长度为4的二进制串表示,则图式101表示所有这些染色体,其中最左边的位置为1,最右边的两个位置为01,从左边数的第二个位置为1或0,其中表示通配符。
对于每个图式,具有以下两个度量:
图式 | Order | Defining Length |
---|---|---|
1101 | 4 | 3 |
1*01 | 3 | 3 |
*101 | 3 | 2 |
**01 | 2 | 1 |
1*** | 1 | 0 |
**** | 0 | 0 |
种群中的每个染色体都对应于多个图式。例如,染色体1101对应于该表中出现的每个图式,因为它与它们代表的每个模式匹配。如果该染色体具有较高的适应度,则它及其代表的所有图式都更有可能从选择操作中幸存。当这条染色体与另一条染色体交叉或发生突变时,某些图式将保留下来,而另一些则将消失。低阶图式和定义长度短的图式更有可能幸存。
因此,图式定理指出,低阶、定义长度短且适合度高于平均值的图式频率在连续的世代中呈指数增长。换句话说,随着遗传算法的发展,代表更有效解决方案的属性的更小、更简单的要素基块将越来越多地出现在群体中。
遗传算法与传统的搜索和优化算法(例如基于梯度的算法)之间存在一些重要区别。
但是当问题具有已知的和专业的解决方法时,使用现有的传统方法或分析方法可能是更有效的选择。
遗传算法的核心是循环——依次应用选择,交叉和突变的遗传算子,然后对个体进行重新评估——一直持续到满足停止条件为止
以下流程图显示了基本遗传算法流程的主要阶段:
初始种群是随机选择的一组有效候选解(个体)。由于遗传算法使用染色体代表每个个体,因此初始种群实际上是一组染色体。
适应度函数的值是针对每个个体计算的。对于初始种群,此操作将执行一次,然后在应用选择、交叉和突变的遗传算子后,再对每个新一代进行。由于每个个体的适应度独立于其他个体,因此可以并行计算。
由于适应度计算之后的选择阶段通常认为适应度得分较高的个体是更好的解决方案,因此遗传算法专注于寻找适应度得分的最大值。如果是需要最小值的问题,则适应度计算应将原始值取反,例如,将其乘以值(-1)。
将选择,交叉和突变的遗传算子应用到种群中,就产生了新一代,该新一代基于当前代中较好的个体。
选择(selection)操作负责当前种群中选择有优势的个体。
交叉(crossover,或重组,recombination)操作从选定的个体创建后代。这通常是通过两个被选定的个体互换他们染色体的一部分以创建代表后代的两个新染色体来完成的。
变异(mutation)操作可以将每个新创建个体的一个或多个染色体值(基因)随机进行变化。突变通常以非常低的概率发生。
在确定算法是否可以停止时,可能有多种条件可以用于检查。两种最常用的停止条件是:
其他停止条件:
尽管遗传算法群体的平均适应度通常随着世代的增加而增加,但在任何时候都有可能失去当代的最佳个体。这是由于选择、交叉和变异运算符在创建下一代的过程中改变了个体。在许多情况下,丢失是暂时的,因为这些个体(或更好的个体)将在下一代中重新引入种群。
但是,如果要保证最优秀的个体总是能进入下一代,则可以选用精英主义策略。这意味着,在我们使用通过选择、交叉和突变创建的后代填充种群之前,将前n个个体(n是预定义参数)复制到下一代。复制后的的精英个体仍然有资格参加选择过程,因此仍可以用作新个体的亲本。
Elitism策略有时会对算法的性能产生重大的积极影响,因为它避免了重新发现遗传过程中丢失的良好解决方案所需的潜在时间浪费。
在自然界中,任何环境都可以进一步分为多个子环境或小生境,这些小生境由各种物种组成,它们利用每个小生境中可用的独特资源,例如食物和庇护所。例如,森林环境由树梢,灌木,森林地面,树根等组成;这些可容纳不同物种,它们生活在该小生境中并利用其资源。
当几种不同的物种共存于同一个小生境中时,它们都将争夺相同的资源,从而形成了寻找新的,无人居住的生态位并将其填充的趋势。
在遗传算法领域,这种小生境现象可用于维持种群的多样性以及寻找几个最佳解决方案,每个解决方案均被视为小生境。
例如,假设遗传算法试图最大化具有几个不同峰值的适应度函数:
由于遗传算法的趋势是找到全局最大值,因此一段时间后大多数个体集中在最高峰附近。在图中通过使用×标记的位置表示这一点,×代表了当前代的个体。
但是有时,除了全局最大值外,我们还希望找到其他部分(或全部)峰值。为此,可以将每个峰视为小生境,以与其高度成比例的方式提供资源。然后,找到一种在占用资源的个体之间共享(或分配)这些资源的方法,理想情况下,这将促使物种进行相应的分配,最高峰会吸引最多的人,因为它提供的奖励最多,而其他峰由于提供较少的奖励而相应减少物种数量:
实现共享机制的一种方法是将每个个体的原始适应度值除以(与之相关的)其他所有个体的距离之和。另一种选择是将每个个体的原始适应度除以周围某个半径内的其他个体的数量。
采用deap框架实现遗传算法的Hello world——OneMax问题,代码实现链接。