遗传算法:交叉算子 crossover operator

关于遗传算法中的permutation coding问题的交叉算子种类介绍 见文章

  • Inver-over 算子 1998:Inver-over 算子可以看作是GA中交叉和变异的混合方法

     Inver-over步骤:

  1. 随机初始化种群P
  2. 如果没达到temination,对每一个个体,随机从 中选择一个city c
  3. 执行下面的循环,生成随机数,如果rand()<=p,从 剩余的city中随机选择一个;如果rand()>p,从P中随机选择一个个体,然后选择c下一个位置的city。执行上面的循环,直到选择的 是c的下一个city则停止
  4. 计算eval(si)>eval(),更优则替换

举个例子:如果 如果选择的city c=3,产生的随机数小于p,则从中选择另一个city =8,将c下一个位置与 之间的数字全部逆序,则;;另一种情况,如果产生的随机数大于p,则从种群P中随机选择一个个体,假设选择的个体是 ,则选择c的下一个city,这里是5,作为,然后将中c下一个位置与 之间的数字全部逆序,上面的过程执行多次,直到是c的下一个city。比如当前个体是 ,当前选中的city是6,不管随机数与p比较后选择那种方案生成,如果是8的话,循环结束。

实验部分:种群P=100,random inversion 概率p=0.02,结束条件是如果最后10次迭代最好的solution都没有得到改善。测试数据是TSPLIB。实验比较了simple inversion(p=1.0)和Lin-Kerninghan算法,前者时间和效果相差比较大,后者时间更短但是结果没有达到最优值。

  • partially mapped crossover operator (PMX) 1985

PMX部分匹配交叉步骤:

  1. 从父代随机选择两个个体P1,P2和两个点
  2. 将P1,P2两点之间部分提取出来,放在子代O2,O1相同位置
  3. 在提取出来的部分中,映射关系为2->1,7->6,1->8。下面我们可以把子代未填充的部分补充完整(使用父代),O1第一个位置来源于P1第一个位置,是3,第二个位置是4,最后一个位置5,因为没有与已经填上的部分(1 6 8)重复,直接填上就可以了,同理O2也可以填上。
  4. O2,O1中打叉的部分在父代与子代相同位置重复,因此要使用映射的方法填入。例如,O1第三个位置应填入8,而8应该在第六个位置了,因此用1替换,而1也被填入了,则用2替换,所以最后填入O1第三个位置的是2,同理,第7个位置应填入7.

 

  • Cycle Crossover (CX) 1987

  1. 首先从父代随机选择两个个体P1,P2
  2. 在某个父代上随机选择1个基因(如P1的第一个位置1),然后找到另一个父代相应位置上的基因编号(P2第一个位置是8),再回到第一个父代找到同编号的基因的位置(P1中的8),找到8对应P2中的基因编号7,重复先前工作,直至形成一个环,环中的所有基因的位置即为最后选中的位置:1-8-7-4-1
  3. 将选中的数字填入到O1中,与P1中位置相同。
  4. 然后将O1中未填充的部分用P2相同位置填入同理

但是CX有一个缺点,,,如上图所示,P1,P2产生的子代与父代完全一致。

  • CX2 2017

CX2是对CX的改进,步骤如下:

  1. 选择两个父代个体
  2. 选择第二个父代P2的第一个位置作为第一个子代O1的第一个位置(这里与CX相反)
  3. O1的第一个位置的bit是4对应P1中的第二个位置,这个位置对应O2的2,继续搜索,2在P1中是第四个位置,这个位置对应P2中的1,此时,1就作为O2的第一个元素。
  4. 选中的1是P1中的第六个元素,这个位置对应P2中的8,因此,8作为O1的第二个元素
  5. 对选中的8执行两个移动,P1中的8对应P2中的5,P1中的5对应P2中的7,因此,
  6. 继续执行4,5直到P1中的第一个元素添加到O2中(此时完成了一个cycle),,注意,对于O1只移动1次,而O2移动两次完成子代的选择。
  7. 如果有一些元素被剩下,将P1,P2中已经被填入O2,O1的部分隐去,然后仍然执行2-5步。

考虑这样一种情况,,按照上面的算法可以得到,此时停止因为已经形成了一个cycle,将O1填入的元素在P2中隐去,同理O2填入的元素在P1中隐去,然后仍然执行4,5,即得到

在TSP问题上的测试表明,CX2在一些问题上比PMX好,一些没有PMX好,但是大部分比OX好

  • Position-based Crossover (PBX) 1990

  1. 随机选择父代P1,P2,随机选择几个基因位置,位置可以不连续
  2. 将选中的P1基因按照位置复制到O1中
  3. 删除P2中P1选中的基因,剩下的部分按照顺序填入O1

PBX与OX相似,区别是选择的基因位置可以不连续,在保持位置信息方面可能不如CX和PMX

  • Order-Based Crossover (OBX) 1990

  1. 随机选择父代P1,P2,随机选择P1中几个基因位置,位置可以不连续
  2. 找到P2中选中的P1基因,将P2中剩余的基因按照P2基因位置复制到O1中
  3. 将P1中选中的基因按照先后顺序放入O1中剩余位置
  • Subtour Exchange Crossover

  1. 随机选择父代P1,P2,随机选择P1上的连续一段基因,在P2上找到这些基因所在位置
  2. 保持未选中的基因不动,分别复制到O1,O2中,剩下的基因分别用P2,P1中选中的基因填入

这个算法的不同是只在P1上选中染色体,算法一次可以生成2个子代

参考https://blog.csdn.net/u012750702/article/details/54563515/

  • sequential constructive crossover (SCX) 2010

SCX根据父代better edges构造子代,与GNX,ERX不同的是,SCX不仅取决于父代的构造,也能够生成新的,更好的构造,这些构造可能在两个选择的父代中都没有出现。

算法步骤:

  1. 从第一个节点node 1开始
  2. 依次搜索两个父代染色体,比较在父代中出现在节点P后面的第一个合法节点(没有被访问过的),如果父代中P节点后面没有合法节点,一次搜索{2,3,4,...n},选择第一个合法的节点,执行3
  3. 假设节点α和β分别在第一个和第二个父代中,选择下一个节点执行4
  4. 如果 ,选择α,否则选择β作为下一个节点,将其连接到已经选中的节点后面,如果都已经被选择则停止,否则,将当前的节点命名为P,执行2

假设父代分别为 ,对于非对称的TSP有

此时P1和P2的值分别是312和331,下面是SCX的执行步骤:选择第一个节点1,在P1和P2中第一个节点后面的合法节点分别是5,6,C15=35,C16=63,C15<C16,所以选5,O1的染色体为(1,5),在P1和P2中5后面的合法染色体都是7,所以O1的染色体为(1,5,7),在P1中7后面的合法节点是3,P2中没有,因此考虑{2,3,4,...n}中第一个合法的节点,是2,C73=43>31=C72,所以O1的染色体为(1,5,7,2),重复上面的步骤,2后面的合法节点3和4,C23=86 >46=C24,所以O1的染色体为(1,5,7,2,4),4后面的合法节点在P1中没有,P2中是3,对于P1考虑{2,3,4,...n}中第一个合法的节点,也是3,所以O1的染色体为(1,5,7,2,4,3),3后面的合法节点在P1中是6,P2没有,考虑{2,3,4,...n}中第一个合法的节点,也是6,所以O1的染色体为(1,5,7,2,4,3,6),TSP最后的结果是266小于父代两个染色体。

  • edge recombination crossover (ERX) 1991

  1. 假设子代首先从node1开始,node 1的下一个元素可以是5,2,6,7,其中5,2,7有2个合法下一节点,6有3个,选择下一节点数目少的元素,因此可以从5,2,7中选择,假设随机选择的是5,有2个下一节点(去掉1)7和3,同样选择下一节点少的7,此时,7只有一个节点可以连接即3,与3连接的6和4中都只剩下2个节点,假设随机选择4,下一节点是6和2,这两个节点都只有一个下一节点,随机选择6,然后连接2,最后为(1,5,7,3,4,6,2),这个结果323比父代中一个值更大,有5条边是从父代中选择的,但是值更大。

  • generalized N-point crossover (GNX) 1995

 

  •  
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值