2012-02-16 63 views
0

我已经实现了如下的一点交叉;Java中的两点交叉

public void onePointCrossover(Individual indi) { 
    if (SGA.rand.nextDouble() < pc) { 

     int xoverpoint = SGA.rand.nextInt(length); 


     int tmp; 
     for (int i=xoverpoint; i<length; i++){ 
      tmp = chromosome[i]; 
      chromosome[i] = indi.chromosome[i]; 
      indi.chromosome[i] = tmp; 
     } 
    } 
} 

一个点交叉 - 当选择交叉点,从染色体的开始到交叉点的二进制字符串被从一个亲本复制,其余是从第二个亲本复制。

父母1 =染色体和父母2 =印度。

我正在把父母变成孩子在原地。

我现在也需要做一个两点交叉,但有一些麻烦,这是我迄今为止,但我相信代码的下半部分做一个点交叉,而不是交换中间部分。

 public void twoPointCrossover(Individual indi) { 
     if (SGA.rand.nextDouble() < pc) { 

      int xoverpoint = SGA.rand.nextInt(length); 
      int xoverpoint2 = SGA.rand.nextInt(length); 



      int tmp; 

      if (xoverpoint > xoverpoint2){ 
       tmp = xoverpoint; 
       xoverpoint = xoverpoint2; 
       xoverpoint2 = tmp; 
      } 

      for (int i=xoverpoint; i<xoverpoint2; i++){ 
       tmp = chromosome[i]; 
       chromosome[i] = indi.chromosome[i]; 
       indi.chromosome[i] = tmp; 
      } 
     } 
    } 
} 

这似乎不正确,任何帮助将不胜感激!谢谢!

+0

你期待什么发生?这不是一个完整的例子,所以你得到的任何帮助都可能是猜测。 – birryree 2012-02-16 14:29:20

+0

你为什么认为这看起来不正确?你到底在想什么? – npinti 2012-02-16 14:29:22

+0

我所做的只是将中间部分添加到原始的一点交叉处,其余部分是相同的。它不会给出任何错误,但我不认为它正在进行两点交叉? – Student 2012-02-16 14:41:43

回答

1

您应该在循环中检查i < (or <=) xoverpoint2而不是i<length

+0

这就是发生了什么 - 选择了两个交叉点,从染色体开始到第一个交叉点的二进制串从一个父节点复制而来,从第一个到第二个交叉点的部分从第二个父节点复制而来,休息是从第一个父母复制的。我的第一个父母是染色体,第二个父母是染色体。我不应该分配xoverpoint2 = j?然后像chromosom [j]等使用它? – Student 2012-02-16 14:39:15

+0

这样做更有意义。所以,我相信你会把你的父母变成就地的孩子,然后我的解决方案应该像预期的那样工作:你交换两条染色体的中间部分,这基本上是你想要做的。 – 2012-02-16 14:55:04

+0

是的,我已经在上面添加了您的解决方案,但我相信我仍在执行单点交叉,因为结果与单点交叉完全相同。是的,这正是我想要做的交换中间部分,但我不知道该怎么做。 – Student 2012-02-16 15:00:40