交叉两个不同长度的个体

Crossover two individuals of different lengths

我有两个不同长度的个体需要进行交叉。

个人可能是这样,但也可能更长:

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. Select 介于 1 和 较短 个体长度之间的随机数。这将是你的交叉点。
  2. 此时 两个 个人都被砍掉。
  3. 按照常规交叉交换它们。

示例:

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]
                   |

这保留了两个个体的长度,并保留了 no-2s-in-brackets 规则。

我尝试过这种解决方案: 它有效(但不同 cross-over 位置:

代码在python

来自随机导入选择、randint、randrange、random

a = [1,2,4,5,8,11,3,4,7,2,4,6]
b = [3,4,5,6,9,1,3,6,7]
length_a =len(a)
length_b = len(b)
crossover_prob = 0.8
p = randint(1, length_a - 1) 
q = randint(1, length_b -1)
while p < crossover_prob:
    c = a[0:p] + b[q:]
    
while q < crossover_prob:
    d = b[0:q] + a[p:]



print (c)
print (d)

结果:

[1, 3, 4, 5, 6, 9, 1, 3, 6, 7] [2, 4, 5, 8, 11, 3, 4, 7, 2, 4, 6]