用于排列的交叉算子

时间:2013-01-20 00:20:49

标签: algorithm genetic-algorithm crossover

我正试图在我的排列中解决遗传算法中的交叉问题。 假设我有两个20个整数的排列。我想交叉他们让两个孩子。父母内部有相同的整数,但顺序不同。

示例:

Parent1: 
 5 12 60 50 42 21 530 999 112 234 15 152 601 750 442 221 30 969 113 134
Parent2: 
 12 750 42 113 530 112 5 23415 60 152 601 999 442 221 50 30 969  134 21

就这样 - 我怎样才能让这两个孩子成为孩子?

4 个答案:

答案 0 :(得分:5)

您要找的是ordered crossover。旅行商问题here有解释。

这是实现部分映射交叉(PMX)变体的some Java code

答案 1 :(得分:4)

交叉的选择取决于整数的顺序或绝对位置对于适应性是否重要。在HeuristicLab(C#)中,我们实现了文献中发现的几种常用文件,包括:OrderCrossover(2个变种),OrderBasedCrossover,PartiallyMatchedCrossover,CyclicCrossover(2个变种),EdgeRecombinationCrossover(ERX),MaximalPreservativeCrossover,PositionBasedCrossover和UniformLikeCrossover。它们的实现可以与HeuristicLab.Encodings.PermutationEncoding插件中的科学源一起找到。 ERX仅对TSP或类似TSP的问题有意义。 CX是基于位置的,PMX部分位置部分基于订单,但更多的是位置。 OX完全基于订单。

请注意,我们的实现假设一个连续的编号排列,整数从0到N-1。您必须先将它们映射到此范围。

答案 2 :(得分:2)

根据我对遗传算子的研究和实施。存在许多类型的交叉算子用于顺序编码(即不允许重复基因,如TSP)。一般来说,我认为有两个主要的家庭:

ERX家族

邻域列表用于存储父节点中每个节点的邻居。然后,仅使用列表生成子项。已知ERX更多respectful and alleles transmitting,这基本上意味着基因之间的联系不太可能被打破。

类似ERX的运算符示例包括:边缘重组(ERX),Edge-2,Edge-3,Edge-4和广义分区交叉(GPX)。

类似OX的交叉

选择两个交叉点。然后,点之间的基因在两个父母之间交换。由于不允许重复,每个交叉提出了避免/消除重复的技术。这些交叉算子比ERX更具破坏性。

类似OX的交叉示例:订单交叉(OX),最大保密交叉(MPX)和部分映射交叉(PMX)。

第一个家族(ERX)在普通遗传算法中表现更好。而第二族更适合于混合遗传算法或模因算法(使用局部搜索)。 This paper详细解释了这一点。

答案 3 :(得分:1)

在旅行销售问题(TSP)中,您希望订单访问城市列表,并且您希望仅访问每个城市一次。如果您直接在基因组中编码城市,那么天真的交叉或突变通常会产生无效的行程。

我曾经想出了一种解决这个问题的新方法:我不是直接在基因组中编码解决方案,而是编码一个转换,重新排序一个规范的值列表。

鉴于基因组[1,2,4,3,2,4,1,3],你从某个任意顺序的城市列表开始,按字母顺序排列:

  1. 亚特兰大
  2. 波士顿
  3. 芝加哥
  4. 丹佛
  5. 然后,您将从基因组中获取每对价值并在这些位置交换城市。因此,对于上面的基因组,你将交换1和2中的那些,然后是4和3中的那些,然后是2和4中的那些,最后是1和3中的那些。你最终会结束用:

    1. 丹佛
    2. 芝加哥
    3. 波士顿
    4. 亚特兰大
    5. 使用此技术,您可以使用任何类型的交叉或变异操作,并始终获得有效的巡视。如果基因组足够长,那么可以探索整个解空间。

      我已将此用于TSP和其他优化问题并取得了很大成功。