【问题标题】:Crossover two individuals of different lengths交叉两个不同长度的个体
【发布时间】:2018-11-17 12:41:34
【问题描述】:

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

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

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 的倍数。

如何在不改变任何一个人的长度和结构的情况下对这些人进行交叉?

我无法找到解决此问题的方法,因此我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我假设您说的是single-point crossover。你可以这样做:

    1. 在 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 规则。

    【讨论】:

    • 谢谢。这几乎就是我想要的。
    【解决方案2】:

    我尝试过这种类型的解决方案: 它有效(但不同的交叉位置:

    代码在python中

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

    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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2015-04-15
      • 2017-10-15
      • 2012-07-29
      相关资源
      最近更新 更多