关于遗传算法中的permutation coding问题的交叉算子种类介绍 见文章
-
Inver-over 算子 1998:Inver-over 算子可以看作是GA中交叉和变异的混合方法
Inver-over步骤:
- 随机初始化种群P
- 如果没达到temination,对每一个个体
,
,随机从
中选择一个city c
- 执行下面的循环,生成随机数,如果rand()<=p,从
剩余的city中随机选择一个
;如果rand()>p,从P中随机选择一个个体,然后选择c下一个位置的city。执行上面的循环,直到选择的
是c的下一个city则停止
- 计算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部分匹配交叉步骤:
- 从父代随机选择两个个体P1,P2和两个点
- 将P1,P2两点之间部分提取出来,放在子代O2,O1相同位置
- 在提取出来的部分中,映射关系为2->1,7->6,1->8。下面我们可以把子代未填充的部分补充完整(使用父代),O1第一个位置来源于P1第一个位置,是3,第二个位置是4,最后一个位置5,因为没有与已经填上的部分(1 6 8)重复,直接填上就可以了,同理O2也可以填上。
- O2,O1中打叉的部分在父代与子代相同位置重复,因此要使用映射的方法填入。例如,O1第三个位置应填入8,而8应该在第六个位置了,因此用1替换,而1也被填入了,则用2替换,所以最后填入O1第三个位置的是2,同理,第7个位置应填入7.
-
Cycle Crossover (CX) 1987
- 首先从父代随机选择两个个体P1,P2
- 在某个父代上随机选择1个基因(如P1的第一个位置1),然后找到另一个父代相应位置上的基因编号(P2第一个位置是8),再回到第一个父代找到同编号的基因的位置(P1中的8),找到8对应P2中的基因编号7,重复先前工作,直至形成一个环,环中的所有基因的位置即为最后选中的位置:1-8-7-4-1
- 将选中的数字填入到O1中,与P1中位置相同。
- 然后将O1中未填充的部分用P2相同位置填入
同理
但是CX有一个缺点,,,如上图所示,P1,P2产生的子代与父代完全一致。
-
CX2 2017
CX2是对CX的改进,步骤如下:
- 选择两个父代个体
- 选择第二个父代P2的第一个位置作为第一个子代O1的第一个位置(这里与CX相反)
- O1的第一个位置的bit是4对应P1中的第二个位置,这个位置对应O2的2,继续搜索,2在P1中是第四个位置,这个位置对应P2中的1,此时,1就作为O2的第一个元素。
- 选中的1是P1中的第六个元素,这个位置对应P2中的8,因此,8作为O1的第二个元素
- 对选中的8执行两个移动,P1中的8对应P2中的5,P1中的5对应P2中的7,因此,
- 继续执行4,5直到P1中的第一个元素添加到O2中(此时完成了一个cycle),
,注意,对于O1只移动1次,而O2移动两次完成子代的选择。
- 如果有一些元素被剩下,将P1,P2中已经被填入O2,O1的部分隐去,然后仍然执行2-5步。
考虑这样一种情况,,按照上面的算法可以得到
,此时停止因为已经形成了一个cycle,将O1填入的元素在P2中隐去,同理O2填入的元素在P1中隐去
,然后仍然执行4,5,即得到
在TSP问题上的测试表明,CX2在一些问题上比PMX好,一些没有PMX好,但是大部分比OX好
-
Position-based Crossover (PBX) 1990
- 随机选择父代P1,P2,随机选择几个基因位置,位置可以不连续
- 将选中的P1基因按照位置复制到O1中
- 删除P2中P1选中的基因,剩下的部分按照顺序填入O1
PBX与OX相似,区别是选择的基因位置可以不连续,在保持位置信息方面可能不如CX和PMX
-
Order-Based Crossover (OBX) 1990
- 随机选择父代P1,P2,随机选择P1中几个基因位置,位置可以不连续
- 找到P2中选中的P1基因,将P2中剩余的基因按照P2基因位置复制到O1中
- 将P1中选中的基因按照先后顺序放入O1中剩余位置
-
Subtour Exchange Crossover
- 随机选择父代P1,P2,随机选择P1上的连续一段基因,在P2上找到这些基因所在位置
- 保持未选中的基因不动,分别复制到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不仅取决于父代的构造,也能够生成新的,更好的构造,这些构造可能在两个选择的父代中都没有出现。
算法步骤:
- 从第一个节点node 1开始
- 依次搜索两个父代染色体,比较在父代中出现在节点P后面的第一个合法节点(没有被访问过的),如果父代中P节点后面没有合法节点,一次搜索{2,3,4,...n},选择第一个合法的节点,执行3
- 假设节点α和β分别在第一个和第二个父代中,选择下一个节点执行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
- 假设子代首先从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