我需要对两个长度不同的个体进行交叉。
个体可能是这样的,但也可能更长:
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 的倍数。
如何在不改变任何一个个体的长度和结构的情况下对这些个体进行交叉?
我一直无法找到解决方案,因此我们将不胜感激。
最佳答案
我假设您正在谈论 single-point crossover 。你可以这样做:
- 选择一个介于 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 的规则。
关于java - 将两个不同长度的个体交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53351358/