交叉两个不同长度的人

时间:2018-11-17 12:41:34

标签: java artificial-intelligence genetic-algorithm evolutionary-algorithm

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

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

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 :(得分:2)

我假设您是在谈论single-point crossover。您可以执行以下操作:

  1. 选择一个介于1和较短的长度之间的随机数。这将是您的交叉点。
  2. 此时,
  3. 同时剪切两者
  4. 按照常规分频器交换它们。

示例:

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规则。