我需要两个人进行不同长度的交叉。
个人可能是这样,但可能会更长:
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的倍数。
如何在不改变每个人的长度和结构的情况下对这些人进行交叉交换?
我无法找到解决方案,因此将不胜感激。
答案 0 :(得分:2)
我假设您是在谈论single-point crossover。您可以执行以下操作:
示例:
class Foo(list):
def __contains__(self, v):
if super().__contains__(v):
return v
else:
return False
>>> f = Foo([1,2,3])
>>> f.__contains__(2)
2
>>> 2 in f
True
矮个子的长度为 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 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]
|
这保留了两个人的长度,并保留了括号中的2s规则。