如何不重复地交叉

how to Crossover without Repeatition

我正在做静态流水车间调度问题,我考虑了 10 个任务和 3 台机器。在排列中,我面临许多可能的顺序,任务应该通过这些顺序通过机器。 现在我考虑以下两个序列,我想知道如何交叉它们以获得非重复的子染色体。

第一个序列 = T3 T2 T5 T6 T9 T1 T4 T7 T8 T10

第二个序列= T3 T2 T6 T8 T1 T5 T4 T7 T9 T10

现在如何制作子序列,使其没有重复,并且所有任务也都存在于子序列中。

你的问题包含任何代码供我们审查,因此我得出结论,你需要一个总体思路来完成它。


可能的解决方案:

这将是 canonic 方法 position-based 交叉。 parents中相同位置的基因没有移动,而占据不同位置的基因通过two-step[相互交换。 =101=] 过渡:

  1. 克隆: 创建 child c1 p1[=99 的副本=] 和 c2 p2

  2. 的副本
  3. slice: 计算 c1c2[=99 的索引集=]同一个位置有不同的值

  4. randomize: 从这个集合中随机选择一个 idx,并将其从集合中移除

  5. swap: 在这个集合中选择一个随机索引 idx: if v1c1 中的位置 idxv2 在位置 idx c2 中,交换 值,使 v1 现在位于位置 idx in c2v2idx 的位置 c1

  6. 补偿:找到索引idys.t。 v2p1 中的位置 idy 和索引 idz s.t。 v1 位于 p2 中的位置 idz 并补偿交换操作,因此现在 v1idy 的位置 c1v2 在位置 idzc2。从点 2/3 的索引集中删除 idyidz

  7. 重复:概率为p,回到步骤3.

示例:

// idx = 8, indexes start from 0
|3 2| 9 6 5 8 |4 7| 1 |10| // c1
         /          |
|3 2| 6 1 8 9 |4 7| 5 |10| // c2
=
|3 2| 9 6 1 8 |4 7| 5 |10| // c1
|3 2| 6 5 8 9 |4 7| 1 |10| // c2

考虑因素:

如您所见,交叉退化为引导突变,这是由于约束 不在您的遗传密码中引入重复。然而,它仍然不同于突变,因为后者也会影响parents.

中处于相同位置的基因。