主要内容

遗传算法是如何工作的

算法概要

下面的大纲总结了遗传算法的工作原理:

  1. 该算法首先创建一个随机初始种群。

  2. 然后,该算法创建一系列新群体。在每个步骤中,该算法使用当前一代中的个体创建下一个群体。要创建新群体,该算法执行以下步骤:

    1. 通过计算当前群体中的每个成员的适应度值对其进行评分。这些值称为原始适应度分数。

    2. 调整原始适应度得分,将其转换为更可用的值范围。这些调整后的值称为期望值。

    3. 根据他们的期望,选择被称为家长的成员。

    4. 当前人群中一些适合度较低的个体被选为精英.这些精英个体被传给下一个种群。

    5. 从父母那里生出孩子。孩子的产生要么是通过对单亲的随机改变突变-或通过组合一对父元素的向量项-交叉

    6. 用儿童取代现有人口,形成下一代。

  3. 当满足停止条件之一时,算法停止。看到算法的停止条件

初始种群

算法首先创建一个随机初始种群,如下图所示。

在本例中,初始种群包含20.个人。注意,初始种群中的所有个体都位于图的右上象限,也就是说,它们的坐标在0到1之间。对于本例,InitialPopulationRange选择是[0, 1]

如果你知道函数的最小值点的大致位置,你应该设置InitialPopulationRange因此点位于该范围的中间附近。例如,如果您认为Rastrigin函数的最小点在该点附近[0 0],你可以设置InitialPopulationRange[-1;1].然而,如这个例子所示,遗传算法可以找到最小值,即使小于最优选择InitialPopulationRange

创造下一代

在每一步,遗传算法都使用当前的人口来创造下一代。算法选择当前种群中的一组个体,称为父母,谁贡献了自己的力量基因-他们的带菌者的条目-传给他们的孩子。该算法通常选择适应度值较高的个体作为父母。属性中选择父级的算法使用的函数SelectionFcn选择。看到选择选项

遗传算法为下一代创造了三种类型的孩子:

  • 精英是当前这一代拥有最佳适应度值的个体。这些个体自动存活到下一代。

  • 交叉是由一对父母的向量组合而成的。

  • 突变孩子们是通过向单亲引入随机变化或突变而产生的。

下面的示意图说明了这三种类型的孩子。

变异和交叉解释如何指定算法生成的每种类型的子级数量以及用于执行交叉和变异的函数。

下面几节解释该算法如何创建交叉和变异子节点。

交叉的孩子

该算法通过结合当前人口中的父母对来创建交叉子女。在子向量的每个坐标上,默认交叉函数随机选择一个条目,或基因,并将其分配给子节点。对于线性约束的问题,默认的交叉函数将子节点创建为父节点的随机加权平均值。

突变儿童

该算法通过随机改变父母个体的基因来产生突变子。默认情况下,对于不受约束的问题,算法将从高斯分布添加一个随机向量到父向量。对于有界或线性约束的问题,子结点仍然是可行的。

下图显示了初始群体(即第二代群体)的子女,并指出他们是精英子女、交叉子女还是突变子女。

后代人的地块

下图显示了迭代60、80、95和100时的种群。

随着世代数的增加,种群中个体之间的距离越来越近,逼近最小值点[0 0]

算法的停止条件

遗传算法使用以下选项确定何时停止。通过运行查看每个选项的默认值选择= optimoptions (ga)

  • MaxGenerations-当代数达到时,算法停止MaxGenerations

  • MaxTime—算法运行一段时间(秒)后停止MaxTime

  • FitnessLimit-当当前总体中最佳点的适应度函数值小于或等于时,算法停止FitnessLimit

  • MaxStallGenerations—当适应度函数值的平均相对变化超过时,算法停止MaxStallGenerations小于功能公差

  • MaxStallTime-如果目标函数在等于秒的时间间隔内没有改进,算法将停止MaxStallTime

  • FunctionTolerance-算法运行到适应度函数的相对变化值的平均值超过为止MaxStallGenerations小于功能公差

  • ConstraintTolerance- - -ConstraintTolerance不用作停止标准。它被用来确定关于非线性约束的可行性。同时,max (sqrt (eps), ConstraintTolerance)确定关于线性约束的可行性。

只要满足其中任何一个条件,算法就会停止。

选择

选择函数根据适应度标度函数中的标度值为下一代选择父母。缩放后的适应度值称为期望值。一个个体可以被多次选择为父母,在这种情况下,它将其基因贡献给多个孩子。默认选择选项,@selectionstochunif,显示一条线,其中每个父级对应于线的长度与其比例值成比例的一段。算法以等长步沿直线移动。在每个步骤中,算法从它所在的部分分配一个父节点。

一个更确定的选择是@selectionremainder,执行两个步骤:

  • 在第一步中,函数根据每个个体的缩放值的整数部分确定地选择父节点。例如,如果一个个体的缩放值是2.3,函数会两次选择该个体作为父个体。

  • 在第二步中,选择函数使用比例值的小数部分选择额外的父母,就像随机均匀选择一样。函数以分段的形式绘制一条直线,其长度与个体的比例值的小数部分成正比,并以相等的步长沿这条直线移动以选择父节点。

    注意,如果缩放后的值的小数部分都等于0,可以使用缩放,选择是完全确定的。

有关详细信息和更多选择选项,请参见选择选项

复制选项

繁殖选项控制遗传算法如何创造下一代。选项是

  • EliteCount-在当前一代中具有最佳适应值且保证能存活到下一代的个体数。这些个体称为精英的孩子

    EliteCount如果值至少为1,则最佳适应值只能从一代减少到下一代。这就是您希望发生的情况,因为遗传算法会最小化适应值函数。设置EliteCount值越高,适者生存的个体占种群的主导地位,搜索效率就越低。

  • CrossoverFraction-除精英子女外,跨界创造的下一代个体的比例。设置交叉分数的值如何CrossoverFraction影响遗传算法的性能。

因为精英已经被评估过了,遗传算法在繁殖期间不重新评估精英个体的适应度函数。此行为假定个体的适应度函数不是随机函数,而是确定性函数。若要更改此行为,请使用输出函数。请参阅EvalElites国家结构

变异和交叉

遗传算法使用当前一代中的个体来创建组成下一代的子代。除了精英子代(与当前一代中具有最佳适应值的个体相对应)之外,该算法还创建

  • 通过从当前这一代的一对个体中选择载体条目或基因,并将它们组合成一个孩子

  • 通过对当前这一代的单个个体应用随机变化来产生一个孩子

这两个过程对遗传算法来说都是必不可少的。交叉使算法能够从不同的个体中提取出最好的基因,并将它们重新组合成可能更优秀的后代。突变增加了种群的多样性,从而增加了算法产生具有更好适应度值的个体的可能性。

看到创造下一代以举例说明遗传算法如何应用变异和交叉。

你可以指定算法创建的每种类型的子元素的数量,如下所示:

  • EliteCount指定精英子女的数量。

  • CrossoverFraction指定除精英子女外,人口中跨性别子女的比例。

例如,如果PopulationSize20.,EliteCount2,CrossoverFraction0.8,下一代每类儿童的人数如下:

  • 有两个优秀的孩子。

  • 除精英儿童外,共有18个个体,因此算法将0.8*18 = 14.4 ~ 14轮算得到跨界儿童的数量。

  • 剩下的四个个体,除了精英儿童之外,都是突变儿童。

相关话题