Note
: 在此示例中,第二个后代是通过对第一代后代的选择进行求补而创建的,但是,两个后代也可以彼此独立地创建。
由于这种方法不必交换染色体的全部片段,因此其后代具有更大的多样性。
用于有序列表的交叉
在前面的示例中,我们在两个基于整数的染色体上进行交叉操作,虽然0到9之间的每个值都在每个亲本上出现一次,但是每个后代都有某些值出现多次,而其他值则丢失了。
考虑到在某些任务中,基于整数的染色体可能代表有序列表的索引。例如在旅行商问题中——假设有几个城市,我们知道每个城市之间的距离,并且需要找到穿过所有城市的最短路线。
假设有四个城市,则表示此问题的可能解的简便方法是构造访问城市顺序的具有四位整数染色体的,例如(1,2,3,4)或(3,4,2,1)。具有两个相同值或缺少某些值的染色体诸如(1,2,2,4)是无效的。
对于这种情况,需要设计其他交叉方法以确保创建的后代仍然有效,如有序交叉。
有序交叉
有序交叉(OX1)方法致力于尽可能保留亲本基因的相对顺序。
第一步是具有随机切割点的两点交叉:
从第二个切割点之后开始,按原始顺序遍历所有父母的基因,开始填充每个后代中的其余基因。对于第一个双亲,6是下一个基因,但是在后代中已经存在,因此继续(环绕)到1,这也已经存在,下一个位置是2。由于后代中尚不存在2,因此将其添加到该位置,如下图所示。对于第二对亲子代,从5开始但其在子代中已经存在,然后移至4也同样存在,当移动到2时,后代中并不存在,因此将其添加到子代中:
对于第一个双亲,继续到3(已经存在于后代中),然后是4(后代中并不存在),将其添加到后代中。对于另一个亲本,下一个基因是6。由于对应的后代中不存在该基因,因此将其添加到其中:
以类似的方式继续处理后续基因,并填写下一个可用位点,如下图所示:
如下图所示,完成了产生两个有效后代染色体的过程: