如何不重复地交叉
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=] 过渡:
克隆: 创建 child c1 p1[=99 的副本=] 和 c2 p2
的副本
slice: 计算 c1 和 c2[=99 的索引集=]同一个位置有不同的值
randomize: 从这个集合中随机选择一个 idx,并将其从集合中移除
swap: 在这个集合中选择一个随机索引 idx: if v1 在 c1 中的位置 idx 和 v2 在位置 idx 在 c2 中,交换 值,使 v1 现在位于位置 idx in c2 和 v2 在 idx 的位置 c1
补偿:找到索引idys.t。 v2 在 p1 中的位置 idy 和索引 idz s.t。 v1 位于 p2 中的位置 idz 并补偿交换操作,因此现在 v1 在 idy 的位置 c1 和 v2 在位置 idz 在 c2。从点 2/3 的索引集中删除 idy 和 idz。
重复:概率为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.
中处于相同位置的基因。
我正在做静态流水车间调度问题,我考虑了 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=] 过渡:
克隆: 创建 child c1 p1[=99 的副本=] 和 c2 p2
的副本
slice: 计算 c1 和 c2[=99 的索引集=]同一个位置有不同的值
randomize: 从这个集合中随机选择一个 idx,并将其从集合中移除
swap: 在这个集合中选择一个随机索引 idx: if v1 在 c1 中的位置 idx 和 v2 在位置 idx 在 c2 中,交换 值,使 v1 现在位于位置 idx in c2 和 v2 在 idx 的位置 c1
补偿:找到索引idys.t。 v2 在 p1 中的位置 idy 和索引 idz s.t。 v1 位于 p2 中的位置 idz 并补偿交换操作,因此现在 v1 在 idy 的位置 c1 和 v2 在位置 idz 在 c2。从点 2/3 的索引集中删除 idy 和 idz。
重复:概率为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.
中处于相同位置的基因。