我在做静态Flow-Shop调度问题,我考虑了10个任务和3台机器。在排列中,我面临着许多可能的顺序,任务应该通过机器。 现在我考虑以下两个序列,我想如何交叉它们以获得非重复的儿童染色体。
第一序列= T3 T2 T5 T6 T9 T1 T4 T7 T8 T10
第二序列= T3 T2 T6 T8 T1 T5 T4 T7 T9 T10
现在如何制作子序列,使其不重复,所有任务也存在于子序列中。
答案 0 :(得分:1)
您的问题不包含我们要审核的任何代码,因此我得出结论,您需要一般性的想法。
可能的解决方案:
这是基于位置的交叉的 canonic 方法。父母双方处于相同位置的基因不会被移动,而占据不同位置的基因会以两步过渡相互交换:
克隆:创建 p1 的副 c1 副本和 p2 副本 p2 强>
切片:计算 c1 和 c2 在同一位置具有不同值的索引集
随机化:从此套装中随机选择 idx ,然后将其从集合
交换:在此集合中选择随机索引 idx :如果 v1 处于位置 idx c1 和 v2 在 c2 中位置 idx ,交换值因此 v1 现在位于 c2 中 idx 位置,而 v2 位于 idx 在 c1
补偿:找到索引 idy s.t. v2 位于 p1 位置 idy 且索引 idz s.t. v1 位于 p2 中的 idz 位置,并补偿互换操作,以便现在 v1 位于位置 c1 和 v2 中的idy 位于 c2 中的 idz 位置。从第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
<强>考虑:强>
正如您所看到的,交叉会退化为引导变异,这是由于约束不会在您的内部引入重复遗传密码。然而,它仍然不同于突变,因为后者也会影响父母双方处于相同位置的基因。