文章目录

  • 第二十章 遗传算法-史上最直观交叉算子(动画演示)
  • 20.1 单点交叉(Single-point crossover)
  • 20.2 两点交叉(Two-points crossover)
  • 20.3 多点交叉(Multi-point crossover)
  • 20.4 部分匹配交叉(Partially-matched crossover,PMX)
  • 20.5 均匀交叉(Uniform crossover)
  • 20.6 顺序交叉(Order Crossover,OX)
  • 20.7 基于位置的交叉(Position-based Crossover,PBX)
  • 20.8 基于顺序的交叉(Order-Based Crossover,OBX)
  • 20.9 循环交叉(Cycle Crossover,CX)
  • 20.10 子路径交叉交叉(Subtour Exchange Crossover,SEX)


第二十章 遗传算法-史上最直观交叉算子(动画演示)

遗传算法通过交叉算子来维持种群的多样性,应该说交叉算子是遗传算法中最重要的操作。针对不同的优化问题,有多种不同的交叉算子,今天将带领大家以动画的形式,直观地介绍不同交叉算子的原理。制作不易,感谢关注。

20.1 单点交叉(Single-point crossover)

单点交叉通过选取两条染色体,在随机选择的位置点上进行分割并交换右侧的部分,从而得到两个不同的子染色体。单点交叉是经典的交叉形式,与多点交叉或均匀交叉相比,它交叉混合的速度较慢(因为将染色体分成两段进行交叉,这种方式交叉粒度较大),然而对于选取交叉点位置具有一定内在含义的问题而言,单点交叉可以造成更小的破坏。

交叉算子python代码 什么是交叉算子_遗传算法

20.2 两点交叉(Two-points crossover)

两点交叉是指在个体染色体中随机设置了两个交叉点,然后再进行部分基因交换。两点交叉的具体操作过程是:

  1. 在相互配对的两个个体编码串中随机设置两个交叉点;
  2. 交换两个个体在所设定的两个交叉点之间的部分染色体。

20.3 多点交叉(Multi-point crossover)

多点交叉或称广义交叉,是指在个体染色体中随机设置多个交叉点,然后进行基因交换。其操作过程与单点交叉和两点交叉相类似。如果多点交叉只选择了一个交叉点,那么多点交叉就变成了单点交叉。

交叉算子python代码 什么是交叉算子_交叉算子_02

20.4 部分匹配交叉(Partially-matched crossover,PMX)

部分匹配交叉保证了每个染色体中的基因仅出现一次,通过该交叉策略在一个染色体中不会出现重复的基因,所以PMX经常用于旅行商(TSP)或其他排序问题编码。

PMX类似于两点交叉,通过随机选择两个交叉点确定交叉区域。执行交叉后一般会得到两个无效的染色体,个别基因会出现重复的情况,为了修复染色体,可以在交叉区域内建立每个染色体的匹配关系,然后在交叉区域外对重复基因应用此匹配关系就可以消除冲突。

Step1:随机选择一对染色体(父代)中几个基因的起止位置(两染色体被选位置相同)。

交叉算子python代码 什么是交叉算子_交叉算子python代码_03

Step2:交换这两组基因的位置。

交叉算子python代码 什么是交叉算子_交叉算子_04


Step3:做冲突检测,根据交换的两组基因建立一个映射关系,如图所示,以7-5-2这一映射关系为例,可以看到第二步结果中子代1存在两个基因7,这时将其通过映射关系转变为基因2,以此类推至没有冲突为止。最后所有冲突的基因都会经过映射,保证形成的新一对子代基因无冲突。

交叉算子python代码 什么是交叉算子_进化计算_05


最终结果为:

交叉算子python代码 什么是交叉算子_遗传算法_06


动画效果如下:

交叉算子python代码 什么是交叉算子_交叉算子_07

20.5 均匀交叉(Uniform crossover)

均匀交叉也称一致交叉,在均匀交叉中,两个染色体的索引i处的基因以交换概率pS进行交换。经验研究表明,均匀交叉比是一种更具利用性的方法,这样可以更好地搜索设计空间,同时保持良好的信息交换。

交叉算子python代码 什么是交叉算子_交叉算子python代码_08

20.6 顺序交叉(Order Crossover,OX)

在两个父代染色体中随机选择起始和结束位置,将父代染色体1该区域内的基因复制到子代1相同位置上,再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。与PMX不同的是,OX不用进行冲突检测工作(实际上也只有PMX需要做冲突检测)。

Step1:与PMX相同,随机选择一对染色体(父代)中几个基因的起止位置(两染色体被选位置相同)。

交叉算子python代码 什么是交叉算子_进化算法_09


Step2:生成一个子代,并保证子代中被选中的基因的位置与父代相同。

交叉算子python代码 什么是交叉算子_遗传算法_10


Step3:先找出第一步选中的基因在另一个父代中的位置,再将其余基因按顺序放入上一步生成的子代中。

交叉算子python代码 什么是交叉算子_交叉算子python代码_11


动画效果如下:

交叉算子python代码 什么是交叉算子_遗传算法_12

20.7 基于位置的交叉(Position-based Crossover,PBX)

在两个父代染色体中随机选择几个位置,位置可以不连续,将父代染色体1这些位置上的基因复制到子代1相同位置上,再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。PBX与OX的不同在于选取的位置可以不连续。
Step1:随机选择一对染色体(父代)中几个基因,位置可不连续,但两染色体被选位置相同。

交叉算子python代码 什么是交叉算子_进化计算_13


Step2:与OX的第二步相同,生成一个子代,并保证子代中被选中的基因的位置与父代相同。

交叉算子python代码 什么是交叉算子_进化算法_14

Step3:也与OX的第三步相同,先找出第一步选中的基因在另一个父代中的位置,再将其余基因按顺序放入上一步生成的子代中。

交叉算子python代码 什么是交叉算子_遗传算法_15


动画效果如下:

交叉算子python代码 什么是交叉算子_遗传算法_16

20.8 基于顺序的交叉(Order-Based Crossover,OBX)

在两个父代染色体中随机选择几个位置,位置可以不连续,先在父代染色体2中找到父代染色体1被选中基因的位置,再用父代染色体2中其余的基因生成子代,并保证位置对应,将父代染色体1中被选择的基因按顺序放入子代剩余位置中。另一个子代以类似方式得到。OBX与PBX相比,生成子代的“基础”基因来源不同,PBX来自被选中基因,OBX来自剩余基因。

Step1:随机选择一对染色体(父代)中几个基因,位置可不连续,但两染色体被选位置相同。

交叉算子python代码 什么是交叉算子_遗传算法_17


Step2:先在父代2中找到父代1被选中基因的位置,再用父代2中其余的基因生成子代,并保证位置对应。

交叉算子python代码 什么是交叉算子_交叉算子python代码_18


Step3:将父代1中被选择的基因按顺序放入子代剩余位置中。

交叉算子python代码 什么是交叉算子_遗传算法_19


动画效果如下:

交叉算子python代码 什么是交叉算子_进化计算_20

20.9 循环交叉(Cycle Crossover,CX)

在某个父代上随机选择1个基因,然后找到另一个父代相应位置上的基因编号,再回到第一个父代找到同编号的基因的位置,重复先前工作,直至形成一个环,环中的所有基因的位置即为最后选中的位置。用父代染色体1中选中的基因生成子代,并保证位置对应,最后将父代染色体2中剩余基因放入子代中。另一个子代以相同方式获得。CX的特点在于只需要随机选择一个位置即可得到多个交叉位置。

交叉算子python代码 什么是交叉算子_进化算法_21

20.10 子路径交叉交叉(Subtour Exchange Crossover,SEX)

在某个父代上选择1组基因,在另一父代上找到这些基因的位置,保持未选中基因不变,按选中基因的出现顺序,交换两父代染色体中基因的位置,一次生成两个子代。SEX的特点是只在一个染色体上选择基因的位置。

交叉算子python代码 什么是交叉算子_遗传算法_22