我有两个长度不同的个体需要进行交叉操作。
个体可能像这样,但可能会更长:
0 1 2 2 1 2 0 [0] 1 2 1 2 0 1 2 [0] 1 2 1 2 0 2 1 [1]
1 2 1 1 0 2 0 [0] 1 2 1 2 0 0 1 [1]
然而,交叉后我需要保持它们的原始长度。我还需要确保每第8位(方括号中的)不能是2。每个个体的长度总是8的倍数。
如何在不改变任一个体长度和结构的情况下对这些个体进行交叉操作呢?
我一直没能找到解决方案,所以任何帮助都将不胜感激。
回答:
我假设你在谈论的是单点交叉。你可以这样做:
- 选择一个介于1和较短个体长度之间的随机数。这将是你的交叉点。
- 在这个点切割两个个体。
- 按照常规交叉方式交换它们。
示例:
0 1 2 2 1 2 0 [0] 1 2 1 2 0 1 2 [0] 1 2 1 2 0 2 1 [1]1 2 1 1 0 2 0 [0] 1 2 1 2 0 0 1 [1]
较短个体的长度为16,所以我们生成一个介于1和16之间的随机数 –> 例如,9
交叉点:
|0 1 2 2 1 2 0 [0] 1|2 1 2 0 1 2 [0] 1 2 1 2 0 2 1 [1]1 2 1 1 0 2 0 [0] 1|2 1 2 0 0 1 [1] |
交换点后的子段:
|0 1 2 2 1 2 0 [0] 1|2 1 2 0 0 1 [1]1 2 1 1 0 2 0 [0] 1|2 1 2 0 1 2 [0] 1 2 1 2 0 2 1 [1] |
这保持了两个个体的长度,并遵守了方括号中不允许有2的规则。