如何在没有重复的情况下进行交叉

时间:2016-04-23 06:50:24

标签: scheduling genetic-algorithm

我在做静态Flow-Shop调度问题,我考虑了10个任务和3台机器。在排列中,我面临着许多可能的顺序,任务应该通过机器。 现在我考虑以下两个序列,我想如何交叉它们以获得非重复的儿童染色体。

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

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

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

1 个答案:

答案 0 :(得分:1)

您的问题包含我们要审核的任何代码,因此我得出结论,您需要一般性的想法。

可能的解决方案:

这是基于位置的交叉的 canonic 方法。父母双方处于相同位置的基因不会被移动,而占据不同位置的基因会以两步过渡相互交换:

  1. 克隆:创建 p1 的副 c1 副本和 p2 副本 p2

  2. 切片:计算 c1 c2 在同一位置具有不同值的索引集

  3. 随机化:从此套装中随机选择 idx ,然后将其从集合

  4. 中删除
  5. 交换:在此集合中选择随机索引 idx :如果 v1 处于位置 idx c1 v2 c2 中位置 idx 交换值因此 v1 现在位于 c2 idx 位置,而 v2 位于 idx 在 c1

  6. 补偿:找到索引 idy s.t. v2 位于 p1 位置 idy 且索引 idz s.t. v1 位于 p2 中的 idz 位置,并补偿互换操作,以便现在 v1 位于位置 c1 v2 中的idy 位于 c2 中的 idz 位置。从第2/3点的索引集中删除 idy idz

  7. 重申:,概率 p ,请返回第3步。

  8. 示例:

    // 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
    

    <强>考虑:

    正如您所看到的,交叉会退化为引导变异,这是由于约束不会在您的内部引入重复遗传密码。然而,它仍然不同于突变,因为后者也会影响父母双方处于相同位置的基因。